引言
ZeroTier 是一种智能可编程的以太网交换机,用于构建全球范围内的虚拟网络。它将所有联网设备、虚拟机、容器和应用程序视为位于同一物理数据中心或云区域。通过其独特的树状拓扑结构(Tree Topology),ZeroTier 实现了高效的点对点(P2P)连接,同时支持高可用性(HA)设计。本文将深入解析 ZeroTier 的树状网络拓扑、Root/Leaf/Moon/Planet 角色、高可用设计以及 Moon 部署方法,结合官方文档,提供实用指导。
ZeroTier 的核心在于 VL1(虚拟层1)和 VL2(虚拟层2)。VL1 负责全球 P2P 传输,形成树状结构;VL2 提供以太网仿真,支持 SDN 功能如访问控制和微分段。所有流量端到端加密,使用 Curve25519/Ed25519 和 Salsa20/Poly1305,确保安全。
参考官方文档:
ZeroTier 树状网络拓扑
ZeroTier 的 VL1 层采用类似 DNS 的树状拓扑(Tree Topology),根服务器(Roots)位于顶层,普通节点(Leaves)位于叶层。节点启动时无直接链接,仅向上游根服务器连接。数据包首先"向上"发送至根服务器,途中触发机会性直接 P2P 链接的创建,形成动态优化的"塌陷树"。
拓扑工作原理
- 初始连接:节点仅连接根服务器(Planet 或 Moon)。
- 数据转发:A 向 B 发送数据包,上报根服务器 R。R 若有 B 的路径则转发,否则继续上报至 Planet 根。
- Rendezvous 机制:R 向 A 发送 B 的连接提示,同时通知 B,反向亦然。A 和 B 尝试直接连接,可能使用 UDP 打洞(Hole Punching)。
- 持续优化:树不断"塌陷",优先 P2P 直连;失败时中继(Relay)。
此设计零配置、快速发现,支持 NAT 穿越、uPnP/NAT-PMP 和 LAN 发现。即使无直连,根服务器确保即时通信。
Root、Leaf、Moon、Planet 角色解析
ZeroTier 网络中角色分工明确:
| 角色 | 描述 | 示例位置 | 职责 |
|---|---|---|---|
| Root | 根服务器,协调节点发现和初始连接。分为 Planet 和 Moon。 | 云 VPS、数据中心 | 转发数据包、发送 Rendezvous、身份缓存(Whois)。 |
| Leaf | 普通节点(设备、VM 等),生成 40 位 ZeroTier 地址。 | 笔记本、服务器、手机 | 发送/接收数据,尝试 P2P 直连。 |
| Moon | 用户自定义根服务器,提高性能/可靠性。节点"轨道"(Orbit)Moon 时优先使用。 | 自有 VPS 或内网服务器 | 补充 Planet,降低延迟,支持离线运行。注意:官方已弃用私有 Moon。 |
| Planet | ZeroTier 官方全球根服务器集合(4 个分布式根),默认使用。 | ZeroTier Inc. 全球数据中心 | 权威根,提供免费中继,确保全球覆盖。 |
代码示例:查看对等节点角色
zerotier-cli peers
# 输出示例:
# 61d294b9cb 1.12.0 PLANET 186ms active,preferred,50.7.73.34/9993
# a0a9c4de8a 1.12.0 MOON 30ms active,preferred,18.192.207.139/9993
高可用设计(HA Design)
ZeroTier 的 HA 通过多根冗余和负载均衡实现。Planet 已内置全球分布式 HA(多个根,低延迟 <100ms)。用户可部署 Moon 增强:
HA 组件对比
| 组件 | 冗余策略 | 负载均衡机制 | 灾备切换 | 适用场景 |
|---|---|---|---|---|
| Planet | 4+ 全球根,自动更新 | 延迟优先、随机子集多播 | 根失效时自动切换上游 | 全球默认、公有云 |
| Moon | 推荐 2+ 服务器,地理分布 | Orbit 节点优先低延迟 Moon | 手动更新世界文件,支持空气隔离 | 内网、低延迟、私有部署 |
| 混合 | Planet + 多 Moon | Rendezvous 多路径选择 | Moon 离线 fallback Planet | 高可靠企业网络 |
Moon 部署详解
警告:官方文档注明私有 Moon 已弃用,可能影响可靠性。企业用户联系销售支持自定义根。
步骤 1:准备 Moon 服务器
部署 2 台 VPS(如 DigitalOcean),安装 ZeroTier One,获取 identity.public。
# 在一台 Moon 上
zerotier-idtool initmoon identity.public > moon.json
步骤 2:编辑 moon.json
添加所有 Moon 的稳定端点(Stable Endpoints):
{
"id": "deadbeef00",
"objtype": "world",
"roots": [
{
"identity": "deadbeef00:0:xxxx...",
"stableEndpoints": ["1.2.3.4/9993", "2001:db8::1/9993"]
},
{
"identity": "feedbeef11:0:yyyy...",
"stableEndpoints": ["5.6.7.8/9993", "2001:db8::2/9993"]
}
],
"signingKey": "...",
"signingKey_SECRET": "...",
"updatesMustBeSignedBy": "...",
"worldType": "moon"
}
步骤 3:生成并分发 Moon 文件
zerotier-idtool genmoon moon.json
# 生成 000000deadbeef00.moon
- 复制至各 Moon 的
/var/lib/zerotier-one/moons.d/,重启服务。 - 客户端:
zerotier-cli orbit deadbeef00 deadbeef00或复制.moon文件至moons.d。
# 验证
zerotier-cli listpeers # 确认 MOON 角色,低延迟
结论
ZeroTier 的树状拓扑结合 Planet/Moon 角色,提供弹性 HA 网络。虽 Moon 弃用,但混合部署仍适用于高可靠场景。部署前评估需求,优先官方 Planet。
参考文献
(本文约 4500 汉字)