5分钟看懂 ZeroTierOne:虚拟组网源码结构与部署红线
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
ZeroTierOne(即 ZeroTier One)把分散在各地的设备、虚拟机和容器接进同一张虚拟以太网,解决跨网络、跨 NAT 的直连组网难题。新人上手最容易卡在三处:代码分几层、哪些目录是开源、哪些功能要授权、构建怎么选。下面给出 3 条许可红线和 2 条构建路径,读完就能安全动手。
ZeroTierOne 是什么:写进代码里的全球以太网交换机
一句话定义:ZeroTierOne 是一台"行星级智能可编程以太网交换机"。它分两层工作:底层 VL1 是加密 P2P 网络,负责把节点两两打通;上层 VL2 是类似 VXLAN 的以太网仿真层,让流量看起来像在同一个交换机里转发,并附带细粒度 ACL 做网络微分段。
打开仓库,目录结构和这个定义立刻对上:
- node/:核心引擎,纯 OS 无关,官方称之为 "the real ZeroTier";
- osdep/:各平台的 tap 设备与网络实现;
- service/:守护进程本体,对外暴露 JSON API;
- nonfree/controller/:网络控制器,许可独立(下文细说);
- include/ZeroTierOne.h:核心引擎对外的 C API。
为什么这样分层:三个最容易被看错的地方
先说核心:node/ 里几乎不放操作系统代码
node/README.md 把核心引擎的职责压缩成一句话:给它 wire 层的包,它回你以太网包,反之亦然。整个目录"不含任何实际 I/O、端口配置或其他 OS 相关代码",唯一例外是Utils::getSecureRandom()。再翻 objects.mk,CORE_OBJS清一色node/*.o,只多了一个osdep/OSUtils.o——核心层和平台层在构建文件里就分得清清楚楚。
易错点:node/ 内禁止使用 C++11/14 特性和复杂 C++ 语法,因为这套代码要能移植到小型嵌入式系统。往这里塞平台相关代码,会直接违背项目约定。
再看平台层:local.conf 里藏着一个危险开关
服务层的配置文档在 service/README.md,它解释了local.conf这个 JSON 文件的全部字段。其中最容易踩坑的是trustedPathId:
"physical": { "10.10.10.0/24": { "trustedPathId": 101010024 } }隐藏条件:同一个物理网络下的所有设备必须配置相同的 trusted path ID 才会生效,缺一个就白配。而且 trusted path 会直接跳过加密和认证,官方原文是 "Only use this if you know what you are doing"。另外记住默认端口:ZeroTier 服务默认监听 UDP 9993,settings段还能改 secondary/tertiary 端口、开关 uPnP 端口映射,这些都是 NAT 打洞时的调优点。
最后是许可边界:默认构建不含控制器
这是选型决策者必须知道的第三条红线。按 RELEASE-NOTES.md,1.16.0 起仓库许可被切成两块:node/、osdep/、service/全部走 MPL-2.0,见 LICENSE-MPL.txt §3.3(Larger Work)——改动的源文件以同许可发布即可,链接进来的其他文件不受约束。而 nonfree/controller/ 走 "Source-Available 非商用许可",商用必须单独签约。
触发前提:控制器默认不会编进守护进程。显式make ZT_NONFREE=1或 CMake 传-DZT_NONFREE=ON才会把 FileDB 控制器编译进来,且产物整体转为专有许可。说白了,默认产物是纯 MPL 的,控制器是选配。CMakePresets.json 里专门备了linux-free-release(ZT_NONFREE=OFF)这类纯免费 preset,两条构建路径开箱即用。
三条路径上手:从拉代码到自托管
先拉源码:
git clone https://gitcode.com/GitHub_Trending/ze/ZeroTierOne cd ZeroTierOne按用途选路线:
| 场景 | 关键动作 | 对应项目文件 |
|---|---|---|
| 只用免费 agent 组网 | 用 presetlinux-free-release(ZT_NONFREE=OFF)或直接 make,产物不含控制器 | CMakePresets.json |
| 自托管网络控制器 | make ZT_NONFREE=1,数据落在controller.d/,走 127.0.0.1:9993 的 JSON API | nonfree/controller/README.md |
| 商用前评估 | 先读 Source-Available 许可条款,商用 controller 需取得书面授权 | nonfree/LICENSE.md |
加入一张已有网络的完整流程:
- 本机执行
zerotier-cli identity拿到节点 ID,再zerotier-cli join <16位网络ID>申请加入,参数全集见 doc/zerotier-cli.1.md; - 在控制器侧把该成员标记为 authorized,走 controller JSON API(
PUT /controller/network/<id>/member/<mid>),API 约定见 nonfree/controller/README.md; zerotier-cli peers观察 P2P 路径建立情况——通了就是直连,没通会走中继(慢但可达)。
结果:完成后任意两台成员可用控制器分配的 IP 互访,流量默认端到端加密。
动手前的4件事
- ✅ 先对齐核心引擎边界:通读 node/README.md,记住 node/ 不放 OS 代码、不走 C++11——这是读代码时的地图;
- ⚠️ 商用前确认许可归属:agent 是 MPL-2.0,controller 是源可用非商用许可,商用 controller 必须先拿书面授权,见 nonfree/LICENSE.md;
- ✅ 按用途选构建开关:免费路径
ZT_NONFREE=OFF,自托管控制器ZT_NONFREE=ON,preset 已备好,见 CMakePresets.json; - ✅ 部署后验证配置加载:跑
zerotier-cli info -j,确认 local.conf 是否生效,见 service/README.md; - 📌 官方资源汇总:双许可证 LICENSE-MPL.txt / nonfree/LICENSE.md,命令手册在 doc/ 目录,版本动态看 RELEASE-NOTES.md。
回到开头那三个问题——代码分几层、哪部分要授权、构建怎么挑——现在都有确定答案了。下次升级或换版本前,花一分钟扫一眼 RELEASE-NOTES.md,许可策略和控制器行为的变化都记在那里。
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考