ZeroTier 用自有的 VL1 做加密传输,用 VL2 模拟以太网。它不是 IPsec 或 WireGuard。截至 2026-10-12,最新正式标签是 1.16.2(2026-05-28)。本文记录许可证和结构,不含加入步骤。

ZeroTier 是什么

一个可独立引用的定义句:ZeroTier 把密码学编址的对等网络(VL1)和一层类似虚拟以太网的仿真(VL2)叠在一起;节点用 40 比特地址标识,虚拟网络用 64 比特网络号标识。

协议页(页脚日期 2025-09-05)写明:协议是原创的,有些方面类似 VXLAN 和 IPsec,但这个类比不表示协议或设计相同。VL2 因此不能写成 RFC 7348 的实现。仓库 README 用的自我介绍是 “a smart programmable Ethernet switch for planet Earth”。

虚拟网卡上的二层与三层差别见 TUN 与 TAP。ZeroTier 的文档把对外呈现的东西写成以太网,而不是一块只承载 IP 的 TUN。

仓库、公司与维护者

GitHub 仓库 zerotier/ZeroTierOne 创建于 2013-04-24。标签 1.16.2 的 version.h 把修订号写成 2,版权行是 ZeroTier, Inc.。协议页写明,地球上的那一组根服务器(planet)由 ZeroTier, Inc. 作为免费服务运营。

本次读取的贡献计数中,adamierymenko 为 4161,glimberg 为 1526,joseph-henry 为 645。计数会变,不是职务名单。协议页提到 2014 年由 “original author” 写的一篇博客,用来解释 VL1 的设计理由。本文没有打开那篇文章,也不把提交最多的登录名写成创始人的法律姓名。

许可证:MPL-2.0 与 source-available 分成两块

标签 1.16.2 的 LICENSE.txt 把仓库拆成三句:

  • node/、osdep/、service/ 以及除 ext/ 和 nonfree/ 以外的代码,见 LICENSE-MPL.txt。原文在 osdep/ 后面多了一个句号,目录名仍是这三个。
  • nonfree/ 见 nonfree/LICENSE.md,原文称之为 non-free、source available。
  • ext/ 是为了编译方便或兼容而带上的外部代码,保留原来的许可证。本文没有清点 ext/ 里每一份许可证。

LICENSE-MPL.txt 是 Mozilla Public License 2.0。MPL-2.0 在 OSI 的开源许可证名单上。nonfree/LICENSE.md 的标题是 “ZeroTier SOURCE-AVAILABLE LICENSE”,版本 1.0,版权行为 Copyright (c) 2025 ZeroTier, Inc.。文末写明:这部分软件 source-available,但不是 Open Source Initiative 所定义的开源。同一文件把角色说成:名为 ZeroTier Agent 的部分用 MPL-2.0;位于 nonfree/ 的 Controller 及相关组件用这份 source-available 许可证。

这份文本把商业使用定义得很宽,包括为营利公司、政府或军事机构、非营利组织的利益而使用,也包括放进产品、平台或服务。非商业使用则限于个人的非商业环境、学生(而不是机构)的教学研究,以及不超过 30 天的评估。商业使用需要与 ZeroTier, Inc. 另签商业许可。文本还写明不授予专利权,并写明以美国加利福尼亚州法律为准据法。以上是许可证里的定义,不是法律意见。

许可沿革只能按提交说明来记,不能收成「现在仍是 BSL」:

提交日期说明里能核对的句子
52a166a71f2019-08-23标题为 “Relicense: GPLv3 -> ZeroTier BSL 1.1”。本文没有打开那次提交的许可证全文
06730c7d1d2020-08-20标题为 “BSL date bump”
6623aa3a7d2025-08-21标题为 “License files.”。标签 1.16.2 根目录已经不再用 BSL 这个文件名

GitHub 对整仓给出的 SPDX 是 NOASSERTION,与这种分段结构相符。

另有一处文件头没有并进上表:node/Salsa20.hpp 写明它基于公有领域代码,并自称公有领域;LICENSE.txt 又把 node/ 指向 MPL-2.0。两句同时存在。本文不判断哪一句在法律上优先。

