ZeroTier 自建 Moon 节点加速内网穿透
我那台跑 PVE All in One 的小主机,在家里用 hostname.local 访问很顺。但人不在家的时候就抓瞎了——mDNS 跨不了网段,更别说从外网回来。ZeroTier 正好补上这一块:把家里的机器和我在外面的笔记本组进同一个虚拟局域网,走到哪都能直连。
用了一段时间,唯一的槽点是延迟。ZeroTier 官方的根节点在国内访问延迟比较高,偶尔还不稳定,连接建立得慢吞吞。解决办法是自建一个 Moon 节点。这篇先讲清楚 Moon 到底是什么、为什么能加速,再记录完整的搭建步骤。
一、先搞清楚 Planet 和 Moon
ZeroTier 设备之间是优先走 P2P 直连的(UDP 打洞)。但两台设备要先「找到对方」——谁在哪、用什么地址连——这一步靠的是「根服务器」(root)。打洞失败时,流量也要由根来中继兜底。
- Planet(行星):ZeroTier 官方维护的默认根,分布在全球。每台设备启动都要先连 Planet 做节点发现。
- Moon(卫星):用户自建的根。客户端
orbit一个 Moon 之后,就多了一个「就近的根」。
问题就出在这里:国内设备连官方 Planet 这一跳延迟高,于是节点发现慢、打洞协商慢,需要中继时还要绕到国外。把一台国内 VPS 配成 Moon,节点发现和中继兜底就能走这条低延迟的近路。
需要强调的是——这一点官方文档写得很清楚——Moon 是对 Planet 的补充,不是替代。它不会接管已经建好的 P2P 直连,主要改善的是「发现 + 协商 + 中继兜底」这条控制路径的延迟和稳定性。所以期待值放对:它让连接「连得更快更稳」,而不是凭空给你的直连提速。
二、在 VPS 上配置 Moon 节点
安装 ZeroTier
curl -s https://install.zerotier.com | sudo bash
systemctl enable zerotier-one
加入 ZeroTier 网络
zerotier-cli join <network-id>
生成 Moon 配置
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
编辑生成的 moon.json,找到 stableEndpoints 字段,填入 VPS 的公网 IP:
"stableEndpoints": ["1.2.3.4/9993"]
9993 是 ZeroTier 的默认 UDP 端口。id 字段是这台 VPS 的 10 位 ZeroTier ID,记下来后面要用。
生成签名文件
zerotier-idtool genmoon moon.json
执行后会生成一个 000000xxxxxxxxxx.moon 文件。
加载 Moon 节点
在 /var/lib/zerotier-one 下建 moons.d 目录,把 .moon 文件放进去,然后重启 ZeroTier:
mkdir -p /var/lib/zerotier-one/moons.d
cp 000000xxxxxxxxxx.moon /var/lib/zerotier-one/moons.d/
systemctl restart zerotier-one
三、客户端连接 Moon 节点
在其他机器上执行(两个参数都填 Moon 节点的 10 位 ID):
zerotier-cli orbit <moon-id> <moon-id>
严格来说 orbit 的两个参数是 <world id> 和 <seed>,但对自建 Moon 来说,两个都填 Moon 节点的 ID 就行。
如果某台客户端不方便敲命令(比如手机),也可以把 .moon 文件直接复制到它的 moons.d 目录下,重启 ZeroTier,效果一样。
验证是否连上
zerotier-cli listpeers
看到 Moon 节点那行后面有 MOON 字样就成功了:
200 listpeers 3ed7cxxxxx 39.97.x.x/9993;172;79 32 1.6.3 MOON
四、几个踩过的坑
- UDP 9993 一定要放行。这是最常见的「配了半天连不上」的原因——VPS 厂商的安全组 / 防火墙默认往往只放行 TCP。Moon 走的是 UDP 9993,安全组里没开它就永远不通。
stableEndpoints填公网 IP,不是内网 IP。如果 VPS 本身在 NAT 后面(少见,但有些家宽 VPS 是),这里要填外部能访问到的地址。- Moon 不是翻墙工具。它只是给「你自己的 ZeroTier 网络」加速,改变的是设备之间「怎么连」,不改变你「能访问什么」。别拿它当代理用。
- 可以叠多个 Moon 做冗余。在不同地区各放一台 VPS、客户端都
orbit上,某台挂了还有别的兜底。
小结
mDNS 解决的是「同一个局域网内不用记 IP」,但跨网段、跨公网就无能为力。ZeroTier 把分散的设备组进一张虚拟局域网,补齐了这块;而自建 Moon 则是把 ZeroTier 在国内的体验从「能用」拉到「顺手」。
成本很低——一台最便宜的国内 VPS 就够;收益是连接建立明显更快、更稳。对家庭服务器、异地组网这种场景,这是性价比很高的一步。