随着全球 IPv4 地址资源的进一步枯竭以及联网设备数量不断增长,越来越多的运营商在给用户分配 IP 地址时,不再直接提供公网 IPv4,而是使用运营商级 NAT 等方式提供内网地址。
如果希望从公网直接访问内网设备,通常需要额外的公网地址或者其它网络穿透方案,而向运营商申请固定公网 IP 往往成本较高,因此内网穿透技术逐渐得到广泛应用。
现在市面上有很多内网穿透软件和服务,包括花生壳、Ngrok 等。本文主要介绍使用 FRP 进行内网穿透。
前期准备
首先需要准备两台设备:
- 一台拥有公网 IP 的服务器:Windows 或 Linux 均可。国内可以购买云服务器。这台服务器主要负责接收公网请求并进行流量转发,因此通常不需要太高的配置。如果对速度有要求,可以选择带宽较大的服务器或者按流量计费的方案。
- 一台内网服务器:Windows 或 Linux 均可。如果设备需要长期运行,可以考虑使用树莓派等低功耗设备。
FRP工作模式
FRP 包含服务端和客户端两个部分。
服务端程序 frps 安装在拥有公网 IP 的服务器上,负责接收外部请求;客户端程序 frpc 安装在内网设备上,负责连接 FRP 服务端,并将公网请求转发到内网指定的服务。
整个过程可以简单理解为:
公网用户
↓
公网服务器 frps
↓
FRP 隧道
↓
内网服务器 frpc
↓
本地服务
开始配置
首先根据操作系统,从 FRP 官方 Release 页面下载对应版本:
https://github.com/fatedier/frp/releases
下载完成之后,分别把 FRP 程序放到公网服务器和内网服务器上。
安装包中主要包含两个程序:
frps / frps.exe 服务端
frpc / frpc.exe 客户端
分别将它们放到公网服务器和内网服务器上。
配置服务器
编辑服务器端配置文件 frps.ini:
# 服务端配置
[common]
# 服务端监听地址
bind_addr = 0.0.0.0
bind_port = 7000
# 客户端与服务端通信口令
auth_token = 12345
# UDP 监听端口,可选
bind_udp_port = 7001
# HTTP 管理面板,可选
# 如果开启,不要使用弱密码
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 日志配置
log_file = ./frps.log
log_level = info
log_max_days = 3
# 允许服务端监听的端口范围
allow_ports = 80,2000-3000,3001,3003,4000-50000
# 每个客户端允许使用的远程端口数量
max_ports_per_client = 0
# TCP 多路复用
tcp_mux = true
配置完成后,可以直接运行:
./frps -c ./frps.ini
如果服务端正常启动,就会开始监听 7000 端口,等待客户端连接。
需要注意的是,7000、7500 以及后续实际使用的远程端口,都需要在服务器防火墙和云服务商安全组中放行。
配置客户端
然后配置内网服务器上的 frpc.ini:
[common]
# 服务端地址、端口和认证口令
server_addr = 你的公网服务器IP
server_port = 7000
auth_token = 12345
# 开始配置服务
[server1]
# 服务类型
type = tcp
# 本地服务地址
local_ip = 127.0.0.1
# 本地服务端口
local_port = 1234
# 公网服务器映射端口
remote_port = 2000
这里假设内网服务器上的某个服务运行在 127.0.0.1:1234。
配置完成后运行:
./frpc -c ./frpc.ini
客户端会主动连接公网服务器,然后将配置发送给 frps。
之后,当公网用户访问:
公网服务器IP:2000
请求就会通过 FRP 隧道转发到:
127.0.0.1:1234
这样就实现了最基本的内网穿透和端口转发。
整个过程可以理解为:
用户访问
公网服务器:2000
↓
frps
↓
FRP 隧道
↓
frpc
↓
内网服务器:1234
其它配置
FRP 不仅支持 TCP,还支持 UDP、HTTP、HTTPS 等类型的代理,可以根据实际需求配置不同的服务。
例如,type = tcp 适合普通 TCP 服务;如果希望把一个 Web 服务暴露到公网,也可以根据 FRP 的版本和配置方式使用 HTTP/HTTPS 代理。
FRP 的一个重要特点就是:内网客户端只需要主动连接公网服务器,因此不要求公网服务器能够主动连接内网设备。
这也是它能够在 NAT 和防火墙环境下工作的原因。
注意事项
- 某些运营商或网络环境可能会限制特定端口的使用,因此实际部署时需要根据当地网络情况选择端口。
- 如果你的宽带已经提供可直接使用的 IPv6,并且访问方也具备 IPv6 能力,那么很多情况下可以直接使用 IPv6,而不需要额外进行内网穿透。
- FRP 本身只是网络转发工具,实际暴露到公网的服务需要做好认证、访问控制和安全防护。
- 请勿将内网穿透用于违反法律法规或网络服务商规定的用途。
从原理上看,FRP 做的事情其实并不复杂:公网服务器负责提供一个外部可访问的入口,内网客户端主动建立一条长期连接,公网请求再通过这条连接转发到内网服务。
网络配置
评论0
欢迎分享你的看法,也欢迎补充不同的实践经验。