很多人第一次听到 FRP,会把它简单理解成“内网穿透工具”。这个说法没错,但不够完整。更准确一点说,FRP 是一套轻量的反向代理与隧道工具,它能让没有公网 IP、藏在家宽、公司内网、NAT、路由器后面的服务,通过一台有公网 IP 的服务器对外提供访问入口。
如果你有 NAS、家里的 Linux 小主机、软路由、测试环境、临时 API、Webhook 回调地址,或者只是想从外面安全地 SSH 回家里的机器,FRP 都是那种装上以后会频繁用到的小工具。它不华丽,但很实用。
FRP 到底是什么?
FRP 的全称通常被理解为 Fast Reverse Proxy。它的核心逻辑很简单:在公网服务器上跑一个 frps 服务端,在内网机器上跑一个 frpc 客户端。因为内网机器通常不能被外部直接访问,所以由 frpc 主动连到公网服务器,然后 FRP 在这条连接上建立一条隧道,把外部访问转发回内网服务。
可以把它想成一条从内网主动打出去的“反向通道”:
访问者 -> 公网服务器 frps -> FRP 隧道 -> 内网机器 frpc -> 本地服务
这个结构解决的不是“把服务部署到公网服务器上”,而是“让公网服务器成为内网服务的入口”。所以它特别适合已有内网服务、但不想迁移部署位置的场景。
它能实现什么功能?
FRP 的能力不是只有端口转发,它更像一个轻量接入层。常见功能包括:
- TCP 转发:把内网 SSH、RDP、数据库、游戏服、管理面板等 TCP 服务映射到公网端口。
- UDP 转发:适合部分 UDP 服务,例如某些游戏、语音、特殊协议服务。
- HTTP/HTTPS 域名代理:把内网 Web 服务绑定到公网域名,例如
nas.example.com、dev.example.com。 - 私密访问:通过 STCP、SUDP 等方式,让服务不直接暴露公网端口,只允许指定访问端连接。
- Dashboard 管理:服务端可以开启 Web 面板,查看连接状态、代理数量、流量等信息。
- 多客户端接入:一台公网服务器可以接多台内网机器,每台机器各自暴露不同服务。
适合哪些使用场景?
1. 家庭 NAS、软路由、HomeLab 远程访问。 比如家里有群晖、飞牛、PVE、OpenWrt、Home Assistant,外出时想访问 Web 面板或 SSH 登录,不想折腾公网 IP,FRP 就很合适。
2. 本地开发调试。 做支付回调、GitHub Webhook、Telegram Bot、OAuth 登录、本地 API 调试时,第三方平台必须能访问你的回调地址。用 FRP 可以把本地开发端口临时挂到公网域名下。
3. 小团队内部系统。 一些轻量后台、测试环境、预览环境没有必要单独上云部署,可以留在内网,通过 FRP 暴露给指定人员访问。
4. 临时救急。 迁移服务器、排查故障、远程协助时,FRP 可以快速开一条通道,让你连到本来访问不到的机器。
5. IoT 和边缘设备。 设备在不同网络环境下,没有固定公网 IP,但需要统一接入和管理,FRP 这种主动连接模型就很适合。
FRP 不适合什么?
FRP 很好用,但不要把它当成万能公网网关。高并发生产业务、超大流量下载、长期暴露数据库端口、弱密码远程桌面,这些都不建议直接靠 FRP 裸奔。它适合做入口和隧道,但真正的安全控制仍然要靠强 Token、访问控制、防火墙、HTTPS、反向代理鉴权,以及服务自身的账号权限。
一句话:FRP 能让内网服务被访问,但不代表任何内网服务都应该被公网访问。
部署前准备
下面以 Linux amd64 为例。你需要准备两台机器:
- 公网服务器:有公网 IP,用来运行
frps。 - 内网机器:运行你真正的服务,用来运行
frpc。
本文按 2026 年 5 月 13 日 GitHub 最新发布版 v0.68.1 编写。新版 FRP 推荐使用 TOML、YAML、JSON 配置,下面示例统一使用 TOML。
第一步:在公网服务器安装 frps
cd /opt
VERSION=0.68.1
wget https://github.com/fatedier/frp/releases/download/v${VERSION}/frp_${VERSION}_linux_amd64.tar.gz
tar -zxvf frp_${VERSION}_linux_amd64.tar.gz
mv frp_${VERSION}_linux_amd64 frp
cd /opt/frp
创建服务端配置:
nano /opt/frp/frps.toml
写入:
bindPort = 7000
auth.method = "token"
auth.token = "换成一串足够长的随机密钥"
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "换成强密码"
这里的 bindPort 是 frpc 连接 frps 的控制端口。auth.token 必须服务端和客户端一致。Dashboard 端口 7500 可以用于查看状态,如果是公网服务器,建议用强密码,并限制访问来源。
第二步:把 frps 做成 systemd 服务
cat > /etc/systemd/system/frps.service <<'EOF'
[Unit]
Description=FRP Server
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now frps
systemctl status frps
同时记得在服务器防火墙和云厂商安全组里放行端口:
7000 # frpc 连接 frps
7500 # Dashboard,可选
6000 # 示例里的 SSH 映射端口
80/443 或 8080 # 如果要做 Web 服务映射
第三步:在内网机器安装 frpc
内网机器同样下载 FRP:
cd /opt
VERSION=0.68.1
wget https://github.com/fatedier/frp/releases/download/v${VERSION}/frp_${VERSION}_linux_amd64.tar.gz
tar -zxvf frp_${VERSION}_linux_amd64.tar.gz
mv frp_${VERSION}_linux_amd64 frp
cd /opt/frp
创建客户端配置:
nano /opt/frp/frpc.toml
先写一个 SSH 穿透示例:
serverAddr = "你的公网服务器IP"
serverPort = 7000
auth.method = "token"
auth.token = "和服务端一样的随机密钥"
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
启动客户端:
/opt/frp/frpc -c /opt/frp/frpc.toml
如果没有报错,你就可以在外部电脑上这样连回内网机器:
ssh -p 6000 用户名@你的公网服务器IP
注意,这里连接的是公网服务器 IP 和 6000 端口,但实际进入的是内网机器的 22 端口。
第四步:把 frpc 也做成 systemd 服务
cat > /etc/systemd/system/frpc.service <<'EOF'
[Unit]
Description=FRP Client
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now frpc
systemctl status frpc
第五步:映射一个内网网站
如果你要把内网 Web 服务挂到域名上,需要在 frps.toml 增加 HTTP 虚拟主机端口:
bindPort = 7000
vhostHTTPPort = 8080
auth.method = "token"
auth.token = "换成一串足够长的随机密钥"
然后在客户端 frpc.toml 增加 HTTP 代理:
serverAddr = "你的公网服务器IP"
serverPort = 7000
auth.method = "token"
auth.token = "和服务端一样的随机密钥"
[[proxies]]
name = "home-web"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["nas.example.com"]
把 nas.example.com 解析到公网服务器 IP。如果公网服务器 80 端口已经被 Nginx 占用,可以让 Nginx 反代到 127.0.0.1:8080;如果 80 端口空闲,也可以直接把 vhostHTTPPort 改为 80。
Nginx 反代到 FRP HTTP 入口示例
server {
listen 80;
server_name nas.example.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
}
这种方式的好处是公网服务器仍然由 Nginx 统一接入域名,FRP 只负责把请求转回内网服务。
排错思路
- 客户端连不上服务端:检查服务器安全组、防火墙、
bindPort、serverPort、Token 是否一致。 - 端口已经被占用:换一个
remotePort,或者检查服务器是否已有服务监听这个端口。 - HTTP 域名打不开:检查域名解析、Nginx 反代、
vhostHTTPPort、customDomains是否一致。 - 服务频繁断开:看日志,确认网络是否稳定,服务端和客户端版本尽量保持一致。
- 不知道错误在哪:用
journalctl -u frps -f和journalctl -u frpc -f分别看服务端、客户端实时日志。
安全建议
FRP 部署很快,但安全配置不能省:
- Token 使用足够长的随机字符串,不要用
123456、password这种弱口令。 - Dashboard 不建议裸露公网,至少要强密码,最好限制 IP 或通过反代加访问控制。
- SSH 建议关闭密码登录,使用密钥登录。
- 数据库、Redis、管理后台不要随便直接映射到公网。
- 能用域名和 HTTPS 的 Web 服务,尽量走 Nginx/Caddy 做统一入口和证书。
- 临时调试用的代理,用完就关,不要忘在公网。
结语
FRP 的价值在于“把入口问题解决掉”。它不替代云服务器,也不替代 VPN,更不替代完整的安全体系,但它能用非常低的成本,把那些原本只能在内网访问的服务,变成随时可用的公网入口。
对个人用户来说,它是 NAS、HomeLab、软路由的远程钥匙;对开发者来说,它是 Webhook、本地调试、临时预览的快捷通道;对小团队来说,它是把内部工具接出来的一层轻量网关。只要控制好权限和暴露范围,FRP 会是非常顺手的一件工具。