凌晨你想改一下家里那台旧笔记本上跑的代码,人在公司,机器在路由器后面,没有公网 IP,端口映射做了也白做。运营商不给公网地址,这一关很多人直接卡死。frp 的做法很直接:找一台有公网 IP 的服务器当中转,内网机器主动连出去拉一条隧道,外面访问公网服务器的端口,流量原样转回家里。
项目名片
| 项目 | 内容 |
|---|---|
| 仓库 | fatedier/frp |
| star / fork | 110469 / 15303(2026-11-08 抓取) |
| 技术栈 | Go,单二进制,无依赖 |
| 许可证 | Apache-2.0 |
| 最新版本 | v0.72.0(2026-11-04 发布) |
| 最近提交 | 2026-11-05 |
| 常用端口 | 7000(客户端连服务端) |
它解决什么问题
现场痛点一句话:NAT 后面的机器,外面进不来。校园网、家宽、公司内网全是这种情况,你想远程连 SSH、看一眼家里的监控流、访问自己搭的笔记服务,都要先解决「入口在哪」。frp 替掉的是公网 IP 和路由器权限:不需要运营商配合,不需要在路由器上开映射,只要有一台便宜的云服务器。替不掉的也明确:中转服务器的带宽你得自己出,家里上传多少,公网侧就得能跑多少;另外它的定位是端口转发,不是组网,想让两台机器像在一个局域网里互 ping,该用 WireGuard 这类工具还是用那类工具。
核心机制
- frpc 跑在内网机器上,主动向公网的 frps 发起 TCP 连接(默认端口 7000),连接建好后一直保活,这条就是隧道。(推断:主动连出是为了绕开 NAT 对入站连接的限制,这正好符合 NAT 只放行出站流量的行为。)
- 用户访问 frps 上的 remotePort(比如 6000),frps 沿着隧道把流量转给 frpc,frpc 再转给配置里写的本地服务(README 的 SSH 示例是 127.0.0.1:22)。
- 除 TCP/UDP 外,还支持 HTTP 和 HTTPS 类型,可以按域名把不同内网站点复用到一个端口上,这个靠 frps 配置 vhostHTTPPort 实现。
- 通信可加 token 认证和 TLS 加密,v0.52.0 起配置文件从 ini 全面切到 TOML。
跑起来
需要一台有公网 IP 的云服务器(下称「你的服务器IP」)和一台内网机器。两边都下载同一个包:
U=https://github.com/fatedier/frp/releases
V=frp_0.72.0_linux_amd64
wget $U/download/v0.72.0/$V.tar.gz
tar -xzf $V.tar.gz && cd $V
公网服务器上写 frps.toml 并启动:
bindPort = 7000
auth.token = "换成一串长随机字符"
./frps -c ./frps.toml
更省事的办法是用官方镜像直接跑,配置文件挂在宿主机目录上:
docker run -d --name frps --restart=always \
-v /etc/frp:/etc/frp \
-p 7000:7000 -p 6000:6000 \
snowdreamtech/frps
内网机器上写 frpc.toml 并启动:
serverAddr = "你的服务器IP"
serverPort = 7000
auth.token = "同一个长随机字符"
[[proxies]]
name = "my-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
./frpc -c ./frpc.toml
从任何一台外网机器执行 ssh -p 6000 用户名@你的服务器IP,连上的就是你内网那台机器。记得在云控制台安全组里放行 7000 和 6000 两个端口,这一步漏了后面全是排查时间。
从零到能用
- 云服务器开一台最低配的,系统随便选个主流 Linux 发行版,安全组先放行 7000。
- 两台机器各自下载压缩包解压,frps 留在云上,frpc 拷进内网机器。
- 先起 frps,再起 frpc,frpc 的日志出现 login to server success 就说明隧道通了。
- 在 frpc.toml 里照着 my-ssh 的格式加自己的服务,改 localPort 和 remotePort 就行。
- 去安全组补放行对应的 remotePort,然后从外网实际访问一次验证。
- 稳定后用 systemd 把两个进程挂成开机自启,别用前台终端挂着跑。
适合谁用 / 别用
适合:手上有云服务器、又想把家里或实验室的机器暴露出来用的人;学计算机或电气、想给简历添一条「自己部署并维护过公网服务」的同学,frp 半小时就能跑通第一版。别用:想给几十台设备做大规模接入的,frp 每个服务要手工配 proxy,设备多了管理成本直线上升;对延迟敏感的实时场景(比如云游戏)也别指望它,多一跳中转就多一份延迟,除非两端 NAT 条件好到能走 P2P。
三个真实的坑
- 升级版本后连不上,报 token does not match。issue #2325 记录了升级到 0.36.2 后 token 校验失败的情况,原因是不同版本对 token 的处理有差异,两端版本要一起升级,别一边新版一边旧版。
- 网上抄的老教程全是 ini 格式,新版直接报错。v0.52.0 起 frp 改用 TOML,字段名也改了(bind_port 变 bindPort),issue #3672 记录了 toml 化后 meta_token 这类参数不再支持。照着 2019 年的博客配必然翻车,以官方文档为准。
- xtcp 的 P2P 模式不是万能的。两端只要有一边是对称型 NAT,打洞大概率失败,issue #3497 里作者本人对打洞成功率的实测和讨论说得很细,#3659 也记录了 nathole prepare 阶段直接报错的案例。P2P 失败会回落到中转,穿透不了就老实用 tcp 类型。
小结
回到开头那个场景:人在公司,机器在家里。frp 帮你把「没有公网 IP」从一个死路变成一次下载加两段配置的事,唯一的成本是一台最低配云服务器和一点带宽。先跑通 SSH 这一版,再一个一个把你想暴露的服务加进 frpc.toml。
参考资料
- 仓库:https://github.com/fatedier/frp
- README(SSH 示例与 allowPorts 说明)
- Release v0.72.0:https://github.com/fatedier/frp/releases/tag/v0.72.0
- issue #2325:token 不匹配
- issue #3497 / #3659:P2P 打洞实测与报错
- issue #3672:TOML 迁移后的参数变化
默认评论
Halo系统提供的评论