摘要

  • ZONEVERSION 在生成 DNS 回答的同一份权威响应中携带区域版本,避免事后另查 SOA 时丢失时间上的对应关系。
  • 这个值只描述一次观察到的回答;它不是区域内容摘要,不代表所有权威节点已经收敛,报文本身也需要独立的完整性保护。

设想两个值班工程师从不同网络位置直查同一个 anycast 地址。问题完全相同,两个响应也都是 NOERROR,但一个给出新地址,另一个仍是旧地址。两份响应都带有 ZONEVERSION:前者的 SOA 序列号是 4120,后者是 4119。

真正有价值的不是“4120 比 4119 大”这一眼判断,而是每个序列号与它所描述的答案同处一份报文。如果几秒钟后再单独查询 SOA,两次请求可能都被路由到已经更新的站点。届时日志会留下两个 4120,却再也无法证明旧地址当时由哪个区域版本生成。

这是解释机制的假设场景,不是某个运营商事故,也不代表任何实现已经支持 RFC 9660。它说明 ZONEVERSION 的核心用途:为一次回答保留同时发生的版本证据。

边界也同样重要。4119 不能解释差异原因,4120 不能证明新区内容正确;任一单点都不能代表整个权威服务集群。

请求没有写入期望版本

ZONEVERSION 是 EDNS 选项,代码为 19。查询方在 OPT 伪记录中放入该选项,OPTION-LENGTH 必须为零,不能附带版本数据。它不是“请给我版本 4120”,也不是“切换到最新版本”,只是询问服务器愿不愿意说明这次回答来自哪个版本。

报文形状很严格:长度非零,或者同一查询里出现两个 ZONEVERSION,都属于无效请求;理解该机制的权威服务器按规范返回 FORMERR。这时首先应修复探针,而不是把错误码解释成区域故障。可靠调查必须能重放原始查询字节。

即使请求正确,服务器也不是必答。它需要理解选项、对相关包围区域具备权威性,并选择响应。没有返回选项只能说明“这次交换没有提供回答—版本关联”,不能推出服务器陈旧或区域异常。

这还是逐跳控制信息。转发者不能盲目转交请求,再把上游的值粘进自己的回答。版本描述的是生成当前响应的权威端;一旦这个对应关系被中间层改写,数字就失去原意。

LABELCOUNT 决定数字属于哪个区域

响应数据依次包含一字节 LABELCOUNT、一字节 TYPE 和由 TYPE 定义的 VERSION。LABELCOUNT 从原始 QNAME 的最右侧数标签,零代表根区。对于 host.branch.example,计数 2 指向 branch.example,计数 1 则指向 example。

因此,“serial=4120”本身不是完整证据。必须保留原始 QNAME、标签总数、LABELCOUNT 和推导出的包围区域。计数不能超过 QNAME 的标签数。

该机制不只服务于普通正面回答。父区生成向下委派时,可以报告父区版本;权威服务器生成 NXDOMAIN 或 NODATA 时,可以报告产生否定回答的区域;在仍能确认相关权威区域的某些 SERVFAIL 中也可返回。一次响应可涉及多个包围区域或多个类型,但同一个 TYPE 与 LABELCOUNT 组合最多一个值。

运营系统若把这些全部压成“当前版本”一列,就会丢掉作用域。最小键应当是 QNAME、推导区域、类型和版本,并绑定原始响应、服务器与观察位置。

SOA-SERIAL 熟悉,但绝不是全局版本号

RFC 9660 当前定义的公开类型是 TYPE 0 SOA-SERIAL。VERSION 直接复制相关区域 SOA 的四字节无符号 SERIAL,加上前两个字段,响应选项长度为 6。

熟悉不等于可以随意比较。序列号只在同一区域内有意义。RFC 1982 规定的是 32 位环形算术,回绕之后数值更小的序列号可能更新;相距特定范围的两个值甚至没有定义好的先后关系。简单使用整数大于号,足以把正常回绕误报为回退。

序列号也不是内容哈希。运维错误可能让不同区域内容使用同一 SERIAL,同一版本下的回答也可能因查询条件或策略不同而变化。所以调查必须同时比较回答 RRset、Authority 区、标志、TTL 和 DNSSEC 验证结果。

需要验证完整区域内容时,应进入 RFC 8976 的 ZONEMD 机制。ZONEVERSION 回答“这次响应声称来自哪个版本”,ZONEMD 回答“完整区域内容是否匹配预期摘要”。二者互补,不能互相替代。

Anycast 把“哪台服务器”变成测量问题

一个 anycast 地址背后可以有多个服务实例,不同探测位置可能到达不同站点。一次成功响应只说明这一条路径在这一时刻看到了什么。

证据采集应先列出权威 NS、可见地址、anycast 前缀、预期站点与有意义的网络观察点。每次直查都应关闭递归,保存源/目的地址、传输方式、时间、QNAME、RCODE、AA 位、完整回答、TTL、选项字节与验证结果。跨时间重复同一问题,才能区分持续的站点差异与一次偶发路径。

RFC 5001 的 NSID 可以提供额外线索,但其内容与唯一性由运营者定义,也不会因出现就自动受认证。NSID 不能替代真实端点、路径与观察位置。

若三个位置持续看到 4120 和相同答案,第四个位置持续看到 4119 和旧地址,可以合理地说“被测范围内存在一个有边界的服务差异”。还不能直接说原因是落后 secondary。下一步要核对 journal、区域传输、签名生成、实例装载状态与路由落点。

DNSSEC 没有签住这个 EDNS 值

DNSSEC 能验证回答中的签名 RRset,却不会用 RRSIG 覆盖 ZONEVERSION 的 EDNS 字节。在不安全路径上,中间人可以修改或剥离版本选项,同时让签名数据本身继续通过验证。

所以“回答 RRset 验证通过”和“回答—版本组合有受保护的保管链”是两句话。重要诊断可使用经过认证并加密的传输,或 TSIG、SIG(0),并记录端点或密钥身份和实际验证结果。这些措施保护报文交换,不证明区域设计正确或集群完成发布。

OPT 也不是区域数据。ZONEVERSION 不能像普通 RR 一样缓存、传送或重新拼装。缓存可以按 TTL 继续使用回答,但不能把昨天的选项拿来给今天的回答充当来源证明。

来源