ZeroTier 是商业级的 P2P 组网方案。因其服务器位于境外,中国大陆用户经常遇到延迟较高的问题。为解决这个问题,从 ZeroTier 1.2.0 版本开始,引入了自建 Moon 节点功能,允许用户部署私有中转节点来优化网络性能。
本文记录了 Moon 节点的部署和使用步骤。
0. Moon 节点工作原理概述
ZeroTier 网络中的所有节点默认都位于Planet中,即 ZeroTier 的官方根服务器网络。Moon 节点作为用户自定义的根服务器,具有以下特点:
- 双重路由机制
- 节点同时使用 Planet 和 Moon 服务器
- 自动选择延迟最低的路由
- 当两者都不可用时回退到官方服务器
- 适用场景
- 优化特定地理位置的网络性能
- 创建离线/内网组网环境(毕竟整个互联网也算是个大局域网)
1. 部署moon节点
前置条件:
- 节点需要具有静态 IP(可以是公网 IP 或内网 IP。如果没有公网IP,无法通过路由公网访问)
- 开放 UDP 9993 端口(防火墙和安全组都需要放行,可在服务器防火墙和云服务商安全组中放行)
- 主要需求是稳定的网络连接
1.1 安装 Zerotier
打开命令行,在云服务器linux上安装Zerotier:
|
|
1.2 生成 moon 配置文件
|
|
如果没有生成 moon.json 文件,可能是因为没有写文件的权限。可以 sudo -i 切换为超级用户后再执行命令
|
|
如上图,最终的 000000a62f602019.moon,其中包含了完整的配置信息:
- 是二进制文件,不可读
- 带有加密签名
- 通常放在 /var/lib/zerotier-one/moons.d/ 目录下
- moon-id 为(10位或16位标识符): 000000a62f602019 或 a62f602019
2. 使用 Moon 节点加速
同样地,首先需要在客户端安装 Zerotier,然后在在客户端中加入 moon 节点。
2.1 在客户端添加 moon 节点
不同客户端版本 moon-id 不一致,需要检查本机 zerotier 版本(zerotier-cli -v 命令可查看版本),如:
- 在 zerotier 1.10.6 版本中, moon-id 是 16 位,前面有多余 0
- 在 zerotier 1.12.2 版本后,moon-id 是 10 位字符串
总的来说,在新版中 moon-id 是 10 位字符串,需要注意删除前面多余的 0
这是一个很奇怪的更新,在官方的文档中我没找到任何明确的说明,还是自己去 Github 开 Issues 问到的(笑脸黄豆.jpg)
|
|
注意版本差异:
- 1.10.6 版本:使用16位 moon-id(含前导零)
|
|
- 1.12.2+ 版本:使用10位 moon-id(去除前导零)
|
|
orbit 命令会返回 200 状态码表示添加成功。如果 orbit 一直返回 404 状态需要检查上文的版本,多重试几次 orbit
2.2 检查所添加的 moon 状态
可以通过 listmoons 和 listpeers 检查 moon 状态
2.2.1 检查 moons 列表
listmoons 命令可以列出本机所加入的自建 moons 节点情况
|
|
上图可以看到加入 moons 前后 listmoons 情况。如果 listmoons 不为空,即表明添加成功
2.2.2 检查 peers 状态
listpeers 命令可将本机所加入的网络组下、组网环境中的节点列出,可用于检查机器间的连接情况
|
|
其中最后一个字段 <role>
表明机器身份:
-
PLANET 表示 zerotier 官方的中转节点,延迟 42364ms
-
MOON 表示自建 zerotier 中转节点,延迟 55ms
-
LEAF 表示组网范围内的其他同级别节点
通过在两台 LEAF 节点中同时添加 MOON 节点,可以实现大幅加速效果
确定添加完成后。可在添加 moon 节点后观察组网机器内的机器延迟情况(ping 测试)观察中转效果
加入前后两机之间的 ping 时间明显减少,500ms+ -> 50ms+
其他指令:
zerotier-cli deorbit <moon-id>
可用于取消加入 moon 节点zerotier-cli -h
,帮助,可查看所有指令
3. 最佳实践
- 建议客户端至少加入两个 Moon 节点
- Moon 节点专注于网络中转功能
- 避免将多个节点部署在同一物理服务器上
- 避免将 Moon 服务器同时作为 Moon 和 Leaf 节点
- 适合将 Moon 部署在就近的数据中心(如国内云服务商)