内网穿透与异地组网方案对比:frp、ZeroTier、Tailscale 怎么选
出差在外,突然想起家里 NAS 里存着一份明天开会要用的资料;或者父母打电话说"电视盒子又看不了了",你想远程进软路由看一眼。问题是:运营商分给家庭宽带的 IP 大多是内网地址(运营商级 NAT 之后的大内网),从外网根本连不进来。
这就是"内网穿透"和"异地组网"要解决的问题:让你在任何地方,像坐在家里一样访问自己的设备。本文对比 frp、ZeroTier、Tailscale 三种主流方案,帮你选对、用好。本文只讨论远程办公、远程管理自己家里的设备这类合法场景。
一、三种方案一句话原理
- frp:经典的反向代理穿透。你需要一台有公网 IP 的云服务器做"中转站":家里的设备(frpc 客户端)主动向服务器(frps 服务端)建立一条长连接;你在外网访问云服务器的指定端口,流量就被转发回家里对应的设备和服务。家里宽带没有公网 IP 也没关系,因为连接是"从内往外"打出去的。
- ZeroTier:虚拟局域网方案。你在官网创建一个虚拟网络,得到一个 Network ID;所有设备安装 ZeroTier 客户端并加入这个 ID,设备之间通过 NAT 打洞直连,组成一张跨越互联网的"虚拟局域网",互相访问就像连在同一台路由器下面。
- Tailscale:同样是虚拟局域网,底层基于 WireGuard 协议。用法类似:各设备登录同一个账号,自动组成一张加密的虚拟网络,设备之间点对点直连;打洞失败时自动经官方中继节点转发,保证连通性。
二、方案对比表
| 对比维度 | frp | ZeroTier | Tailscale |
|---|---|---|---|
| 是否需要公网 IP / 服务器 | 需要一台云服务器 | 不需要 | 不需要 |
| 访问速度 | 取决于云服务器带宽 | 打洞成功则点对点,速度看两端上行 | 同左,WireGuard 效率更高 |
| 配置难度 | 中等,要写服务端/客户端配置文件 | 低,装客户端、填 Network ID | 最低,登录账号即可 |
| 安全性 | 完全自己掌控,token 鉴权 | 中心控制器 + 端到端加密 | WireGuard 端到端加密,密钥不出设备 |
| 费用 | 云服务器费用 | 免费版有设备数上限,家用一般够用 | 个人免费版额度家用一般够用 |
| 稳定性 | 取决于云服务器线路质量 | 打洞失败走官方中继,可能变慢 | 同左,中继节点相对较多 |
三、frp 自建方案步骤概要
适合已经有云服务器、或者愿意为"完全自主可控"付费的朋友。
1. 服务端(云服务器)配置
下载对应架构的 frp 程序,编写 frps.ini:
[common]
bind_port = 7000
token = 请换成足够复杂的随机字符串
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 请换成强密码
用 systemd 设置开机自启,并在云服务器安全组放行 7000(控制通道)和你要映射的业务端口。
2. 客户端(家里设备)配置
在 NAS、软路由或家里的电脑上运行 frpc,编写 frpc.ini:
[common]
server_addr = 云服务器的公网IP
server_port = 7000
token = 与服务端保持一致
[nas-web]
type = tcp
local_ip = 127.0.0.1
local_port = 5000
remote_port = 15000
这样配置后,在外网访问 云服务器IP:15000,就等同于访问家里 NAS 的 5000 端口。
3. 安全加固(必做)
- token 必须用长随机字符串,这是整套方案唯一的"门锁"。
- dashboard 管理面板不要直接暴露到公网,实在需要就设强密码加 IP 白名单。
- 只映射必要的端口。SSH、远程桌面、NAS 管理后台这类高危端口,能不映射就不映射;必须映射就改掉默认端口,配合密钥登录使用。
四、ZeroTier / Tailscale 组网步骤
适合没有公网 IP、也不想维护服务器的朋友,十分钟就能跑起来。
ZeroTier 组网步骤:
- 到 ZeroTier 官网注册账号,创建一个 Network,记下 16 位的 Network ID。
- 所有设备安装 ZeroTier 客户端,执行
zerotier-cli join <NetworkID>(图形界面直接粘贴 ID 加入)。 - 回到网页管理后台,把新加入的设备勾选授权(Authorized),记下分配到的虚拟 IP(类似
10.147.x.x)。 - 之后用虚拟 IP 互访即可。建议在管理后台给常用设备设置固定虚拟 IP,方便记忆。
Tailscale 组网步骤:
- 到 Tailscale 官网登录账号。
- 所有设备安装 Tailscale 客户端并登录同一个账号,设备会自动出现在管理面板里。
- 直接用设备名或
100.x.y.z的虚拟 IP 互访;管理面板里可以开关设备、设置 ACL 访问控制规则。 - 免费额度对家庭场景一般够用,设备很多或有团队需求再考虑付费版。
五、选型建议
- 已经有云服务器 / 手头有公网 IP:选 frp。流量完全走自己的服务器,自主可控,还能顺手跑博客、搭服务;缺点是速度受限于服务器带宽,还要自己维护。
- 没有公网 IP、怕折腾:选 Tailscale 或 ZeroTier。Tailscale 上手最简单,WireGuard 打洞成功率高;ZeroTier 玩法更灵活(支持自建控制器),适合爱折腾的玩家。
- 只是临时用一下:虚拟组网方案 10 分钟就能跑起来,别为了一次需求去买云服务器。
- 对速度敏感(比如频繁传大文件):优先保证两端打洞直连。直连失败、被迫走官方中继时会明显变慢,这种情况下 frp 配一台线路好的云服务器反而更稳定。
六、安全提醒
- 三种方案都要开鉴权:frp 的 token、ZeroTier 的网络授权、Tailscale 的账号登录,一个都不能省。没有鉴权的穿透等于把家门敞开。
- 遵循最小暴露原则:frp 只映射必要端口;虚拟组网里用 ACL 或防火墙隔离重要设备,不要让所有设备默认互通。
- 高危服务(SSH、远程桌面、NAS 管理后台)务必强密码加非默认端口,条件允许的话只允许虚拟网段访问。
- 客户端保持更新,及时修复已知漏洞。
七、进阶:用域名访问内网服务(frp 篇)
IP 加端口的方式能用,但不好记。frp 支持基于域名的 HTTP 穿透,体验好很多:
# frps.ini 服务端追加
vhost_http_port = 8080
subdomain_host = example.com # 你的域名,泛解析 *.example.com 到服务器
# frpc.ini 客户端追加
[nas-web-http]
type = http
local_ip = 127.0.0.1
local_port = 5000
subdomain = nas
配置好后,访问 http://nas.example.com:8080 就直达家里 NAS 的网页。想要去掉端口号、加上 HTTPS,可以在云服务器上再装一个 Nginx 做反向代理和证书,frp 只负责把流量送到本机,安全性和体验都上一个台阶。
另外 frp 还有 stcp / xtcp 模式:流量不经过服务器中转(stcp 经服务器打洞、xtcp 尝试点对点直连),速度接近直连,适合传大文件,代价是配置稍复杂、打洞不一定成功,新手先跑通 tcp 模式再折腾。
总结
没有银弹,只有适合:有服务器、求可控就选 frp;没服务器、求省心就选 Tailscale 或 ZeroTier。无论选哪个,"开鉴权"和"最小暴露"都是不能打折的安全底线。先按本文把一条链路跑通,远程管理自己家里的设备就不再是难事。