1.背景
我有许多内网穿透的场景,大多数都使用zerotier或者tailscale等虚拟局域网(vpn设备)来进行穿透,有好处也有坏处,好处是所有的设备都在一个局域网中,坏处是要手动nginx的stream映射到公网中,而且当所处网络环境不好或者网络十分不稳定等情况,虚拟局域网的方案大概率没法快速打通直连,而且会发生丢包等一系列难以使用的情况。基于以上种种情况,frp出现了,frp 非常适合对外暴露内网的远程22端口。
2.什么是frp?以及frp的原理
FRP 是一个基于 TCP 的“反向代理 / 端口转发工具”,用于把内网服务稳定地暴露到公网。
原理图如下:
[ 内网机器 A ] --(frpc)--> [ 公网服务器 ] <--(访问)-- [ 外部机器 B ]可以看到frp的通信顺序,由内网机器主动访问公网服务器,然后将服务暴露在公网服务器的某一个端口中,这样就可以绕过内网机器的服务被nat挡住的困境。
frp的核心思想,既然外部访问无法主动找到我的内网服务,那么我的内网服务就全部使用出的方案,主动和具有公网的机器进行沟通,就像是一只苍蝇一直和公网机器说:有服务通过你请求我吗?
平常公网机器的回答都是否,但是一旦真的有请求,那么就会回答是然后回复请求内容给内网机器。
在这过程中,内网机器就像是金枪鱼,必须一直不停的游动(和公网机器进行沟通),不能停下。
为什么内网机器必须不停的主动询问公网机器呢?原因就是nat的规则,nat普遍只接受自己发送的请求的回包,一旦停止访问,公网机器转发外部服务的回包就不能进来了。
所以frp的可靠性很高,毕竟所有机器对一台公网服务器的访问能力都不会太差的。
3.具体如何使用frp?
本节按照真实部署顺序说明 FRP 的使用方式,从环境准备到系统服务化,适合长期运行。
3.1 FRP 是什么(一句话定位)
FRP 是一个基于 TCP 的反向代理工具,用来把内网服务稳定暴露到公网。
核心思想只有一句话:
外部不能“入”,那就全部改成“内网主动出”。
3.2 整体架构说明
FRP 至少需要两台机器:
[ 内网机器 ] ── frpc ──▶ [ 公网 VPS ] ── frps ──▶ 外部访问者角色说明:
frps(服务端)
- 部署在有公网 IP 的 VPS
- 负责对外监听端口
frpc(客户端)
- 部署在内网环境(家里 / 公司)
- 主动与 frps 建立长连接
3.3 下载与安装 FRP(两端一致)
以 Linux amd64 为例:
wget 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解压后目录结构如下:
frps
frpc
frps.toml
frpc.toml⚠️ 注意事项:
- frps 与 frpc 版本必须完全一致
- 建议统一放在固定目录(如 /opt/frp_xxx)
3.4 服务端配置(VPS:frps)
3.4.1 编辑
frps.toml
bindPort = 7000
auth.method = "token"
auth.token = "替换为你自己的强随机字符串"参数说明:
bindPort
frpc 连接入口端口(不是业务端口)
auth.token
防止未授权客户端接入
3.4.2 手动启动测试
./frps -c frps.toml出现以下日志即表示启动成功:
frps started successfully3.4.3 放行防火墙与安全组端口(必须)
VPS 本机防火墙(如 ufw):
sudo ufw allow 7000/tcp
sudo ufw allow 11808/tcp # 示例业务端口云厂商安全组:
- 入方向放行 TCP 7000
- 入方向放行 TCP 11808(或你实际使用的端口)
3.5 客户端配置(内网:frpc)
3.5.1 编辑
frpc.toml
serverAddr = "VPS公网IP"
serverPort = 7000
auth.method = "token"
auth.token = "与frps保持一致"
[[proxies]]
name = "ssh-home"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 11808含义说明:
VPS:11808 → 内网机器:223.5.2 手动启动测试
./frpc -c frpc.toml成功标志:
login to server success
start proxy success3.5.3 外部连通性验证
在任意公网机器上执行:
ssh 用户名@VPS公网IP -p 11808能够登录内网机器即表示穿透成功。
3.6 将 frpc 设置为系统服务(开机自启)
生产环境禁止使用 nohup 启动
3.6.1 创建 systemd 服务文件(内网机器)
sudo nano /etc/systemd/system/frpc.service内容如下:
[Unit]
Description=FRP Client Service
After=network.target
Wants=network.target
[Service]
Type=simple
User=你的用户名
WorkingDirectory=/opt/frp_0.52.3_linux_amd64
ExecStart=/opt/frp_0.52.3_linux_amd64/frpc -c /opt/frp_0.52.3_linux_amd64/frpc.toml
Restart=always
RestartSec=5
LimitNOFILE=1048576
KillSignal=SIGTERM
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target3.6.2 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc检查状态:
systemctl status frpc3.7 将 frps 设置为系统服务(VPS)
3.7.1 创建 systemd 服务文件
sudo nano /etc/systemd/system/frps.service[Unit]
Description=FRP Server Service
After=network.target
Wants=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/frp_0.52.3_linux_amd64
ExecStart=/root/frp_0.52.3_linux_amd64/frps -c /root/frp_0.52.3_linux_amd64/frps.toml
Restart=always
RestartSec=5
LimitNOFILE=1048576
KillSignal=SIGTERM
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target3.7.2 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps3.8 最终验收流程(必须完成)
VPS 侧:
ss -lntp | grep 7000
ss -lntp | grep 11808内网机器:
systemctl status frpc重启测试:
sudo reboot重启后确认:
systemctl status frps
systemctl status frpc3.9 常见问题汇总(踩坑记录)
- 域名解析错误 → frps 日志无任何连接
- token 不一致 → EOF / session shutdown
- nohup 与 systemd 同时运行 → proxy already exists
- 云安全组未放行业务端口
- 使用 IPv6 但未放行 IPv6 防火墙规则

评论 (0)