每次讨论 ZeroTier 都会出现两个标识符,它们在聊天窗口里看上去足够相似,很容易被混淆。节点 ID 标识一台设备。网络 ID 标识该设备想加入的虚拟网络。加入网络用后者,授权成员用前者。

两个标识符,两种职责

节点身份在服务首次于某台机器上运行时生成,是一个十位的十六进制地址。它会一直跟随那次安装,直到身份文件被删除,所以重装可能产生一个没人批准过的新成员。网络 ID 是十六位十六进制字符,标识的是一个虚拟网络而不是一台机器。拥有该网络的控制器本身也是一个节点,因此网络 ID 的前十位字符与控制器的地址一致。

两个值都不是秘密,也都不能互相替代。把网络 ID 分享给所有参与者是常态;分享节点 ID 则是向控制器指明一台设备。

从报告该值的命令里读取

一条命令报告本地服务的身份,另一条报告它已加入的网络。向错误的命令要值,正是人们把网络 ID 粘贴进成员列表的原因。

zerotier-cli info
zerotier-cli status
zerotier-cli listnetworks

第一条输出节点地址以及服务是否在线。第二条补充版本与端口信息。第三条列出已加入的网络及其 ID、状态和分配的地址,需要网络 ID 时只应该用它。

用网络加入,用节点授权

加入命令接收由控制器管理者提供的网络 ID。命令返回正面响应只说明请求已提交,并不代表私有网络上的成员资格已获批准。

加入之后,管理员在该网络的成员列表中按节点 ID 授权设备。管理员不再需要网络 ID,也无法按主机名授权设备,因为身份就是地址。如果你是管理员,请阅读成员列表,把节点地址与请求对应起来。只提到网络却没有节点地址的请求无法处理。

共同前缀自有道理

因为网络 ID 以控制器的节点地址开头,同样的十个字符会出现在两处。这是路由上的便利,不是两个值可以互换的暗示。

这也解释了为什么控制器的身份比它的显示名称更重要。用新身份恢复控制器会得到不同的地址空间,所以旧身份下定义的网络即使沿用名称,也不再是同一批网络。

请把控制器的身份连同它的配置一起保存在备份中。把该身份当作可以重新生成的标签,会把恢复变成重新设计。

验证结果,而不是命令的输出

成功加入只是检查的开始,而不是结束。随后查看网络条目并读取三个字段:状态、分配的地址和网络 ID。

zerotier-cli listnetworks -j
ip -br addr show | grep zt
ping -c 2 10.147.20.5

第一条命令以可解析的形式输出同一份列表,便于与管理员预期的结果对照。第二条确认接口已获得地址,第三条测试网络中的对端,而不是本地状态。

如果条目显示 ACCESS_DENIED,说明节点 ID 未被授权。如果显示 NOT_FOUND,说明网络 ID 有误。如果显示 OK 却没有地址,下一个问题是控制器的地址分配,这三种情况都不能靠重新加入来解决。

相关文章