摘要:ZeroTier 是一款开源的软件定义广域网(SD-WAN)工具,融合了 VPN 和 SDN 的优势。它通过 P2P 直连、虚拟二层网络、根服务器协调等机制,实现全球设备零配置组网。本文将从 ZeroTier 协议架构、NAT 穿透原理、Cryptokey Routing 等维度进行深度解析,并提供完整的企业组网实战配置。

关键词:ZeroTier、SD-WAN、P2P、NAT 穿透、虚拟局域网、Curve25519


一、ZeroTier 概述

1.1 什么是 ZeroTier?

ZeroTier 是由 Adam Ierymenko 创立的开源虚拟网络平台,2014 年首次发布。它通过软件定义网络(SDN)技术,让分散在全球各地的设备像处于同一个局域网中一样通信。

核心特性:

  • 🌍 全球虚拟二层网络:跨地域设备共享 L2 广播域
  • 🔄 P2P 直连优先:通过 NAT 穿透实现端到端直接通信
  • 🔐 端到端加密:Curve25519 + Salsa20/12 + Poly1305(1.x);2.x 引入 Noise + AES-GMAC-CTR
  • 📦 零配置部署:加入 16 位网络 ID 即可联网
  • ☁️ 混合架构:托管根服务器 + 自建 Moon 节点
  • 💰 慷慨免费额度:单网络 50 台设备免费

1.2 ZeroTier vs WireGuard vs OpenVPN

特性 ZeroTier WireGuard OpenVPN
网络层级 L2/L3(虚拟交换机) L3(虚拟路由) L2/L3
拓扑模型 Mesh(自动 P2P) 手动配置点对点 星型(C/S)
NAT 穿透 ✅ 自动(STUN+打洞) ⚠️ 需手动端口转发 ⚠️ 需手动端口转发
配置复杂度 ⭐ 极简 ⭐⭐ 简单 ⭐⭐⭐⭐ 复杂
多设备组网 ✅ 自动 Mesh ⚠️ N² 配置 ⚠️ 需中心节点
控制平面 中心化(Controller)
数据平面 P2P 优先 P2P C/S
商业模式 开源 + SaaS 纯开源 开源 + 商业版
典型场景 SD-WAN、跨地域组网 高性能 VPN 远程接入

1.3 应用场景

场景 典型应用 ZeroTier 优势
远程办公 员工访问公司内网 零配置、自动穿透
跨地域组网 多分支机构互联 全球 Mesh、低延迟
游戏联机 异地局域网游戏 二层广播、低延迟
IoT 管理 远程设备维护 轻量客户端、稳定
容器网络 跨云 K8s 集群 全球互通
团队协作 共享开发环境 易管理、按需扩展

二、ZeroTier 网络架构

2.1 整体架构

图1:ZeroTier 网络架构

ZeroTier 采用分层架构,包含三个核心组件:

组件 角色 部署
Root Server(根服务器) 全球协调,设备发现 ZeroTier 官方托管
Network Controller(网络控制器) 网络成员管理、ACL 下发 官方或自建
Endpoint(终端节点) 实际通信节点 用户设备

2.2 核心设计原则

原则 1:控制平面与数据平面分离
┌─────────────────────┐
│   控制平面(Plane)  │  → 成员管理、规则下发、地址分配
├─────────────────────┤
│   数据平面(Data)   │  → P2P 直连、加密传输
└─────────────────────┘

控制平面通过 Controller 管理,数据平面尽量走 P2P 直连,不经过任何中心节点。

原则 2:P2P 优先,中继兜底

ZeroTier 节点会按以下优先级建立通信路径:

  1. 直连同一 LAN(多播发现)
  2. 公网 P2P 直连(NAT 穿透)
  3. Moon 中继(自建中继节点)
  4. Planet 中继(官方根服务器兜底)
原则 3:虚拟以太网(Ethernet over IP)

ZeroTier 在用户设备上创建虚拟网卡(默认 zt0 / ztXXXXXX),所有进出流量都被封装为:

原始以太网帧 → ZeroTier 加密封装 → UDP/9993 → 公网 IP

