前言:为什么需要内网穿透?在公网中需要访问自己的设备,却发现家用宽带是一个大的局域网里公用一个公网ip。在以前办理宽带有时公网ip业务也顺带办理了,有公网ip的用户只需要在路由器里开放端口或者开dmz主机,外网的用户就可以访问了。比如SSH、远程桌面、网站、Samba、FTP等文件服务、甚至架设一个最近爆火的幻兽帕鲁服务器。没有公网ip架设的以上这些服务就只能在局域网里运行了。

Frp是什么

frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。 终上所述,只需要拥有公网ip的家宽或者一台有公网ip的云服务器,那么在你的允许下任意设备都可以暴露在公网中。

准备工作

  1. 安装frp 你可以在github的Release的页面中下载最新客户端和服务器二进制文件。有能力的可以修改源代码并编译成自己所需功能的版本。frp:Release,最好的例子就是樱花frp:Sakura frp,这是一个免费的Frp,免费两个端口,但是人多时速度很慢。 单击show all里windows的版本的frp。
  2. 樱花穿透 mysql_windows

  3. 有公网ip的设备 如果你是家宽且有公网ip,我建议你购买一块香橙派作为服务器,板子功耗5w不到。如果你没有公网ip,那么我建议你去阿里云免费试用ecs云服务器,时长3个月,还是百兆网。步骤:打开阿里云官网,右上角产品->精选产品:云服务器ecs,按照提示步骤即可。 以上设备linux、windows系统都可部署。
  4. 被访问的设备 就是需要架设服务的客服端啦。

配置

服务器我是windows,客服端ubuntu20.04 arm64架构的。基本命令和配置都是一致的。所以我准备了如下图中的文件。该资源本文章已提供。

樱花穿透 mysql_服务器_02

查看自己处理器架构

windows就选择windows_amd64,应该是只支持64位PC处理器了。

linux里输入uname -a看处理器架构,aarch64就用arm64

樱花穿透 mysql_后端_03

解压文件

  1. windows windows中解压文件方式:下载对应的压缩软件,比如zip、rar、360压缩等。服务器中我用的系统自带的,双击打开将其文件复制到C:\frp下。
  2. linux中需要使用命令解压,后面的是文件名,不同架构的文件名也是不同的。最好将文件释放在常用的文件夹中,后面会制作为系统服务启动。
tar -xzvf frp_0.53.2_linux_arm64.tar.gz

开始使用

编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。 解压完成后进入frp文件目录中,目录中有frps、frpc、frps.toml、frpc.toml

在服务器中我们只用关心两个文件,他们的配置文件多端通用。

[windows]
frps.exe
frps.toml
[linux]
frps
frps.toml

客户端的如下

[windows]
frpc.exe
frpc.toml
[linux]
frpc
frpc.toml
编写配置文件

完整的配置文件示例 完整配置,我们只需要用到部分就可以运行了。 当然最新的官网链接也贴出:参考 | frp

  1. 先从服务器开始 设置服务端口[bindPort],客户端需要连接此端口建立连接。 然后设置服务端仪表板端口,这样就可以在网页里查看frp连接状态了。后面的user和password对应的是网页后台登陆账户和密码。 设置token,客户端的token需要和服务器的一致才能构建连接,不然服务器是拒绝接入的。log配置时其状态信息输出在同一目录下的frps.log文件中,将其注释后,服务的输出会打印在控制台中。
bindPort = 7000
webServer.port = 7500
webServer.addr = "0.0.0.0"
webServer.user = "admin"
webServer.password = "admin"

#vhostHTTPPort = 80
#vhostHTTPSPort = 3002
log.to = "./frps.log"
log.level = "info"
log.maxDays = 3


