引言

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 链接的创建,形成动态优化的"塌陷树"。

拓扑工作原理

  1. 初始连接:节点仅连接根服务器(Planet 或 Moon)。
  2. 数据转发:A 向 B 发送数据包,上报根服务器 R。R 若有 B 的路径则转发,否则继续上报至 Planet 根。
  3. Rendezvous 机制:R 向 A 发送 B 的连接提示,同时通知 B,反向亦然。A 和 B 尝试直接连接,可能使用 UDP 打洞(Hole Punching)。
  4. 持续优化:树不断"塌陷",优先 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 汉字)