架构:VL1、VL2、根与控制器

协议页把两层的职责写成:

层该页中的角色
VL1对等传输,称为虚拟线路。负责找到对端并加密
VL2类似 VXLAN 的以太网仿真,带多播、规则和基于证书的访问控制
根(planet / moon)VL1 的发现与转发。planet 只有一个,根由 ZeroTier, Inc. 运营;moon 是使用者自己增加的根
网络控制器VL2 的配置管理者和证书机构。网络号的前 40 比特就是控制器的地址,后 24 比特区分这台控制器上的网络

协议页强调:两个节点即使共同加入多个虚拟网络,它们之间仍然只有一条 VL1 路径。根和控制器通常不是同一台机器,尽管一个节点可以兼做。把控制器当成「必须转发所有流量的网关」与该页的分工不符。

没有直连时,该页把路径写成:包先向上交给根,根在转发的同时给出会合提示,两端再尝试直接连通;直连失败就继续经根中继,并周期性重试。文档把这种中继写成免费但慢。这是项目的表述,不是本文的测速。客户端配置页把 UDP 9993 写成默认主端口。这是默认值记录,不是部署步骤。发现与打洞的概念背景见 VPN NAT 穿越与打洞。

身份是一对密钥加上由此算出的 40 比特地址。标签 1.16.2 的 node/Identity.hpp 写明:地址由公钥导出,使故意碰撞已有地址的搜索代价很高;序列化时有一个表示 C25519/Ed25519 的类型字节。协议页补充了两句它自己的估计:行星根上的身份在闲置约 60 天后过期;按该页的算法,故意碰撞大约需要 1 万 CPU 年(举例为 3 GHz 的 Intel 核心)。这是 2025-09-05 那一页的估计,不是本文的计算。同一页还写当时有四台根,且几乎各地都有一台往返低于 100 毫秒。本文没有在 2026-10-12 重新清点根的数量或延迟。

控制器签发的凭据由控制器私钥签名,再在需要通信的成员之间传递。该页列出的种类是:成员证书(Certificate of Membership)、吊销、能力(capability)、标签(tag),以及所有权证书(目前用于约束 IP 地址冒用)。成员证书用时间戳窗口判断是否仍然相符,从而减轻对节点本地时钟的依赖。控制器自己的时钟,该页要求大致准确到 30–60 秒以内。时钟偏差的一般影响见 系统时间不准时 VPN 为何握手失败。

加密:协议页与 1.16.2 源码不是同一句话

协议页的密码学一节写明:非对称部分是 Curve25519/Ed25519;每个 VL1 包用 256 比特 Salsa20 加密,并用 Poly1305 做加密后再认证(encrypt-then-MAC),组合方式与 NaCl 参考实现相同。同一节写明,VL1 没有实现前向保密,理由是简单、可靠、代码体积,以及频繁变换状态会让集群和故障转移更难。该页建议需要前向保密的人在 ZeroTier 之上再使用本身带这一性质的协议,例如 SSL 或 SSH。这是文档里的建议,不是本文的部署步骤。前向保密的一般含义见 VPN 前向保密(PFS)是什么。

标签 1.16.2 的源码比这一段更细,而且没有被协议页写进去:

  • Packet::armor 在传入 AES 密钥并且要加密载荷时,使用 ZT_PROTO_CIPHER_SUITE__AES_GMAC_SIV。
  • 否则使用 ZT_PROTO_CIPHER_SUITE__C25519_POLY1305_SALSA2012,注释写的是 Salsa20/12。不加密载荷的 HELLO 可以走 C25519_POLY1305_NONE。IncomingPacket.cpp 的注释写明,HELLO 是唯一以明文发送的包。
  • Peer::aesKeysIfSupported() 在对端协议版本 _vProto >= 12 时返回 AES 密钥,否则返回空指针,从而落到 Salsa20/12 那条路径。

