手里有台内网机器,想让外面访问上面的网站、远程桌面或测试接口,但没有公网 IP,这是很多开发者都会碰到的情况。frp(Fast Reverse Proxy)是一个开源的反向代理工具,由服务端和客户端两部分组成。思路不复杂:在阿里云上租一台服务器做中转,内网设备主动连过去,外部请求经服务器转回内网,本地服务就能暴露到公网。

这篇文章记录的是一个小团队的做法。某设计工作室的办公室里有一台 NAS 和一台开发机,设计师出差时要访问 NAS 上的素材库,开发人员也要让客户看到本地调试中的网站。之前他们用过临时的动态域名工具,经常掉线,延迟也高。换成阿里云轻量应用服务器加 frp 后,连接稳定了不少。下面按准备、服务端、客户端、安全和排错的顺序讲一遍,每一步都说明为什么这样配。
为什么用阿里云加 frp
内网穿透的方案不少,花生壳、ngrok、Cloudflare Tunnel 都有人用。frp 的好处是服务器自己掌握,流量从自己的机器走,不受第三方平台的套餐和限制影响。阿里云 ECS 或轻量应用服务器有固定公网 IP,安全组可以精确配置,带宽也能按需选择,适合当 frp 的服务端。
准备工作
- 一台阿里云 ECS 或轻量应用服务器,系统选 CentOS 或 Ubuntu LTS 版本,相关资料多,排错时也好找
- 如果要用域名访问 Web 服务,准备一个已完成备案的域名。服务器位于中国大陆时,备案是域名访问的前提
- 内网里需要被穿透的设备,并确认它能正常联网
- 从 frp 的 GitHub Release 页面下载最新稳定版,注意区分 x86_64 和 arm64 架构
阿里云安全组默认规则通常只放行 22 端口,frp 用到的端口要在控制台手动添加。这一步很容易漏,后面排错时往往就是它。
服务端部署
登录服务器后下载并解压 frp,服务端主要用到 frps 和 frps.toml 两个文件。下面是一份精简的服务端配置:
bindPort = 7000
auth.method = "token"
auth.token = "请替换为足够长的随机字符串"
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "请替换为强密码"
vhostHTTPPort = 80
vhostHTTPSPort = 443
bindPort 是客户端连接服务端的端口。token 用来校验身份,没有它,陌生设备就能随意接入,所以要用足够长的随机字符串,可以用 openssl rand -hex 32 生成。webServer 是管理面板,建议只监听 127.0.0.1,需要查看时通过 SSH 隧道连过去,不要直接暴露到公网。
配置写好后,先在前台运行 ./frps -c ./frps.toml 测试。没有报错再交给 systemd 设置开机自启,否则服务器一重启,穿透就断了,而且不容易第一时间发现。
客户端配置
在内网 NAS 上部署 frpc。下面的例子把 NAS 的 5000 端口映射到公网 6000 端口:
serverAddr = "你的阿里云公网IP"
serverPort = 7000
auth.method = "token"
auth.token = "与服务端保持一致的token"
[[proxies]]
name = "nas-web"
type = "tcp"
localIP = "192.168.1.100"
localPort = 5000
remotePort = 6000
serverPort 和 token 必须与服务端完全一致。配置好后,到阿里云安全组放行 6000 端口,就可以在外网访问 http://公网IP:6000 打开 NAS 管理界面。设计师的素材访问问题,就是这样解决的。
如果想用域名访问网站,可以改用 http 类型的代理,在服务端开启 vhostHTTPPort,再把域名解析到服务器 IP。这种方式只需放行 80 或 443,比给每个服务单独开随机端口省事,也更好管理。
安全加固
- token 换成高强度随机字符串,怀疑泄露就立即更换,服务端和客户端要同时改
- 管理面板不要对公网开放。确实需要远程访问时,套上 HTTPS 并限制来源 IP
- 只映射用得到的端口。服务不用了,就删掉对应的 proxy 配置并重启 frpc
- 穿透出去的服务自己也要设置登录验证,NAS 和网站都开启账号密码或二次验证,弱口令是最常见的入口
- 关注 frp 官方发布页,有安全修复就尽快升级
穿透工具只负责把流量带进来,能不能挡住风险,还要看内网服务本身。设备一旦公网可达,弱口令和长期没打补丁的系统都会变成现成入口,所以安全策略要和穿透方案一起设计,别等上线之后再补。
常见报错怎么排查
客户端连接失败
先核对客户端的 serverPort 和服务端的 bindPort 是否一致,token 是否完全相同,连多余的空格都要检查。然后确认阿里云安全组放行了 7000 端口。在服务器上运行 ss -lntp,看 frps 是否真的在监听。
连上服务端,但访问不了内网服务
多数情况是 localIP 或 localPort 写错了,或者目标服务只监听了 127.0.0.1。到内网设备上用 netstat 或 ss 查看服务的实际监听地址,再在本机用 curl 测试一遍。本机都访问不通,frp 就没办法帮你从公网访问到它。
穿透一段时间后自动断开
先在客户端开启心跳配置,让连接定期保活。如果断线频率很有规律,可能是路由器或中间网络设备的 NAT 超时在作怪,这时可以缩短心跳间隔。另外用 systemd 守护 frpc 进程,断了能自动拉起。
访问速度慢
多数时候瓶颈在带宽。轻量服务器的带宽套餐要按实际流量估算,传视频或大文件的业务尤其要提前算清楚,否则内网再快也用不上。
用好这套方案,关键是三件事:服务端配置要收紧,端口放行要精确,内网服务本身要设防。做到这三点,个人开发者和小团队都能用不高的成本搭起自己的穿透通道。