这意味着 ARP、广播、组播等 L2 协议都能在虚拟网络中正常工作。

2.3 网络分类

类型 网络 ID 描述
Public Network 任意 任何人可加入,需邀请才能通信
Private Network 任意 需 Controller 授权才能加入
Earth(公网) 8056c2e21c000001 ZeroTier 官方公共测试网络

三、P2P 打洞原理

3.1 NAT 穿透时序图

图2:P2P 打洞时序图

ZeroTier 综合使用了 STUN、打洞(Hole Punching)、Relay 等技术:

步骤 1:节点上线

Device A → Root Server: HELLO(包含本地候选地址)
Root Server → Device A: OK + Network Members

步骤 2:发现对端

Device A → Root Server: WHOIS Device B
Root Server → Device A: Device B 的候选地址列表

步骤 3:打洞建立直连

Device A → Device B: HELLO(直接发送)  ┐
Device B → Device A: HELLO(直接发送)  │ 同时进行
                                        │
NAT 表项建立 → 双方互相"认识"           ┘

Device A ↔ Device B: 加密数据传输(直连)

步骤 4:路径质量监测

ZeroTier 持续监测:
- RTT(往返延迟)
- 丢包率
- 路径稳定性

如果 P2P 失败 → 自动切换到 Moon/Planet 中继

3.2 NAT 类型支持

NAT 类型 打洞成功率 备注
Full Cone ✅ 100% 最理想
Address-Restricted Cone ✅ ~95% 常见家用路由器
Port-Restricted Cone ✅ ~85% 严格 NAT
Symmetric NAT ⚠️ ~30% 双 Symmetric 几乎无法直连

Symmetric NAT 解决方案:

  • 启用 UPnP/NAT-PMP
  • 使用 Moon 中继节点
  • 升级 IPv6(无 NAT)

3.3 通信端口

端口 协议 用途
9993 UDP 默认数据通信端口
443 TCP(fallback) HTTPS 中继(严格防火墙)

四、加密与安全

4.1 密码学栈

ZeroTier 1.x(当前主流稳定版本):

用途 算法
身份标识 Curve25519(公钥即身份)
密钥交换 Curve25519(ECDH)
对称加密 Salsa20/12(12 轮,AEAD 模式)
消息认证 Poly1305
哈希函数 SHA-512

ZeroTier 2.x(开发/早期版本,引入"Zero Trust Networking"重构):

用途 算法
身份标识 Curve25519 + Curve448(双轨制,未来抗量子准备)
密钥交换 Noise Protocol Framework(IK 模式)
对称加密 AES-256-GMAC-CTR(FIPS 140-2 兼容路径)
消息认证 AES-GMAC / Poly1305
哈希函数 SHA-384

版本说明

  • 1.x(推荐生产):算法成熟、性能稳定、生态完善
  • 2.x(实验性):合规友好、长期演进路线,但部分功能仍在迭代

4.2 双层身份验证

节点 ID(Node ID):10 位十六进制
   ↓
通过 Curve25519 公钥派生
   ↓
签名验证 + 工作量证明(POW)

网络 ID(Network ID):16 位十六进制
   ↓
Controller 节点 ID(前 10 位)+ 网络号(后 6 位)

4.3 安全特性

  • 端到端加密:Controller 也无法解密通信内容
  • 完美前向保密(PFS):每会话独立密钥
  • 抗重放攻击:序列号 + 时间戳
  • 签名认证:每个数据包都有签名
  • 网络隔离:私有网络需授权才能加入
  • ⚠️ 元数据可见:Controller 知道节点何时在线

五、生产环境配置实践

5.1 企业组网拓扑

图3:ZeroTier 企业组网拓扑

5.2 环境信息

角色 公网 IP 内网网段 ZeroTier IP 主机名
设备 A(总部网关) 1.1.1.1 192.168.1.0/24 10.147.20.1 hq-gateway
设备 B(分支网关) 2.2.2.2 192.168.2.0/24 10.147.20.2 branch-gateway
客户端 1 动态 - 10.147.20.10 laptop-1
客户端 2 动态 - 10.147.20.11 laptop-2

