ZeroTierOne Windows 服务:从注册到入网的完整实战指南
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
ZeroTierOne 是一个把不同网络的机器组成同一个二层局域网的开源虚拟网络项目,它在 Windows 上以 ZeroTierOneService 后台服务的形式运行。装完服务却发现状态是"未启动"?先确认你有没有用管理员权限跑安装;join 网络失败?先查 TAP 虚拟网卡驱动有没有装上。整条链路其实就三层:服务向系统注册、虚拟网卡出现在系统里、节点真正 join 进网络。
三步把服务跑通
第一步,让服务注册进系统。用官方安装包时这一步是自动完成的,底层逻辑可以看仓库里的 ServiceInstaller.cpp;自己从源码构建的话,需要向 SCM(Windows 统一管理所有后台服务的总控台)手动注册。
第二步,让 TAP 虚拟网卡出现。Windows 网卡驱动在 windows/TapDriver6/ 目录,关键文件是 zttap300.inf。装完后在网络连接列表里应能看到 "ZeroTier One" 网卡,没有的话后面 join 一定失败。
第三步,join 网络。以管理员身份打开命令行:
sc query ZeroTierOneService zerotier-cli list zerotier-cli join <16位网络ID>先查服务状态,再列节点信息,最后入网。list 没有任何返回说明服务没起来,报权限错说明你没以管理员身份执行,别跳这一步直接重试。
服务注册时系统里发生了什么
服务的核心参数全部集中在 ZeroTierOneService.h 顶部的一组宏里,六行值得看一遍:
#define ZT_SERVICE_NAME "ZeroTierOneService" #define ZT_SERVICE_DISPLAY_NAME "ZeroTier One" #define ZT_SERVICE_START_TYPE SERVICE_AUTO_START #define ZT_SERVICE_DEPENDENCIES "" #define ZT_SERVICE_ACCOUNT NULL // 以 LocalSystem 运行 #define ZT_SERVICE_PASSWORD NULL第一行是命令行用的服务名,第二行是 services.msc 里显示的标题,第三行决定开机后自动拉起,依赖为空说明它不依赖其他服务,账户为 NULL 表示以系统 LocalSystem 身份跑,权限足够做网卡操作。
真正的注册动作在 InstallService 里:先用 GetModuleFileName 取当前 exe 的绝对路径,外加一对引号防路径带空格,再创建独立进程型服务并写入描述。核心调用链如下:
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE); schService = CreateService(schSCManager, pszServiceName, pszDisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, dwStartType, /* ... */); // ... 省略,完整逻辑见下方文件如果 OpenSCManager 返回 NULL,你会看到 "OpenSCManager failed" 这个报错,90% 的情况就是没给管理员权限,换权限重跑即可。
服务崩溃后它怎么自己爬起来
很多人以为服务装完就一劳永逸,实际上 ZeroTierOne 服务内嵌了一个自愈循环。在 ZeroTierOneService.cpp 的 threadMain 里有个 restart_node 标签:节点返回不可恢复错误时,写一条 Application 事件日志、睡 5 秒,然后回到标签处重建 OneService 实例。
有个特殊情况值得记住:身份冲突(IDENTITY_COLLISION,即两台机器用了同一身份)时,服务不会卡死,而是把旧的 identity.secret 改名存为 identity.secret.saved_after_collision,删掉旧身份重新生成。所以你如果某天发现节点 ID 变了,先去主目录找这个备份文件,里面存着原来的身份。
主目录默认是 C:\ProgramData\ZeroTier\One\,OnStart 支持用第一个参数覆盖它。这个口子对调试很有用,多个实例各开一个目录就能互不干扰。
驱动装不上或网卡消失的排查顺序
TAP 驱动有问题时,按这个顺序查,不用乱翻:
- 确认安装过程全程以管理员身份运行,驱动签名校验失败大多栽在这
- 设备管理器里找带黄色感叹号的网卡,有就手动指定 zttap300.inf 重新装
- 还不行就翻 Application 事件日志,服务侧的错误都通过 WriteEventLogEntry 写在这里
卸载方向同理:UninstallService 会先停服务、轮询等 STOP_PENDING 状态结束、再调用 DeleteService 删注册信息。如果报 "DeleteService failed (is service running?)",说明停止没走完,手动 sc stop 一次再卸载。
不想装服务时:前台调试跑法
如果你只是想把 ZeroTierOne 跑起来验证功能,有个更轻的路子:跳过服务注册,直接前台跑 exe。windows/README.md 里的例子可以直接抄:
MSBuild ZeroTierOne.sln /property:Configuration=Release /property:Platform=x64 .\zerotier-one_x64.exe -p9994 -C C:\zt_home\再起一个窗口,让 CLI 指向同一端口和同一主目录:
zerotier-cli.bat -p9994 -D"C:\zt_home" join <网络ID>注意 -p 和 -D 两个参数必须与前台进程完全一致,端口或目录错一个,CLI 就会去敲一个不存在的实例,表现为"无响应"。
进阶:控制器配置和网络策略的文档入口
服务跑通只是入口。想继续深入控制器(controller,负责网络成员和权限仲裁的服务端)、网络策略和 CLI 全量参数,仓库里的 doc/zerotier-one.8.md 是最完整的参考;遇到具体兼容性问题,建议直接去项目的 Issue 区搜一下,Windows 驱动类问题那里沉淀得最多。
【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考