ZeroTier 显示 ONLINE 却报 ACCESS_DENIED:到底该在哪一侧修复?
ONLINE 描述的是与根基础设施的连通;ACCESS_DENIED 描述的是对某个网络的成员关系。修复应在控制器一侧完成。
ZeroTier 在服务层报告 ONLINE,在网络层报告 ACCESS_DENIED,这两者并不矛盾。前者是关于客户端与协调基础设施之间路径的陈述。后者是关于某个网络成员列表的陈述。分开来读,这个组合就精确告诉你该去哪里查。
ONLINE 衡量的是什么
状态命令报告本地服务是否有一条可用路径通往负责协调节点发现的根服务器。它对任何单个网络都不作说明,对控制器是否已批准这台设备也毫无涉及。因此,在正常连接上全新安装的客户端,会在任何地方都尚未授权它之前就立刻报告 ONLINE。
把 ONLINE 看作关于链路的陈述,把每个网络的状态看作关于成员关系的陈述。用一个去解释另一个,正是大部分混淆的起点。
ACCESS_DENIED 要求你做什么
在私有网络中,控制器维护一份成员列表。不在该列表中的节点,或者已在列表中但未获授权的节点,会收到 ACCESS_DENIED,并且除基础握手之外没有任何配置。修复在控制器一侧,且需要的是节点地址而不是机器名,所以把客户端输出中的地址与成员条目比对,并对该条目授权。
重装客户端是错误的第一步,因为新安装会带来新的身份,旧授权对它不再适用。如果网络是公开的,同一状态指向的是另一种情形,所以在申请批准之前,先问控制器所有者该网络是否为私有。这一个问题就决定了余下的对话。
状态文本是分支,不是判决
每个状态都在收窄下一次检查,而把它们当作一条失败信息来读,正是把两分钟的修复变成一整个下午重装的原因。NOT_FOUND 表示你输入的标识符在那台控制器上不存在,所以成员关系这个问题还没有走到。REQUESTING_CONFIGURATION 表示节点已到达控制器,正在等待始终不来的配置,这指向路径而不是授权。OK 表示成员关系和配置都已就位,所以下一个问题是分配到的地址,然后才是服务本身。
两条命令把这一切分开,而且两者读的都是同一个客户端。ZeroTier CLI 参考文档列出了它们返回的各网络状态字符串。第一条命令是服务视角,第二条是按网络:
zerotier-cli status
zerotier-cli listnetworks
向管理员求助时,请保留状态文本。本地 join 命令打印出的确认,只能证明请求在本地被接受,这与被真正接纳是不同的事实。
成员关系属于某个身份
控制器认的是客户端的身份文件,所以把配置复制到另一台机器,或在重装时清除身份,都会产生一个控制器从未见过的成员。这也正是删除成员记录与撤销授权并不相同。仍获授权且仍在运行的节点会不断重试,而删除而非撤销的记录,可能以来自同一地址的新请求重新出现。
当你停用一台设备时,先撤销它的授权,并在移除任何东西之前确认条目已反映该状态。顺序就是干净移除与莫名其妙重新加入之间的差别。
变更之后要验证
重读网络条目,而不是重读做出变更的命令。四个问题覆盖了结果,其中任何一个都可能是错的,而其余看起来却正常:
zerotier-cli listnetworks
ip -br addr show
ping -c 2 10.147.20.5
ip route get 10.147.20.5
第一条打印每个网络的成员关系和分配到的地址,第二条显示接口是否真的收到了那个地址。最后两条证明网络中的对端会应答,以及哪个接口承载流量。记下哪条命令回答了哪个问题,这样下一个人从证据而不是从记忆开始。
如果成员关系是OK,地址也在,但对端不应答,问题就已经转移到路由或对端自身的策略上。把状态文本从那段对话里拿掉,因为它已经完成了它的任务。成员记录与路径是两个独立的主题,越早分开,调查就越短。