唠唠闲话
内网穿透简介
在互联网上,两个不同主机进行通信需要知道对方的 IP 地址。由于世界人口和设备众多,IPv4 资源相对紧缺,因此绝大部分情况下是通过路由器或交换机转换公网 IP 后才上网。
位于路由器或交换机后的设备通常是内网设备,其 IP 地址通常以 192.168、172.16 或 10.0 开头,这些属于内网 IP。如果要让内网设备对外提供服务,就需要进行内网穿透。
为什么需要内网穿透?
- 远程访问:在家里或出差时,想要访问公司或家庭网络中的文件、应用和服务。
- 开发和测试:开发人员需要在本地测试服务,并希望在公网环境中进行调试和展示。
- 安全需求:在确保安全的前提下,将内部服务暴露到公网进行访问,而不直接暴露内网设备。
- 物联网设备管理:对位于内网的物联网设备进行远程监控和管理。
常见的内网穿透工具包括 Ngrok、FRP 和 ZeroTier 等,本文将介绍 FRP 的使用方法。
相关阅读
利用frp工具实现内网穿透、随时随地访问内网服务
frp 内网穿透教程
内网穿透系列:ZeroTier技术初级
FRP 是什么
FRP 是一个专注于内网穿透的高性能反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。它可以将内网服务通过具有公网 IP 的节点以安全、便捷的方式暴露到公网。
基本原理
如上图所示:
- 在带有公网 IP 的云服务器上部署 FRP 的服务端 frps
- 在需要穿透的内网服务器上部署 FRP 的客户端 frpc
- 每个客户端都有一个配置文件用于与服务器连接
- 公网服务器充当代理服务器,当用户访问 公网 IP + 端口号时,公网服务器上的 frps 服务会根据端口号,自动转发到对应的内网服务器上,从而实现对内网服务的访问
下边通过实践,对这些概念做更具体的理解认识。
FRP 配置及使用
本教程使用的是 v0.52.3
版本,配置文件格式为 .toml
,旧版本比如 0.49.0
使用的是 .ini
格式。
下载 FRP
访问 FRP 的 发行页面,根据您的系统选择合适的版本进行下载:
一般情况下,Linux 系统使用的是 AMD 架构。如果不确定,可以通过输入 arch
命令查看。如果返回值是 x86_64
,则说明是 AMD 架构。
使用命令行下载:
wget -c https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -zxvf frp_0.52.3_linux_amd64.tar.gz && rm frp_0.52.3_linux_amd64.tar.gz
文件结构如下:
.
├── frpc
├── frpc.toml
├── frps
├── frps.toml
└── LICENSE
将服务端和客户端文件分开,以便管理:
cd frp_0.52.3_linux_amd64
mkdir client server
mv frpc* client
mv frps* server
将 server
文件夹放在公网服务器上,将 client
文件夹放在内网服务器上。
配置服务端
以下是一个简单的配置文件示例,参数说明见注释。完整的配置文件请参考 frps_full_example:
bindAddr = "0.0.0.0"
bindPort = 7000
# 监控流量页面
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "username"
webServer.password = "password"# 授权码
auth.method = "token"
auth.token = "yourtoken"# 去除访问限速
transport.tcpMux = false# FRP 日志配置
log.to = "/home/user/software/frp/frps.log"
log.level = "info"
log.maxDays = 3
这里有几个参数需要根据具体需求进行手动修改:
bindPort
:FRP 服务端监听的端口,即服务入口,建议自定义。auth.token
:授权码,这个授权码也会在客户端配置中使用。webServer.port
:监控流量页面的端口,建议自定义。webServer.user
:监控流量页面的用户名。webServer.password
:监控流量页面的密码。log.to
:日志文件路径,根据需要修改。
其中,auth.token
可以通过 pwgen -s 32 1
生成,这是连接服务使用的密钥,为了安全起见,务必进行修改。
服务端自启动
将 server
目录上传到公网服务器,并创建 frps.service
文件:
cd /lib/systemd/system
sudo vim frps.service
内容如下:
[Unit]
Description=FRPS Service
After=network.target syslog.target
Wants=network.target[Service]
Type=simple
ExecStart=/home/user/software/frp/frps -c /home/user/software/frp/frps.toml
Restart=always
RestartSec=15s[Install]
WantedBy=multi-user.target
请根据实际路径填写 ExecStart
中 FRPS 的可执行文件路径和配置文件路径。
编写完成后,执行以下命令以启用和启动服务:
sudo systemctl enable frps
sudo systemctl start frps
如果之后更改了配置文件,执行以下命令重启服务:
sudo systemctl daemon-reload
sudo systemctl restart frps
通常,可以通过以下命令查看服务状态:
sudo systemctl status frps # 查看服务状态
客户端配置
将 client
目录上传到内网服务器,并编辑 frpc.toml
文件,示例如下,参数见注释。
serverAddr = "公网IP地址"
serverPort = 7000# 监控流量页面
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "username"
webServer.password = "password"# 授权码
auth.method = "token"
auth.token = "yourtoken"# 设置心跳
auth.additionalScopes = ["HeartBeats"]# 去除访问限速
transport.tcpMux = false# FRP 日志配置
log.to = "/home/user/software/frp/frpc.log"
log.level = "info"
log.maxDays = 3
其中 serverAddr
为公网服务器的 IP 地址,其他内容与服务端配置文件保持一致。如果需要添加服务(如 SSH 穿透),在 frpc.toml
中添加相应的 proxies
字段,例如:
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222
客户端自启动
客户端自启动的配置类似于服务端,创建 frpc.service
文件:
cd /lib/systemd/system
sudo vim frpc.service
内容如下:
[Unit]
Description=FRPC Service
After=network.target syslog.target
Wants=network.target[Service]
Type=simple
ExecStart=/home/user/software/frp/frpc -c /home/user/software/frp/frpc.toml
Restart=always
RestartSec=15s[Install]
WantedBy=multi-user.target
根据实际路径填写 ExecStart
中 FRPC 的可执行文件路径和配置文件路径。
后续命令类似:
# 启用和启动服务
sudo systemctl enable frpc
sudo systemctl start frpc
# 更改配置文件后重启服务
sudo systemctl daemon-reload
sudo systemctl restart frpc
# 查看服务状态
sudo systemctl status frpc
监控设置
默认情况下,可以通过 IP + 端口访问监控页面。如果有域名,可以在 Nginx 中添加如下配置:
server {listen 80;server_name your_domain;location / {proxy_pass http://localhost:7500;}
}
其中 your_domain
为你的域名,7500
为服务端配置文件中的 webServer.port
端口。
心跳设置
如果不设置心跳,FRP 创建的连接在长时间不活动后可能会断开,并且重新连接可能需要多次尝试才能成功。为了避免这种情况,可以在服务端设置一个定时任务,保持连接的活跃性。
在服务端输入 crontab -e
,添加以下定时任务:
* * * * * curl localhost:8080 --max-time 5 >/dev/null 2>&1
该任务每分钟发送一个 curl 请求,访问服务器的 8080
端口,而该端口通过 FRP 穿透到内网服务。这样每分钟都会发送一次心跳请求,保持连接不断开。
在客户端的 frpc.toml
文件中,添加相应的 proxies
配置:
[[proxies]]
name = "heartbeat"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080
这样配置后,FRP 客户端将内网的 80
端口映射到公网的 8080
端口,使定时任务可以保持连接的活跃性,避免连接断开。
总结
最后做个小结。教程详细介绍了如何使用 FRP 实现内网穿透,内容包括以下几个方面:
- 下载与安装:如何根据系统选择合适的 FRP 版本并进行下载和安装。
- 配置服务端:如何编写和优化 FRP 服务端配置文件,以及在系统中设置自启动服务。
- 配置客户端:如何编写 FRP 客户端配置文件,添加所需的服务映射,并设置客户端自启动。
- 监控设置:如何通过 Nginx 配置使用域名访问 FRP 监控页面,方便管理和查看流量信息。
- 心跳设置:如何通过定时任务和配置文件设置,确保 FRP 连接的稳定性,避免长时间不活动导致的连接断开。
如有任何问题,欢迎参考 FRP 的官方文档或相关社区资源进行深入了解。