FRP内网穿透,透传客户端IP

早期使用内网穿透的时候,FRP、NPS、Ngrok都不支持proxy-protocol 代理协议的。

由于NPS有个管理页面,所以选择了NPS + Haproxy的方式进行透传。

最近请求数量有点大,NPS长时间运行,并且大量请求会出现以下错误:

2025/02/19 16:14:45.433 [W] [base.go:90]  get connection from client id 3  error create connection fail,the server refused the connection
2025/02/19 16:14:45.433 [W] [base.go:90]  get connection from client id 3  error create connection fail,the server refused the connection
2025/02/19 16:14:45.689 [W] [base.go:90]  get connection from client id 3  error create connection fail,the server refused the connection

如某个程序持续把云服务器的带宽占满了,那么NPS后续发出的连接很容易出现该问题,也就是数据传输和连接建立的策略算法不是很好,重启一下NPS就好了。 或者避免带宽被占满。

然后去GitHub 查看 NPS的手册,发现NPS好几年未更新了。

又重新用回了FRP,然后发现FRP新版本,已经支持proxy-protocol 代理协议了,这样仅使用FRP就可以实现透传客户端IP的功能了。 不再需要haproxy了。

当带宽耗尽时,FRP也有上面的问题,但感觉比NPS的延迟要小很多。 

 

由于我仅需要TCP的方式,我的具体配置如下:

FRPS 服务端配置:

bindAddr = "0.0.0.0"
bindPort = 7000

# 管理页面可选
webServer.addr = "0.0.0.0"
webServer.port = 5000
webServer.user = "我的登录用户名"
webServer.password = "我的登录密码"

# 日志文件
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 30


auth.method = "token"
auth.token = "我的token"

transport.maxPoolCount = 1000

 

FRPC 客户端配置如下:

serverAddr = "59.110.93.94"
serverPort = 7000

# 管理页面可选
webServer.addr = "192.168.1.8"
webServer.port = 6101
webServer.user = "我的用户名"
webServer.password = "我的密码"

# 日志文件
log.to = "/var/log/frpc.log"
log.level = "info"
log.maxDays = 30


auth.method = "token"
auth.token = "我的token"

[[proxies]]
name = "web-http"
type = "tcp"
remotePort = 80
localPort = 6001
localIP = "::1"
transport.proxyProtocolVersion = "v2"       // 添加此行,即可实现透传客户端IP

[[proxies]]
name = "web-https"
type = "tcp"
remotePort = 443
localPort = 6002
localIP = "::1"    // 我这里用的IPv6,默认127.0.0.1
transport.proxyProtocolVersion = "v2"

 

至此配置完成,停掉haproxy 和 nps的服务,启动frp的服务端和客户端即可。

 

最后附加FRP 作为服务运行的脚本文件(服务端和客户端一样、把frpc 改为 frps即可):

创建frpc service文件:  /etc/systemd/system/frpc.service

文件内容如下:

# frpc.service
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#Restart=always
Restart=on-failure
RestartSec=5s
#启动服务的命令;  需要改为自己frp的路径
ExecStart=/home/frp_0.61.1_linux_amd64/frpc -c /home/frp_0.61.1_linux_amd64/frpc.toml
[Install]
WantedBy=multi-user.target

 

然后配置开机启动,并启动frp服务:

sudo systemctl enable frpc.service      // 开机启动
sudo systemctl start frpc.service         //  启动服务
sudo systemctl status frpc.service
sudo systemctl stop frpc.service

 

B站备份: https://www.bilibili.com/opus/1035873359380873216

评论列表: