很多兄弟在家里搞了 NAS(不管是群晖、威联通还是自己攒的黑群),最头疼的问题就是:人在外面,怎么连回去?
运营商基本不给公网 IP,这就让 NAS 变成了一个“大局域网存储”。为了解决这个问题,大家通常会折腾各种方案,但最后发现还是 frp 最稳。
为什么折腾了半天,还得是 frp?
目前的内网穿透方案其实挺多,但大多都有硬伤:
厂家自带域名(如绿联、群晖 QuickConnect):
缺点:域名又长又难记,而且流量经过厂家中转,速度慢得感人,看个高清视频卡到怀疑人生。
公共穿透服务(如向日葵、花生壳):
缺点:免费版限速到几百 KB,稍微想快一点就要交月费。而且映射数量有限,想给多个 Docker 服务做穿透?加钱。
Cloudflare Tunnel:
缺点:虽然免费且安全,但毕竟节点都在海外,国内访问延迟高,握手慢,甚至时不时抽风连不上。
相比之下,frp (Fast Reverse Proxy) 的优势在于:只要你有一个国内的云服务器,流量握手极快,带宽取决于你的服务器带宽,完全自由定制。
阿里云“99 计划”:最香的跳板机
做 frp 穿透,核心得有个带公网 IP 的中转站。
现在刚好赶上阿里云的 “99 计划”,2 核 2G 的 ECS 实例一年只要 99 块钱,而且续费同价。这个配置拿来跑 frp 绰绰有余,带宽给力,还能顺便跑个 Caddy 做反向代理。
我的推荐链接:
https://www.aliyun.com/minisite/goods?userCode=1qkt8mbb
买好服务器后,建议安装 Ubuntu 或 Debian 系统,接下来我们就用 Docker Compose 把穿透搭起来。
实战配置:Docker Compose 一键部署
我们要准备两套配置:云服务器跑服务端(frps),家里 NAS 跑客户端(frpc)。
1. 服务端(frps)配置
在云服务器上新建目录 frp,创建 frps.toml:
Ini, TOML
# frps.toml
bindPort = 7000 # 服务端监听端口,和客户端通信
vhostHTTPPort = 80 # 接收 HTTP 请求的端口
vhostHTTPSPort = 443 # 接收 HTTPS 请求的端口
auth.token = "你的安全密钥" # 务必设置复杂点
创建 docker-compose.yml:
YAML
services:
frps:
image: fatedier/frps:latest
container_name: frps
restart: always
network_mode: host
volumes:
- ./frps.toml:/etc/frp/frps.toml
2. 客户端(frpc)配置
在 NAS 上新建目录 frp,创建 frpc.toml:
Ini, TOML
# frpc.toml
serverAddr = "你的云服务器IP"
serverPort = 7000
auth.token = "你的安全密钥"
[[proxies]]
name = "nas-web"
type = "http"
localIP = "127.0.0.1" # 如果是 NAS 本身的服务
localPort = 5000 # NAS 管理界面的端口
customDomains = ["nas.example.com"]
[[proxies]]
name = "docker-app"
type = "http"
localIP = "172.17.0.1" # 或者是内网其他机器 IP
localPort = 8080 # NAS 上其他 Docker 服务的端口
customDomains = ["app.example.com"]
创建 docker-compose.yml:
YAML
services:
frpc:
image: fatedier/frpc:latest
container_name: frpc
restart: always
volumes:
- ./frpc.toml:/etc/frp/frpc.toml
进阶:如何优雅地处理 HTTPS?
frp 本身可以处理 HTTPS,但最推荐的方式还是 [Caddy + frp]。
云端 Caddy 监听 80/443。
Caddy 负责自动申请证书,并反向代理到云服务器本地的
8080(frp 转发出来的端口)。frp 只负责把流量打回内网。
这样做的好处是,你不需要在内网折腾证书,证书在云端服务器自动就续期了,省心省力。
实现步骤:
在 frpc 里的
proxies类型写成tcp,或者用http配合云端的 Nginx/Caddy。如果你有多个 Docker 服务(比如 Plex、Transmission、青龙面板),只需要在
frpc.toml里多加几个[[proxies]]模块,分配不同的子域名即可。
避坑小贴士
防火墙:阿里云控制台的安全组一定要放行
7000、80、443等端口,否则客户端永远连不上。frp 官方文档:这是最权威的参考,遇到特殊的 TCP/UDP 转发需求,直接去翻文档。
版本匹配:确保服务端和客户端的 frp 版本一致,不然可能会报各种稀奇古怪的连接错误。
搞定这一套,你的 NAS 就能随时随地通过自己的顶级域名秒连了。
How to Use FRP for Remote Access 这个视频详细演示了 frp 的基本原理和加密传输的配置,对于理解流量是如何从公网穿透到内网非常有帮助。