
保姆级 FRP 内网穿透教程:让家里的 NAS 在外面也能访问
没有公网 IP?用一台便宜的 VPS 就能把家里的 Emby、NAS、各种服务"搬"到外网。 全程 Docker 部署,先服务端,后客户端,照着做 20 分钟搞定。
保姆级 FRP 内网穿透教程:让家里的 NAS 在外面也能访问
没有公网 IP?用一台便宜的 VPS 就能把家里的 Emby、NAS、各种服务"搬"到外网。 全程 Docker 部署,先服务端,后客户端,照着做 20 分钟搞定。
一、先搞懂:FRP 是什么
FRP 是一个内网穿透工具,分成两个角色:
| 角色 | 名称 | 装在哪 | 作用 |
|---|---|---|---|
| 服务端 | frps | 有公网 IP 的 VPS | 对外开放端口,接收外网的访问 |
| 客户端 | frpc | 家里的 NAS | 主动连到 VPS,把本地服务"挂"到 VPS 的端口上 |
访问路径:
因为是 NAS 主动连出去 的,所以家里不需要公网 IP,也不用在路由器上做端口映射。
二、准备工作
1. 你需要什么
- ✅ 一台有公网 IP 的 VPS(装服务端 frps)
- ✅ 一台家用 NAS(装客户端 frpc,也可以是软路由、小主机)
- ✅ 两台机器都装好 Docker 和 Docker Compose
- ✅ (推荐)VPS 上装了 1Panel 之类的面板,方便反代和管理
2. 端口规划(先在纸上写好)
| 用途 | 端口 | 说明 |
|---|---|---|
| 管理面板 WebUI | 16080 | 浏览器配置 frps 用 |
| 通讯端口 | 17000 | 服务端和客户端之间的隧道 |
| 对外服务端口 | 17001-17100 | 每个穿透出去的服务占一个 |
⚠️ VPS 的防火墙 / 云厂商安全组里,要把上面这几个端口放行,否则后面一定连不上。
3. 部署顺序
先部署服务端(VPS)→ 再部署客户端(NAS) 客户端启动时就要去连服务端,服务端没准备好,客户端只会报错。
三、第一步:在 VPS 上部署服务端 frps
这里用的是自带网页管理面板的镜像 verky/xg-frp,不用手写服务端配置文件,点点鼠标就能配。
1. 编写 docker-compose.yaml
在 VPS 上新建目录,比如 /opt/xg-frp,创建 docker-compose.yaml:
几个要点:
16080:网页管理面板端口17000:frpc 来连接的通讯端口17001-17100:给穿透出去的服务用的端口段,只有反代之后才能使用1panel-network:用的是 1Panel 的网络。如果你没有装 1Panel,把networks相关的几行删掉即可
2. 启动
3. 打开 Web 面板,设置账号密码
浏览器访问:
第一次打开会让你设置用户名和密码,设好后登录。
🔐 面板能直接改你的穿透配置,密码一定要设复杂。设置完成后,建议把 16080 做成只允许自己 IP 访问,或者通过反代加 HTTPS。
4. 新建服务端配置文件
登录后进入 「配置」 页面:
- 点击左侧「配置文件」旁边的 +,新建一个服务端配置(如
frps.toml) - 填写 通讯端口(bindPort):
17000 - 填写 Token(auth.token):自己随便生成一串复杂字符,一定要记下来,客户端要用
- 点击 保存,再点击 启动
![]()
右上角的开关要切到 「服务端」 模式,状态变绿就说明 frps 已经跑起来了。
对应生成的原始配置很简单:
❗ 端口和 Token 必须和客户端完全一致, 否则客户端连不上。这是最常见的坑。
到这里,服务端就准备好了 🎉
四、第二步:在 NAS 上部署客户端 frpc
1. 编写 docker-compose.yaml
在 NAS 上新建目录,比如 docker/frp,创建 docker-compose.yaml:
以飞牛 / 群晖这类 NAS 的 Docker 管理界面为例,在「Compose 配置」里粘贴即可。
2. ⚠️ 先创建 frpc.toml,再启动(重点)
compose 里挂载了 ./frpc.toml 这个文件。如果启动时这个文件不存在,Docker 会自动创建一个叫 frpc.toml 的「文件夹」,客户端就会读取失败。
正确做法:
- 还没启动: 先在 compose 同级目录手动新建
frpc.toml文件,再启动 - 已经启动过: 把自动生成的那个
frpc.toml文件夹删掉,重新建一个同名的文件,再重启容器
3. 填写 frpc.toml
参数说明:
| 参数 | 含义 |
|---|---|
serverAddr | VPS 的公网 IP 或域名 |
serverPort | 要和服务端的通讯端口 17000 一致 |
auth.token | 要和服务端的 Token 一致 |
name | 这条穿透规则的名字,不能重复 |
type | 协议,常见服务用 tcp 就行 |
localIP / localPort | NAS 上服务真实的地址和端口 |
remotePort | VPS 上对外暴露的端口,必须在 17001-17100 范围内 |
想多穿透一个服务,就复制一段 [[proxies]],改 name、localPort、remotePort 即可。
4. 重启容器
五、验证:看看穿透成功了没
回到 VPS 的 Web 面板,进入 「监控」 页面:
![]()
能看到这些,就说明成功了:
- 客户端数 不为 0
- 你配置的每条服务(emby、hub……)都显示 在线,并带着对应的公网端口
- 有流量时,会看到实时网速和累计流量
现在,在外面用手机访问:
就能打开家里的 Emby 了 🎬
六、常见问题排查
| 现象 | 大概率原因 | 解决办法 |
|---|---|---|
| 客户端日志提示连接失败 | VPS 防火墙 / 安全组没放行 17000 | 放行端口 |
| 提示 token 校验失败 | 两边 Token 不一致 | 重新复制粘贴,注意别带空格 |
| 客户端启动不了 | frpc.toml 被创建成了文件夹 | 删掉文件夹,重新建文件 |
| 面板显示在线,但访问不了 | remotePort 对应的端口没放行 | 放行 17001-17100 |
| 面板显示在线,但打开是空白 | localIP / localPort 填错 | 在 NAS 内网先自己访问一下确认 |
| 某条规则不显示 | name 重复或语法错误 | 检查 toml 缩进和引号 |
七、安全小提醒 🔒
- Token 要足够复杂,别用截图里那种示例值,也别在公开场合露出
- Web 面板
16080尽量不要直接暴露在公网,至少设强密码 - 不需要外网访问的服务,就别穿透出去
- 敏感服务(NAS 管理后台等)建议加 HTTPS,或者改用 VPN 访问
- 发教程截图前,记得把 IP、Token 打码
八、总结
希望这篇教程对你有帮助,有问题欢迎评论区交流~