auth.method = "token"
auth.token = "your token"
  1. 设置客户端serverAddr这里要填写你服务器的ip或者你的公网ip。serverPort端口和服务器设置的端口一致。token和服务器的一致。webServer是设置本地的仪表盘,设置好其地址、端口和user、password后,在浏览器里输入 地址:端口就可以访问了。该仪表盘很实用,可以很清楚的知道端口的运行状态,和问题提示。loginFailExit登陆失败会退出,设置为falsh可以让其一直重连。 [[proxies]]就是设置代理了,在 完整配置 和 参考 | frp连接中已经有提示。name是可以随意设置的。localPort是本地端口,比如你的ssh是22,你就填写22.remotePort是远程上的端口,如果该端口没有被占用你才可以填写,这个端口也是访问的端口。比如设置为11055,那么你在连接ssh时,需要输入 服务器ip:11055才可以连接到客户机的ssh的22端口上建立连接。 在这里就简单示范将本地的7400端口上的仪表盘暴露在公网里。 linux的ssh也暴露到公网里提供外部连接。
serverAddr = "0.0.0.0"
serverPort = 7000
auth.method = "token"
auth.token = "your token"
webServer.addr = "192.168.1.8"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
loginFailExit = false
[[proxies]]
name = "frp_ui"
type = "tcp"
localIP = "192.168.1.8"
localPort = 7400
remotePort = 7400

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "192.168.1.8"
localPort = 22
remotePort = 11055

补充:在windows的cmd控制台里输入ipconfig查看本机ip地址,配置文件中的webServer.addr、localIP,需要设置为此ip,设置不正确就会无法访问到正确的地址上。不懂的也可以写127.0.0.1也可以,指向本机。 linux中输入ifconfig来查询本机ip地址。

启动
  1. 进入frp的目录中,输入命令cd 目录。该命令windows、linux通用。
服务器的启动方式
[windows]
frps.exe -c frps.toml
[linux]
./frps -c frps.toml
客户端的启动方式
[windows]
frpc.exe -c frpc.toml
[linux]
./frpc -c frpc.toml
  1. 启动结果 将服务端log参数注释后,服务器启动成功的控制台输出如下图,因为我服务器是windows,就展现windows的启动成功的输出了。 客服端的启动输出,客户端是linux arm64,我也只贴linux的成功结果了。 以上的输出结果不能完全相同,不同的设置其输出结果都是不同的。在访问客户端上的服务时只需输入服务器ip:端口
补充
端口设置好后,家宽用户需要在路由器里进行端口映射或者dmz主机。dmz主机不推荐,dmz是将主机完全暴露。
阿里云ecs服务器需要在网络与安全区中的安全组里设置管理规则,将入方向的端口添加才可以,我为了图省事,将全端口开放了。

樱花穿透 mysql_樱花穿透 mysql_04

樱花穿透 mysql_樱花穿透 mysql_05

设置服务并随开机启动

服务器因为不关机,所以没弄。用linux的可以作为参考,frps和frpc都是通用的。

  1. 首先编写service文件。 先输入 vim myfrpc.service 然后输入下述内容,将ExecStart的/home/orangepi/software/myfrp/frpc修改为frpc或frps所在目录 /home/orangepi/software/myFrp/frpc.toml 修改为frpc.toml或frps.toml所在位置
[Unit]
Description=myFrp Service
After=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=60s
ExecStart=/home/orangepi/software/myfrp/frpc -c /home/orangepi/software/myFrp/frpc.toml
[Install]
WantedBy=multi-user.target
  1. 将服务复制到/etc/systemd/system/目录中。 因为我们是使用systemctl来管理服务,复制到上诉目录即可,需要使用管理员权限。
sudo cp myfrpc.service /etc/systemd/system/
# 启动系统服务,系统启动时会启动这个服务
systemctl enable myfrpc.service
# 打开服务
systemctl start myfrpc.service
# 查看状态输出
systemctl status myfrpc.service
# 查询相关的服务的状态
systemctl list-units "*frp*"

使用

当服务器端和客户端都成功运行,访问客户端上的服务时,使用 服务器公网ip:remotePort 来构建连接。

比如连接ssh,假设你的服务器ip为0.0.0.0,你的localPort为22,remotePort为11055,在mobaXterm中连接信息这么设置。

樱花穿透 mysql_服务器_06

如果你是游戏服务器,则需要知道开放的端口,填写至localPort中,remotePort填写65535以内的端口,同样已占用的端口也不能设置。其他人就可以访问你的服务器了。

问题

遇到服务器和客户端都启动成功,但是外部无法访问,可以检查服务器的防火墙设置。关键字:允许应用或功能通过windows防火墙、高级安全Windows防火墙中的入站规则等。