ZeroTier 显示成员为 OK,网络也已加入,却仍然没有可 ping 的地址。这种组合看起来像缺陷,通常是配置被拆成了两半:批准成员是一个开关,分配地址是另一个开关。网络可以接受一台设备,却从不给它分配任何东西,因为地址池或分配模式从未设置。

在改动任何一边之前,先读完两边。答案出现在两个地方,而只有一处位于控制器上。

授权和分配是两个不同的开关

授权回答的是这个节点能否加入网络。地址分配回答的是节点加入后网络给它什么,而这个答案来自地址池加上分配模式。两个设置互不蕴含。一个是许可,另一个是分配。

控制器的配置通常包含一条受管路由、一个地址范围,以及决定是否启用自动分配的开关。从另一个环境复制网络 ID,只会带来成员关系,配置一样都带不过来。

这就是为什么设备在成员列表里看起来正常,而它的已分配地址列却一直为空。控制器接受了它,却没有任何东西可以给。两句话同时成立。

LayerWhat it decidesWhere it is configured
MembershipWhether the node may joinMember authorization on the network
PoolWhich addresses exist to hand outNetwork address range
Assignment modeWhether they are handed out automaticallyNetwork v4/v6 assignment settings

读取成员的实际状态

问客户端实际收到了什么,而不是控制器打算给什么。普通列表显示状态列和地址列,JSON 形式则显示客户端应用的网络配置,包括受管地址和路由。

zerotier-cli listnetworks
zerotier-cli -j listnetworks | jq '.networks[] | {nwid, status, assignedAddresses}'

比较同一网络 ID 下的两份输出,而不是操作系统自己的列表里出现的物理适配器。报告 OK 却地址集为空的那一行,确认的是分配缺口,而不是连接故障。读错行是这半个错误的另一半。

ACCESS_DENIED 状态指向授权问题 ,而那是另一种修复。如果命令完全读不到本地认证令牌,问题在本地权限而不是控制器拒绝,修的地方就是你正坐着的这台机器。

当客户端忽略控制器下发的内容

客户端有自己的设置,决定是否应用受管配置。一个关闭受管地址、受管路由或默认路由处理的配置文件,会把网络下发的东西丢掉,而从控制器一侧看成员列表依然正常。

这些标记只影响本地节点。改动它们不会改变其他成员收到的内容,也修不好从未定义的地址池。

所以诊断分成两支:要么控制器没有地址可给,要么客户端拒绝了给它的地址。两者对应不同机器上的不同修复。JSON 输出能区分它们,因为地址要么不在网络配置里,要么存在却缺席于客户端应用后的状态。

该修什么,而不是编造一个地址

随手输入一个静态地址是诱人的第三种选择,也是最糟的。随机地址可能与其他节点冲突,落在网络传播的路由之外,或落进防火墙规则区别对待的范围。它还会对之后查看网络的人隐藏缺失的地址池。应该去修分配,让控制器和客户端对结果达成一致。

去问管理员网络本该分发什么,然后确认地址池覆盖了目标范围,分配模式也已开启。改完之后重新加入,而不是指望客户端自己立刻轮询到新配置。

地址出现之后,测试你真正需要的东西:一个对端、一项服务,或网关后面的子网。访问成员后面的局域网需要超出成员关系的路由和转发,而上一般的互联网访问需要出口节点,所以可用的地址是这项测试的起点,而不是终点。

相关文章