frp内网穿透

内网穿透

本地电脑上起了服务,其他人是访问不到的,借助服务器的公网IP,服务端帮助转发消息,其他人才能访问到本地电脑上的服务。

具体可以用来做什么

1、本地计算机上启动 web 服务,通过端口映射,别人通过公网和端口就能访问。

2、Windows 远程桌面连接,比如,从住的地方连接公司的电脑。

3、SSH 远程连接到开发板内的 linux 系统。

向日葵的免费账户的带宽有限

我有1台腾讯的轻量云服务器

服务端

服务端下载 frps

下载frp软件:https://github.com/fatedier/frp

服务端下载安装

比如

在 /opt/目录下

cd /opt/

下载64位0.44版本的,arm服务器要选arm版本,现在常见服务器都是amd64架构的,也就是x86的64位指令集架构。

wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz

服务端配置 frps

解压

tar -zxvf frp_0.44.0_linux_amd64.tar.gz

重命名,为了后面配置路径简单

mv frp_0.44.0_linux_amd64 frp

配置文件,服务端 frps 的 s 即 server,frpc 的 c 即 client。

vi  frps.ini

frps.ini 文件内容,默认即可

[common]
bind_port = 7000

也可以设置token,相当于设置了一个密码,例如

[common]
bind_port = 7000
token = abc123

服务端防火墙,放行端口7000、7001、6000、8080等需要的端口

启动服务端

正常启动

./frps -c ./frps.ini

服务端设置程序开机启动

在frps.service里写入内容,有时候会提示system目录不存在,那就先建目录

mkdir /usr/lib/systemd/system/
vi /usr/lib/systemd/system/frps.service

frps.service 内容

[Unit]
Description=frps service
After=network.target