5.3 【步骤 1】创建网络

方法 1:使用官方 SaaS
  1. 访问 https://my.zerotier.com
  2. 注册账号并登录
  3. 点击 “Create A Network” 创建网络
  4. 记录 16 位 Network ID(如 a1b2c3d4e5f6789a
方法 2:自建 Controller
# 安装 ZeroTier
curl -s https://install.zerotier.com | sudo bash

# 启动服务
sudo systemctl enable --now zerotier-one

# 启用 Controller 模式(默认已启用)
sudo zerotier-cli controller info

# 创建网络
NWID=$(sudo zerotier-cli controller list networks)
echo "Network ID: $NWID"

5.4 【步骤 2】各节点安装 ZeroTier

Linux 安装
# 一键安装
curl -s https://install.zerotier.com | sudo bash

# 或使用包管理器
# Ubuntu/Debian
sudo apt install zerotier-one

# CentOS/RHEL
sudo yum install zerotier-one

# 启动服务
sudo systemctl enable --now zerotier-one

# 查看节点 ID
sudo zerotier-cli info
# 输出:200 info abc1234567 1.10.6 ONLINE
Windows 安装
# 下载安装包
# https://www.zerotier.com/download/

# 命令行查看状态
"C:\Program Files (x86)\ZeroTier\One\zerotier-cli.bat" info

# 加入网络
"C:\Program Files (x86)\ZeroTier\One\zerotier-cli.bat" join <Network ID>
macOS 安装
# 使用 Homebrew
brew install --cask zerotier-one

# 或下载 .pkg 安装包
# https://www.zerotier.com/download/
Docker 部署
docker run -d \
  --name=zerotier \
  --device=/dev/net/tun \
  --net=host \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_ADMIN \
  -v /var/lib/zerotier-one:/var/lib/zerotier-one \
  --restart=unless-stopped \
  zerotier/zerotier:latest

5.5 【步骤 3】加入网络

# 加入网络
sudo zerotier-cli join <Network ID>
# 输出:200 join OK

# 查看加入状态
sudo zerotier-cli listnetworks
# 输出:200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT IP>

重要:节点加入后需要在 Controller 端授权才能通信!


5.6 【步骤 4】Controller 端授权

Web 控制台授权
  1. 登录 https://my.zerotier.com
  2. 进入对应网络的 “Members” 页面
  3. 找到新加入的节点(10 位 Node ID)
  4. 勾选 “Auth”(授权)
  5. 可分配固定 IP 地址
命令行授权(自建 Controller)
# 列出网络成员
sudo zerotier-cli controller list networkmembers <Network ID>

# 授权节点
sudo zerotier-cli controller set <Network ID>=<Node ID> authorized=true

# 分配固定 IP
sudo zerotier-cli controller set <Network ID>=<Node ID> ipAssignments='["10.147.20.1"]'

5.7 【步骤 5】配置路由(站点互联)

要让两个内网(192.168.1.0/24 和 192.168.2.0/24)通过 ZeroTier 互通:

Controller 端:添加托管路由

在 Web 控制台 “Settings → Managed Routes” 添加:

Destination: 192.168.1.0/24    Via: 10.147.20.1   (总部网关)
Destination: 192.168.2.0/24    Via: 10.147.20.2   (分支网关)
网关节点:启用 IP 转发
# 启用 IPv4 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

# 配置 NAT(总部网关示例)
sudo iptables -A FORWARD -i zt+ -j ACCEPT
sudo iptables -A FORWARD -o zt+ -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o zt+ -j MASQUERADE

# 持久化(使用 iptables-persistent)
sudo apt install iptables-persistent
sudo netfilter-persistent save
客户端:允许托管路由

ZeroTier 客户端默认允许托管路由,可在系统托盘图标右键确认开启 “Allow Managed”。


六、Moon 节点(自建中继)

6.1 为什么需要 Moon?

  • 减少对官方 Planet 服务器的依赖
  • 加速跨地域通信(部署在自有 BGP 节点)
  • 国内网络环境下更稳定

6.2 部署 Moon 节点

# 1. 在公网服务器上安装 ZeroTier
curl -s https://install.zerotier.com | sudo bash

# 2. 进入工作目录
cd /var/lib/zerotier-one

# 3. 生成 Moon 模板
sudo zerotier-idtool initmoon identity.public > moon.json

# 4. 编辑 moon.json,添加 stableEndpoints
sudo vim moon.json
# 修改 stableEndpoints 字段:
# "stableEndpoints": ["1.2.3.4/9993"]

# 5. 生成签名后的 Moon 文件
sudo zerotier-idtool genmoon moon.json
# 生成 000000xxxxxx.moon 文件

# 6. 创建 moons.d 目录
sudo mkdir -p moons.d

# 7. 移动 Moon 文件
sudo mv 000000*.moon moons.d/

# 8. 重启服务
sudo systemctl restart zerotier-one

# 9. 验证 Moon 节点
sudo zerotier-cli listpeers | grep MOON

6.3 客户端添加 Moon

# 方法 1:通过 Moon ID 添加
sudo zerotier-cli orbit <Moon World ID> <Moon Seed>

# 方法 2:复制 .moon 文件到客户端
sudo cp 000000xxxxxx.moon /var/lib/zerotier-one/moons.d/
sudo systemctl restart zerotier-one

# 验证
sudo zerotier-cli listpeers | grep MOON

七、性能优化

7.1 端口与防火墙

# 服务端开放端口
sudo ufw allow 9993/udp
sudo iptables -A INPUT -p udp --dport 9993 -j ACCEPT

# 启用 UPnP(家庭路由器)
# 在路由器管理界面启用 UPnP,可大幅提升 P2P 成功率

7.2 MTU 优化

# 查看 ZeroTier 接口
ip link show | grep zt
# 默认 MTU 2800(高于普通 1500)

# 如果遇到分片问题,降低 MTU
sudo ip link set ztXXXXXX mtu 1400

# 持久化(写入网络配置)
# 在 Controller 端可以配置 mtu 参数

7.3 路径选择优化

# 查看路径质量
sudo zerotier-cli peers
# 重点关注 LATENCY 和 PATHS 字段

# 强制优先 IPv6(避免 NAT)
# 编辑 /var/lib/zerotier-one/local.conf
{
  "settings": {
    "primaryPort": 9993,
    "secondaryPort": 0,
    "tertiaryPort": 0,
    "allowSecondaryPort": false
  }
}

7.4 多网卡绑定

# 编辑 local.conf
{
  "settings": {
    "interfacePrefixBlacklist": ["docker", "br-"],
    "allowManagementFrom": ["10.0.0.0/8"]
  }
}

# 重启服务
sudo systemctl restart zerotier-one

八、故障排查

8.1 常见故障及解决方案

故障 1:节点显示 OFFLINE

排查步骤:

# 1. 查看服务状态
sudo systemctl status zerotier-one
sudo journalctl -u zerotier-one -n 50

# 2. 查看节点信息
sudo zerotier-cli info
# 应显示 ONLINE,如果是 OFFLINE 检查网络

# 3. 测试到根服务器的连接
ping 195.181.173.159  # ZeroTier Planet
# 或
curl -I https://my.zerotier.com

# 4. 检查防火墙
sudo iptables -L OUTPUT | grep 9993
sudo ufw status

# 5. 重启服务
sudo systemctl restart zerotier-one
故障 2:P2P 直连失败(一直走中继)

排查步骤:

# 1. 查看对等节点路径
sudo zerotier-cli peers
# 关注 PATHS 字段:DIRECT 优于 RELAY

# 2. 检查 NAT 类型
# 工具:https://github.com/jechols/checknat
# 或使用在线 STUN 测试

# 3. 启用 UPnP
# 路由器管理界面 → 启用 UPnP 或 NAT-PMP

# 4. 配置端口转发
# 路由器 → 端口转发 → UDP 9993 → 客户端 IP

# 5. 部署 Moon 节点(绕过 Symmetric NAT)
# 见上文 Moon 节点部署
故障 3:网络已加入但无法通信

排查步骤:

# 1. 检查授权状态
sudo zerotier-cli listnetworks
# STATUS 应为 OK,如果是 ACCESS_DENIED 需要在 Controller 授权

# 2. 检查 IP 分配
ip addr show ztXXXXXX
# 应有 ZeroTier 分配的 IP 地址

# 3. 测试同网络其他节点
ping <对端 ZT IP>

# 4. 抓包诊断
sudo tcpdump -i ztXXXXXX -n
sudo tcpdump -i any -n udp port 9993

# 5. 查看 ACL 规则
# 在 Web 控制台 Flow Rules 中检查规则配置

8.2 诊断命令汇总

# ==================== 状态查看 ====================
sudo zerotier-cli info             # 节点信息
sudo zerotier-cli status           # 服务状态
sudo zerotier-cli listnetworks     # 已加入的网络
sudo zerotier-cli listpeers        # 对等节点列表
sudo zerotier-cli peers            # 同 listpeers
sudo zerotier-cli dump             # 完整诊断信息

# ==================== 网络管理 ====================
sudo zerotier-cli join <NWID>      # 加入网络
sudo zerotier-cli leave <NWID>     # 离开网络
sudo zerotier-cli orbit <Moon> <Seed>  # 添加 Moon
sudo zerotier-cli deorbit <Moon>   # 移除 Moon

# ==================== Controller(自建) ====================
sudo zerotier-cli controller info
sudo zerotier-cli controller list networks
sudo zerotier-cli controller list networkmembers <NWID>
sudo zerotier-cli controller set <NWID>=<MID> authorized=true

# ==================== 调试日志 ====================
# 修改日志级别(编辑 local.conf)
sudo vim /var/lib/zerotier-one/local.conf
{
  "settings": {
    "logLevel": "trace"
  }
}
sudo systemctl restart zerotier-one
sudo journalctl -u zerotier-one -f

九、安全加固建议

9.1 网络访问控制(Flow Rules)

ZeroTier 提供强大的 Flow Rules(流规则)功能,可在 Controller 配置:

# 默认拒绝所有
drop;

# 允许 ARP
accept ethertype arp;

# 允许 IPv4
accept ethertype ipv4;

# 仅允许 SSH
accept ipprotocol tcp dport 22;

# 阻止 RDP(3389)
drop ipprotocol tcp dport 3389;

# 标签匹配(仅允许 dev 标签的节点)
accept tag 1 == 100;

9.2 节点准入控制

# 启用网络私密性(默认)
# Web 控制台 → Settings → Access Control → Private

# 配置 SSO(企业版)
# 支持 Okta、Azure AD 等 SAML/OIDC

# 节点准入审批
# 默认所有新节点需手动 Auth
# 可配置邮件通知

9.3 监控与审计

# 监控对等节点状态
watch -n 1 'sudo zerotier-cli peers'

# 流量统计
sudo zerotier-cli listnetworks -j | jq
# 关注 portDeviceName, mac, broadcastEnabled 等字段

# 流日志(企业版功能)
# Controller 可配置流日志输出到 SIEM 系统

9.4 密钥安全

# 备份节点身份(重要!)
sudo cp /var/lib/zerotier-one/identity.public ~/zt-identity.public.bak
sudo cp /var/lib/zerotier-one/identity.secret ~/zt-identity.secret.bak

# 设置严格权限
sudo chmod 600 /var/lib/zerotier-one/identity.secret

# 节点 ID 与密钥一一对应
# 切勿在多台设备共用相同 identity.secret

十、高级应用场景

10.1 Kubernetes 跨集群组网

# DaemonSet 部署 ZeroTier
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: zerotier
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: zerotier
  template:
    metadata:
      labels:
        app: zerotier
    spec:
      hostNetwork: true
      containers:
      - name: zerotier
        image: zerotier/zerotier:latest
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN", "SYS_ADMIN"]
        volumeMounts:
        - name: zt-data
          mountPath: /var/lib/zerotier-one
        env:
        - name: ZEROTIER_NETWORK_ID
          value: "a1b2c3d4e5f6789a"
      volumes:
      - name: zt-data
        hostPath:
          path: /var/lib/zerotier-one

10.2 IoT 设备远程管理

# 树莓派/Edge 设备一键加入
curl -s https://install.zerotier.com | sudo bash
sudo zerotier-cli join <Network ID>

# 配合 SSH 端口转发
# 在中心服务器创建跳板
ssh -L 22000:<IoT-ZT-IP>:22 user@gateway

# 远程访问 Web 界面
# http://<IoT-ZT-IP>/

10.3 游戏联机

# Minecraft / 红警 / 帝国时代等局域网游戏
# 1. 所有玩家加入同一 ZeroTier 网络
# 2. 启用 "Allow Ethernet Bridging"
# 3. 启用 "Allow Multicast"
# 4. 在游戏内通过虚拟 IP 创建/加入房间

10.4 异地多活灾备

站点 A(主) ─┐
              ├── ZeroTier 网络 ── 监控/调度
站点 B(备) ─┘

# 配合 Keepalived + DNS
# 故障自动切换
# RPO < 1 分钟

十一、常见问题 FAQ

Q1: ZeroTier 收费吗?

ZeroTier 提供免费和付费版本:

计划 价格 设备数 特性
Free 免费 50 台 基础功能
Professional $5/月 100 台 + SSO、API
Business $50/月 500 台 + 优先支持、自定义 Controller
Enterprise 联系销售 无限 + SLA、本地部署

Q2: ZeroTier 如何处理 Symmetric NAT?

方案:

  1. 启用 UPnP / NAT-PMP
  2. 路由器配置 1:1 NAT
  3. 部署 Moon 中继节点
  4. 升级 IPv6 网络
  5. 极端情况下使用 TCP fallback(443 端口)

Q3: ZeroTier 性能如何?

  • 延迟:P2P 直连接近原生网络
  • 吞吐量:受 CPU 加密性能限制(千兆设备 ~500-800Mbps)
  • 建连时间:通常 <5 秒(NAT 友好环境)
  • 资源消耗:CPU < 5%(空闲),内存 < 50MB

Q4: ZeroTier 在国内使用?

  • ✅ 大部分时间可用,依赖根服务器连通性
  • ⚠️ 偶发不稳定,建议自建 Moon 节点
  • 💡 推荐部署:阿里云 / 腾讯云 + Moon
  • 💡 可结合 IPv6 网络绕过 NAT

Q5: 如何选择 ZeroTier vs WireGuard?

场景 推荐
多设备 Mesh 组网 ZeroTier(自动)
高性能点对点 WireGuard(内核态)
跨地域 SD-WAN ZeroTier(一键部署)
严格性能要求 WireGuard(更轻量)
复杂 NAT 环境 ZeroTier(自动穿透)
移动端漫游 WireGuard(更省电)

十二、总结

ZeroTier 凭借创新的"软件定义 P2P 网络"架构,实现了零配置全球组网的愿景。

核心要点回顾:

  1. P2P 直连为主:低延迟、节省带宽、去中心化
  2. 零配置体验:加入 Network ID 即可联网
  3. 完整加密:Curve25519 + Salsa20/12 + Poly1305 端到端加密(1.x),2.x 转向 Noise+AES-GMAC-CTR
  4. 强大的 ACL:Flow Rules 实现细粒度访问控制
  5. 混合云友好:跨云、跨地域、跨平台

适用场景:

  • ✅ 中小企业 SD-WAN 组网
  • ✅ 远程办公和移动接入
  • ✅ IoT 设备远程管理
  • ✅ 跨地域 Kubernetes 组网
  • ✅ 游戏联机和团队协作
  • ⚠️ 极致性能场景(推荐 WireGuard)
  • ⚠️ 完全离线网络(依赖控制平面)

ZeroTier 已被全球数十万用户和企业采用,是开源 SD-WAN 领域的标杆项目。


参考文献

  1. ZeroTier Manual
  2. ZeroTier GitHub
  3. ZeroTier 白皮书
  4. P2P NAT Traversal - RFC 5128
  5. Curve25519 - RFC 7748
  6. Salsa20 加密算法
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