在 ZeroTier 中已授权却没有地址?两个独立的设置
批准成员和分配地址是两个设置。在凭空编造 IP 之前,先读地址池、分配模式和客户端实际应用的状态。
ZeroTier 显示成员为 OK,网络也已加入,却仍然没有可 ping 的地址。这种组合看起来像缺陷,通常是配置被拆成了两半:批准成员是一个开关,分配地址是另一个开关。网络可以接受一台设备,却从不给它分配任何东西,因为地址池或分配模式从未设置。
在改动任何一边之前,先读完两边。答案出现在两个地方,而只有一处位于控制器上。
授权和分配是两个不同的开关
授权回答的是这个节点能否加入网络。地址分配回答的是节点加入后网络给它什么,而这个答案来自地址池加上分配模式。两个设置互不蕴含。一个是许可,另一个是分配。
控制器的配置通常包含一条受管路由、一个地址范围,以及决定是否启用自动分配的开关。从另一个环境复制网络 ID,只会带来成员关系,配置一样都带不过来。
这就是为什么设备在成员列表里看起来正常,而它的已分配地址列却一直为空。控制器接受了它,却没有任何东西可以给。两句话同时成立。
| Layer | What it decides | Where it is configured |
|---|---|---|
| Membership | Whether the node may join | Member authorization on the network |
| Pool | Which addresses exist to hand out | Network address range |
| Assignment mode | Whether they are handed out automatically | Network v4/v6 assignment settings |
读取成员的实际状态
问客户端实际收到了什么,而不是控制器打算给什么。普通列表显示状态列和地址列,JSON 形式则显示客户端应用的网络配置,包括受管地址和路由。
zerotier-cli listnetworks
zerotier-cli -j listnetworks | jq '.networks[] | {nwid, status, assignedAddresses}'
比较同一网络 ID 下的两份输出,而不是操作系统自己的列表里出现的物理适配器。报告 OK 却地址集为空的那一行,确认的是分配缺口,而不是连接故障。读错行是这半个错误的另一半。
ACCESS_DENIED 状态指向授权问题 ,而那是另一种修复。如果命令完全读不到本地认证令牌,问题在本地权限而不是控制器拒绝,修的地方就是你正坐着的这台机器。
当客户端忽略控制器下发的内容
客户端有自己的设置,决定是否应用受管配置。一个关闭受管地址、受管路由或默认路由处理的配置文件,会把网络下发的东西丢掉,而从控制器一侧看成员列表依然正常。
这些标记只影响本地节点。改动它们不会改变其他成员收到的内容,也修不好从未定义的地址池。
所以诊断分成两支:要么控制器没有地址可给,要么客户端拒绝了给它的地址。两者对应不同机器上的不同修复。JSON 输出能区分它们,因为地址要么不在网络配置里,要么存在却缺席于客户端应用后的状态。
该修什么,而不是编造一个地址
随手输入一个静态地址是诱人的第三种选择,也是最糟的。随机地址可能与其他节点冲突,落在网络传播的路由之外,或落进防火墙规则区别对待的范围。它还会对之后查看网络的人隐藏缺失的地址池。应该去修分配,让控制器和客户端对结果达成一致。
去问管理员网络本该分发什么,然后确认地址池覆盖了目标范围,分配模式也已开启。改完之后重新加入,而不是指望客户端自己立刻轮询到新配置。
地址出现之后,测试你真正需要的东西:一个对端、一项服务,或网关后面的子网。访问成员后面的局域网需要超出成员关系的路由和转发,而上一般的互联网访问需要出口节点,所以可用的地址是这项测试的起点,而不是终点。