[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.ini

[Install]
WantedBy=multi-user.target

配置生效,启动,设置开机启动

systemctl daemon-reload
systemctl start frps
systemctl enable frps

查看状态

systemctl status frps

客户端

windows 客户端配置 frpc

Windows10 当然是amd64位架构的 frp_0.44.0_windows_amd64.zip

比如想在家远程公司电脑,在公司电脑上安装设置 frpc。

我喜欢在 C 盘下建一个sw的文件夹来存自己安装的程序,sw 即 software 的意思。

解压到 C:\sw\目录下,也就是现在 frp 目录是 C:\sw\frp

修改 frp 客户端的配置文件frpc.ini

[common]
server_addr = 127.0.0.1
server_port = 7000

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001

修改第一句 server_addr127.0.0.1为云服务器的 IP 地址

如果服务端配置了 token,那客户端也要配置。

windows一般也不用ssh,删除内容,增加远程桌面的协议 rdp 的设置

即现在是

[common]
server_addr = 云服务器地址
server_port = 7000
token = abc123

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001

“server_addr”是服务端 IP 地址,填入即可,

“server_port”为服务器端口,即 bind_port 的值,

“token”是你在服务器上设置的连接口令。

这里用到了 2 个自定义规则,一个是 rdp,一个是 smb:

🍑RDP,即 Remote Desktop 远程桌面,Windows 的 RDP 默认端口是 3389,协议为 TCP,本条规则可以实现远程桌面连接。

🍑SMB,即 Windows 文件共享所使用的协议,默认端口号 445,协议 TCP,本条规则可实现远程文件访问。

在 window10 上启动 frpc 程序

打开 cmd 程序,比如 win + R,输入 cmd,我一般按 win 键,输入 cmd,右键“以管理员身份运行”

切换到 frpc 的目录

cd C:\sw\frp
frpc.exe -c frpc.ini

就启动了

win10 启动远程桌面:【设置】,【系统】,【远程桌面】,启动远程桌面

Windows 远程连接:

按 win 键,输入“远程桌面连接”

计算机:服务端公网IP地址:7001

用户名和密码,是 window 电脑的用户名和密码。

当然也可以把本地 web 服务通过云服务器访问

增加 web 配置即可

[web]
type = tcp
local_ip = 127.0.0.1
local_port = 本地端口
remote_port = 映射到的服务器端口

现在完整的配置如下

[common]
server_addr = 云服务器地址
server_port = 7000
token = abc123

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001

[web]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 9090

windows 客户端设置程序开机启动

需要一个软件 winsw

https://github.com/winsw/winsw

Windows 服务包装器,WinSW 将任何应用程序作为一个 Windows 服务进行包装和管理。

WinSW 3可以在安装了 .NET Framework 4.6.1 或更高版本的Windows平台上运行。

对于没有 .NET 框架的系统,该项目提供基于 .NET 核心的本地64位和32位可执行文件。

因为 win10 自带 .net 运行环境

所以下载 WinSW.NET461.exe

配置文件

WinSW.NET461.xml

<service>
  
  <!-- 服务ID,整个 window 系统中唯一-->
  <id>frpc</id>
  <!-- 服务的显示名字 -->
  <name>frpc</name>
  <!-- 服务描述 -->
  <description>FRP 客户端,用来实现内网穿透</description>
  
  <!-- Path to the executable, which should be started -->
  <!-- 想要启动的可执行程序的路径 -->
  <executable>C:\SW\frp\frpc.exe</executable>
  <!-- 携带的参数 -->
  <arguments>-c C:\SW\frp\frpc.ini</arguments>
  
  <!-- 第一次启动失败 60秒重启 -->
  <onfailure action="restart" delay="60 sec"/>
  <!-- 第二次启动失败 120秒后重启 -->
  <onfailure action="restart" delay="120 sec"/>
  <!-- 日志模式 -->
  <logmode>append</logmode>
  <!-- 指定日志文件目录(相对于WinSW.exe配置的路径) -->
  <logpath>C:\SW\frp\log</logpath>

</service>

将 exe 和 xml 文件放到同一个文件夹下

命令行运行,使用 winsw.exe

// 安装服务
winsw.exe install

// 卸载服务
winsw.exe uninstall

// 启动服务
winsw.exe start

// 停止服务
winsw.exe stop

// 重启服务
winsw.exe restart

// 查看状态
winsw.exe status

命令行运行,使用 WinSW.NET461.exe

// 安装服务
WinSW.NET461.exe install

// 卸载服务
WinSW.NET461.exe uninstall

// 启动服务
WinSW.NET461.exe start

// 停止服务
WinSW.NET461.exe stop

// 重启服务
WinSW.NET461.exe restart

// 查看状态
WinSW.NET461.exe status

按 win 键,输入“服务”,找到 frpc 服务,第一次要手动启动

启动失败,就去看看 frpc 的配置文件 frpc.ini 内容是否不匹配。

linux 客户端配置 frpc

注意版本

开发板一般是arm架构系统32/64位的linux系统,frp_0.44.0_linux_arm.tar.gzfrp_0.44.0_linux_arm64.tar.gz

比如

在 /opt/目录下

cd /opt/

下载

wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_arm.tar.gz

解压

tar -zxvf frp_0.44.0_linux_arm.tar.gz

重命名,为了后面配置路径简单

mv frp_0.44.0_linux_arm frp

配置文件

修改配置文件 frpc.ini

[common]
server_addr = 服务端公网IP地址
server_port = 7000
token = abc123

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

运行客户端程序

./frpc -c ./frpc.ini

如果还有开发板客户端要连接,也就是服务端要用不同的端口帮忙转发,一个客户端用一个端口,比如新增加的开发板用 6001 端口,注意段端放开 6001 端口。

linux 客户端设置程序开机启动

为 frpc 配置 systemd 的service文件,有时候会提示system目录不存在,那就先建目录

mkdir /usr/lib/systemd/system/
vi /usr/lib/systemd/system/frpc.service

frpc.service 文件内容

[Unit]
Description=frpc
Wants=network-online.target
After=network.target network-online.target
Requires=network-online.target

[Service]
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

解释一下上面文件内容

  • Wants:本单元启动了,它“想要”的单元也会被启动。但是这个单元若启动不成功,对本单元没有影响。
  • Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制启动顺序,因为它“需要”的单元启动也需要时间,若它“需要”的单元启动还未完成,就开始启动本单元,则本单元也无法启动,所以不建议使用这个字段。
  • OnFailure:若本单元启动失败了,那么启动这个单元作为折衷。
  • Before/After:指定启动顺序。
Wants=network-online.target #其中network.target代表有网路,network-online.target代表一个连通着的网络。

ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini #是要运行的命令,文件要绝对地址。

Restart=always #总是重启
RestartSec=5 #自动重启当前服务间隔的秒数
StartLimitInterval=0 #无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启

使frpc服务生效

systemctl daemon-reload
systemctl enable frpc
systemctl start frpc

查看状态

systemctl status frpc

远程 SSH 连接开发板就是:

使用SSH工具登录

  • 用户名,密码:就是开发板上的用户名和密码
  • IP地址:公网IP
  • 端口:6000

frp配置http

type = tcp 的配置

服务端不修改

客户端增加

frpc.ini

[common]
server_addr = 49.235.114.132
server_port = 7000
token = abc123

[web]
type = tcp
local_ip = 127.0.0.1
local_port = 48080
remote_port = 8080

type = http 的配置

服务端配置

frps.ini

[common]
bind_port = 7000
token = abc123
vhost_http_port = 8080

客户端配置

frpc.ini

[common]
server_addr = 49.235.114.132
server_port = 7000
token = abc123

[web]
type = http
local_port = 48080
local_ip = 127.0.0.1