因此「现在的包都是 Salsa20」只在协议页那一句里成立。1.16.2 的代码按对端版本在 AES-GMAC-SIV 和 Salsa20/12 之间分支。本文没有再证明 Salsa20/12 的轮数是否等于协议页所说的 Salsa20,也没有审计源码里是否出现了与「不做前向保密」相矛盾的新路径。协议页的日期是 2025-09-05,标签是 2026-05-28。

协议页还描述了 trusted path:在指定的物理路径上可以跳过加密和认证,以换取更低的 CPU 开销,同时失去传输安全。同一页写明不建议在并非真正需要时使用。本文不记录如何打开它。

文档中的典型用途

这些是协议页里的形态,不是建议:

  • 把位于不同网络里的设备放进同一个虚拟以太网,使它们像接在同一台交换机上。
  • 由控制器决定谁是成员,并用规则和凭据表达哪些流量可以过。规则引擎有单独的文档页,这里不抄规则语言。
  • 在局域网或需要二层延伸时,由控制器把某个成员指定为网桥。普通成员不能随意以别人的 MAC 发送。该页写明桥接的具体做法超出那份手册。
  • 可以关掉成员证书检查,做成公开网络;也存在没有控制器的 ad-hoc 网络,只允许一定端口范围内的 IPv6 TCP/UDP 单播。两者都被写成公开的。本文不给出网络号,也不提供加入步骤。

IPv6 方面,该页描述了 rfc4193 与 6plane 两种编址:地址里编码了 ZeroTier 身份,节点可以在本地应答匹配的 NDP,从而少一次组播查询。RFC 4193 定义的是 IPv6 唯一本地地址。6plane 是 ZeroTier 自己的编址,不是那份 RFC 的同义词。

它不实现 IKE,也不提供 SOCKS 或 HTTP 入口。应用层代理是另一类软件,见 HTTP 代理与 VPN 有何不同。

和相关项目差在哪

项目重心与 ZeroTier 的边界
ZeroTier自有的 VL1/VL2,对外是虚拟以太网根负责找路,控制器负责凭据
Nebula证书、分组和三层 TUN发现节点叫 lighthouse,数据面不是 VL1。见 Nebula 是什么
WireGuard精简隧道协议身份是静态公钥,没有 VL2 这一层以太网仿真。见 WireGuard 与 OpenVPN
HeadscaleTailscale 控制服务器数据面是客户端上的 WireGuard。见 Headscale 是什么
strongSwan / IPsecIKE 与 ESP使用 RFC 7296 等公开规范。见 strongSwan 是什么

引用时先分开的五件事

  1. 开源与否要拆开说:Agent 一侧是 MPL-2.0;nonfree/ 的控制器是 source-available,文本自己声明不是 OSI 定义的开源。
  2. 2019 年的 BSL 只存在于那次提交的标题里。标签 1.16.2 的现行文件不是 BSL。
  3. 密码算法:协议页写 Salsa20 与 Poly1305,且写明没有前向保密。1.16.2 的 Packet::armor 在协议版本不低于 12 时改走 AES-GMAC-SIV。
  4. 「四台根」「低于 100 毫秒」「约 1 万 CPU 年」都来自 2025-09-05 的协议页,本文没有复测。
  5. node/Salsa20.hpp 的公有领域声明和仓库对 node/ 的 MPL 指向同时存在。

本文只整理公开资料。组网仍然要遵守网络所有者和当地法规的要求;这里不讨论绕过访问控制的做法。

主要资料

  • 协议说明:The Protocol(页脚日期 2025-09-05)
  • 文档索引:How ZeroTier Works
  • 源码与标签 1.16.2:zerotier/ZeroTierOne
  • 许可证:该标签的 LICENSE.txt、LICENSE-MPL.txt、nonfree/LICENSE.md
  • 源码中的加密分支:node/Packet.cpp 的 Packet::armor,node/Peer.hpp 的 aesKeysIfSupported
  • IPv6 唯一本地地址:RFC 4193。VXLAN(仅作类比的参照,不是 VL2 的规范):RFC 7348