ZeroTier One 版本发布说明深度解读:从 1.2 到 1.16 的关键演进与配置实战
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
本篇技术指南以仓库根目录的 RELEASE-NOTES.md 为骨架,逐版本梳理 ZeroTier One 从 1.2 到 1.16 的核心更新,并结合node/、service/、include/等目录下的真实源码,讲清每个特性在代码中的落点——例如ZT_MAX_NETWORK_SPECIALISTS容量上限、enableMetrics与encryptedHelloEnabled两个local.conf开关、多线程包 I/O 与 multipath 的实现位置。读完本文,你将能够对照源码理解各版本更新背后的设计意图,并直接上手配置 1.16 系列引入的新选项。
版本总览:ZeroTier One 的发布节奏
从 RELEASE-NOTES.md 可以看出,ZeroTier One 的 1.x 主线大致分为三个阶段:
- 1.2.x(2017 年):奠定现代架构,引入规则引擎、联邦根(federated roots)、multipath 前身的多路径选择。
- 1.4.x – 1.6.x(2019 – 2021 年):引入 multipath 正式支持、DNS 推送、AES-GMAC-SIV 加密模式、Apple Silicon 支持,并完成从 GPL3 到 BSL 1.1 的许可证变更。
- 1.8.x – 1.16.x(2021 年至今):SSO/OIDC 完善、低带宽模式、Prometheus 指标、多线程包 I/O、HELLO 包加密、网络特定中继,以及 1.16.0 的 MPL 许可证重构。
官方在 1.10.2 的说明中明确提到“大部分开发精力已投入 2.0 版本”(Most of our dev effort is going into version 2),因此 1.x 的更新更多是稳定性修复与 2.0 特性回移(back-port)。
1.16.2:容量上限翻倍与安装修复
发布于 2026-05-20 的 1.16.2 是当前最新版本,核心变化如下:
ZT_MAX_NETWORK_SPECIALISTS从 256 提升到 512
当网络中配置了过多的“特殊节点”(active bridges、multicast replicators、always-contact 地址等)时,旧上限 256 会导致配置溢出。该版本将其翻倍至 512,并同步提升了网络配置字典(network config dictionary)的容量。
源码落点非常清晰:宏定义位于 include/ZeroTierOne.h 的#define ZT_MAX_NETWORK_SPECIALISTS 512,而在 node/NetworkConfig.cpp 与 node/NetworkConfig.hpp 中,activeBridges()、multicastReplicators()、alwaysContactAddresses()三个访问器都以该宏为数组边界,specialists[ZT_MAX_NETWORK_SPECIALISTS]直接决定每份网络配置的内存布局。提升宏值即可让大型网络的 specialists 配置全部生效,避免被静默截断。
其他修复
- Windows ARM x64 安装:修复
zttap300.inf的换行符问题。该驱动安装描述文件位于 windows/TapDriver6/zttap300.inf,与 1.12.0 引入的实验性 Windows ARM64 支持一脉相承。 - Central Controller (CV1) 内部更新:包含 schema 变更与多架构 Docker 构建流水线,对应仓库中的 ext/central-controller-docker 目录及其迁移脚本
migrations/*.sql。 - Windows 下切换网络延迟问题:修复从离开一个网络到加入另一个网络时偶发的数分钟级卡顿。
- 编译器告警清理:覆盖 GCC 14、Clang 18、Clang 21 三个工具链。
1.16.1:指标采集默认关闭
1.16.1(2025-12-22)最重要的行为变更是:Metrics 收集默认关闭,需在local.conf中显式设置"enableMetrics": true开启。同时修复了 daemon 模式下指标不记录、以及 debug dumpfile 被写到根目录的问题。
在 service/OneService.cpp 中可以找到精确的读取逻辑:
bool enableMetrics = OSUtils::jsonBool(settings["enableMetrics"], false); if (enableMetrics) { ... }默认值false与发布说明一致。开启后,Prometheus 兼容指标会输出到 home 目录下的metrics.prom文件(见 service/OneService.cpp 与 service/OneService.cpp 中对metrics.prom的写入)。该能力最早在 1.12.0 引入,1.16.1 起改为白名单式开启以降低默认开销。
一个完整的local.conf参考结构(完整字段说明见 service/README.md):
{ "settings": { "enableMetrics": true, /* 收集指标到 metrics.prom */ "encryptedHelloEnabled": false, /* HELLO 包加密,1.16.0 新增 */ "lowBandwidthMode": false, /* 低带宽模式,1.10.3 引入 */ "forceTcpRelay": false, /* 强制 TCP 中继,1.10.3 引入 */ "primaryPort": 9993, "portMappingEnabled": true } }此外,1.16.1 还包含 Mac 与 BSD 的 tun/tap 代码小幅修复。
1.16.0:许可证重构与新中继架构
1.16.0(2025-08-21)是近几年轻量版本中变化最大的一次发布。
许可证:核心 MPL,控制器转为商用源码可用
- 核心(
node/与include/)及服务(service/与osdep/)改为Mozilla Public License (MPL),对应仓库根目录的 LICENSE-MPL.txt。 - 网络控制器(
controller/)改为商业源码可用许可,其实现位于 nonfree/controller(EmbeddedNetworkController.cpp、FileDB.cpp、PostgreSQL.cpp等)。 - 默认二进制构建不再包含控制器;如需构建非 MPL 组件,使用:
make ZT_NONFREE=1按发布说明,使用ZT_NONFREE=1构建出的可执行文件许可证会从 MPL 变为专有商业许可。仓库中 objects-nonfree.mk 与 nonfree/CMakeLists.txt 即为非 MPL 组件的构建入口。
网络特定中继(Network-Specific Relays,预览/测试)
这是 1.16.0 最值得关注的功能:可以指定一个或多个节点作为某特定网络的专属中继,当网络成员之间的流量需要中继时,优先走这些网络特定中继而不是全局根服务器(roots)。关键设计点是:这些中继节点不一定是该网络的成员。
从源码结构看,该能力已进入核心拓扑逻辑——node/Topology.hpp 中出现了network preferred relay的判断注释(True if this is a root server or a network preferred relay from one of our networks),说明中继选择路径已在 Topology 层落地。官方明确表示:Moons(自建根)进一步被降级为“更加弃用”,新部署不应再使用;网络特定中继在更多用户实测与内部验证完成前仍属预览特性。
HELLO 包加密:encryptedHelloEnabled
HELLO 包是节点握手时的首个数据包。1.16.0 提供可选加密,通过local.conf的encryptedHelloEnabled开启:
{ "settings": { "encryptedHelloEnabled": true } }读取代码位于 service/OneService.cpp:
_node->setEncryptedHelloEnabled(OSUtils::jsonBool(settings["encryptedHelloEnabled"], false));发布说明指出:HELLO 包本身不含业务数据,只携带公钥与极少量元数据(如协议版本号)。大多数用户无需开启;若因合规等原因需要,可开启,代价是 HELLO 握手阶段少量 CPU 与带宽开销。
小修复与工程化
- 全库改用
clang-format统一格式,仓库中.clang-format定义与make clang-format目标可一键格式化所有核心与服务 C++ 文件。 - 网桥不再计入组播(multicast)上限,且组播会发送给所有网桥——对应 PR #2477,逻辑位于 node/Multicaster.cpp 的
activeBridges处理。 - 修复 multipath 场景下桥接流量的一条流标识(flow designation)问题。
- OIDC 等库版本升级;出于预防性考虑删除陈旧未用的软件更新代码。
- 新增 OpenTelemetry 支持(Central Controllers),相关依赖位于 ext/opentelemetry-cpp-api-only。
- 支持从 Docker 环境变量注入
local.conf内容(PR #2445),对应 ext/central-controller-docker/main.sh 中的配置生成逻辑。
1.14 系列:多线程包 I/O 与 multipath 打磨
1.14.1:Linux 多线程包 I/O
1.14.1(2024-09-12)引入多线程包 I/O,目前仅限 Linux,且必须在local.conf中启用。官方评估:该特性对“CPU 是瓶颈且追求高吞吐”的小型多核设备收益最大。难点在于保持报文顺序与负载均衡的平衡,这也是它暂不默认开启、需充分测试的原因。同时该版本向网络控制器上报节点平台信息(OS、CPU 架构),便于网络管理员查看并用于未来的策略检查与资产盘点。
1.14.0 与 1.14.2
- 1.14.0:Linux 高负载下 I/O 性能改进、multipath 改进、修复离线一段时间后的端口重绑定“coma”问题、修复规则引擎歧义(GitHub Issue #2200)、控制器 API 支持节点名称与元数据。
- 1.14.2:修复 macOS Sequoia 缺失 entitlement、修复
local.conf中低带宽模式解析问题。
更早版本的关键演进回顾
1.12.x:指标与 ARM64
- 1.12.0:实验性 Windows ARM64 支持、macOS 休眠/唤醒修复、Prometheus 兼容指标(即后续
metrics.prom的源头)、Linux 10–30% 提速。 - 1.12.1/1.12.2:Linux 端口绑定修复;macOS 全隧道模式改进与网络设置变更后更快恢复。
1.10.x:低带宽模式、forceTcpRelay 与 multipath 成熟
- 1.10.2:multipath 的 CLI 输出改进、balance-aware 模式、自定义策略、链路质量测量优化。
- 1.10.3:新增low-bandwidth mode与forceTcpRelay(可选)。二者在源码中均有对应:
config.lowBandwidthMode的赋值见 service/OneService.cpp,forceTcpRelay的解析见 service/OneService.cpp——其中还包含一条重要约束:forceTcpRelay 与 multipath(bond)不能同时使用,若同时启用会打印警告并自动禁用 forceTcpRelay(forceTcpRelay cannot be used with multipath)。TCP 中继本身受allowTcpFallbackRelay控制(默认 true)。 - 1.10.4:Windows 安全修复(见下文)。
- 1.10.5/1.10.6:Windows 高 CPU 修复、macOS 临时 IPv6 地址绑定预防、路径学习环路预防。
1.8.x:SSO/OIDC 与“coma”问题攻坚
1.8 系列围绕 SSO/OIDC 做了大量修复(1.8.9 修复“幽灵”包认证失败、SSO 内存泄漏、节点证书推送失败、离开 SSO 网络死锁等),同时在 1.8.0 引入次级端口自动重绑定机制:当 NAT/路由器异常导致服务长时间离线时,ZeroTier 会分配新的次级端口(除非在local.conf中手动指定),这是对“connection coma”问题的持续对抗。1.8.1 起 Windows 7 不再受支持。
1.6.x:AES-GMAC-SIV、multipath 与 Apple Silicon
1.6.0 是从 2.0 分支回移特性的“大版本”:
- AES-GMAC-SIV 加密模式:在支持 AES 加速的硬件(几乎所有 x86-64、多数 ARM64)上比旧的 Salsa20/12-Poly1305 更快且安全性更优,基于 AES-SIV 实现并经过 Trail of Bits 审计。已知限制:32 位 ARM、PowerPC、MIPS 暂不支持硬件 AES 加速。
- Multipath 正式支持:模式借鉴 Linux 内核 bonding 驱动,含 active-passive 与 active-active,支持快速故障切换与负载均衡。bond 相关实现位于 node/Bond.cpp 与 node/Bond.hpp。
- DNS 配置推送:控制器可向节点推送 DNS 配置,节点侧可本地配置是否允许(对应 JSON API 中
/network/<id>的allowDNS可写字段,见 service/README.md)。 - Apple Silicon 原生支持:通过 universal binary 提供 macOS ARM64 支持。
1.4.x 与 1.2.x:规则引擎与路径选择重构
- 1.4.0:macOS 不再依赖内核扩展(改用 feth 接口)、并发多路径、底层 QoS 预留;1.4.4 起许可证从 GPL3 改为 BSL 1.1。
- 1.2.6:路径选择大改、远程追踪(remote tracing)、指定组播复制器、ARM NEON 加密加速;1.2.4 集成 supercop 的 Salsa20/12 汇编实现(x86-64 最高 2 倍加密加速);1.2.0 引入规则引擎(distributed network packet filtering,对应仓库的 rule-compiler 目录)与联邦根(federated roots,即
moons.d/)。
安全相关更新汇总
发布说明中值得重点记录的安全条目:
- 1.10.4(Windows):修复服务工作目录文件权限问题,未授权本地用户可能读取特权文件并管理本地实例;不可远程利用,仅影响 Windows。
- 1.8.8(Windows):修复安装器中本地提权漏洞。
- 1.6.6:回移 COM 哈希检查,缓解网络成员冒充。
- 1.8.1:进一步加强对网络内地址冒充的防御。
- 1.2.12:修复控制 API 无效 URL 可能导致的崩溃(需管理员权限,不可利用)。
升级建议:Windows 用户应至少升级至 1.10.4 以规避本地权限问题,所有平台用户建议跟踪 1.16 系列以获得最新修复。
结语:如何对照源码继续深入
本文所有结论均可在当前仓库中验证:
- 版本变更总览:RELEASE-NOTES.md
local.conf完整字段与 JSON API 说明:service/README.md- specialists 上限与网络配置结构:include/ZeroTierOne.h、node/NetworkConfig.hpp、node/NetworkConfig.cpp
- 配置解析与服务主循环:service/OneService.cpp
- 中继/拓扑选择逻辑:node/Topology.hpp、node/Switch.cpp
- 非 MPL 控制器组件:nonfree/controller
对于 1.16 系列的运维者,实操清单是:确认ZT_MAX_NETWORK_SPECIALISTS扩容是否解决大型网络 specialists 截断;按需在local.conf开启enableMetrics与encryptedHelloEnabled;新部署避免使用 Moons,关注网络特定中继的后续正式化进展;Linux 多核低端设备可尝试启用多线程包 I/O 观察吞吐变化。
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考