摘要

  • DNS 委派同时存在于父区和子区,两份 NS 数据可以带着不同 TTL。调低子区 TTL,只会影响此后的缓存装填,不能远程缩短已经缓存的父区副本。
  • RFC 9199 汇总的实测结果中,约九成解析器更接近“以子区为准”,约一成更接近“以父区为准”;域内与域外权威服务器的地址缓存行为也并不相同。
  • 旧基础设施至少应运行到父、子 TTL 中较长者届满。真正可审计的退役决定,还要保留最后一次旧值装填、A/AAAA TTL、bailiwick 类型和各类解析器最后一次走旧路径的记录。

同一份委派,为什么会有两只钟

解析器第一次寻找某个子区时,父区会给出 NS 委派;抵达子区以后,子区权威服务器又会给出本区的 NS 集合。两份记录指向的名称理应一致,但缓存期限可以不同。更重要的是,这两份期限通常不归同一个人决定。

子区运营者能够修改自己发布的 TTL,却未必能改变父区实际采用的值。RFC 9199 举过一个直观例子:根区里 TLD 的 NS TTL 是两天,而某个 TLD 自己发布的 NS TTL 可以只有一小时。对运营者来说,一小时很醒目;对一部分解析器来说,两天才是仍在生效的承诺。

Giovane Moura、Wes Hardaker、John Heidemann 与 Marco Davids 的研究用 RIPE Atlas 观察了真实解析器的选择。RFC 9199 将结果概括为:大约 90% 的样本表现得更像“子区中心”,约 10% 更像“父区中心”。这不是永恒不变的全球占比,也不该拿来预测任何单一网络。它说明的是另一件事:少数路径足以构成工程约束。

如果团队只看总体成功率,九成用户顺利切换会把剩余问题压扁成统计噪声。可对那一成仍合法持有父区缓存的解析器,旧服务器并没有“过期”。一旦旧端点下线,故障就会随递归服务商、缓存装填时刻与地理分布呈现出断断续续的样子。

新 TTL 不能追回旧缓存

TTL 不是区所有者手中的倒计时遥控器。解析器取得记录时,把当时的 TTL 一并写进缓存;DNS 没有一条命令能让权威运营者远程清除所有已经保存的副本。今天调低的数字,只约束明天的新装填,不会改写昨天缓存项的剩余寿命。

因此,计划性迁移里“提前降 TTL”有严格的时间顺序。先让较小值在每个相关控制面上真正生效,再等待最后一个可能按旧大值装填的缓存到期,之后才能切换并退役。只把子区从一天降到一小时,却让父区仍保持两天,并不意味着一小时后世界已经刷新。

RFC 9199 给出的操作底线是:旧基础设施至少保持可用到父区和子区 TTL 的最大值届满。“至少”二字很关键。这个最大值是规划下限,不是自动生成的清场证明。还要问父区何时完成发布、旧值最后何时可能进入缓存,以及名称服务器地址是否有独立寿命。

长 TTL 并非天然保守。缓存命中可以降低时延、权威查询量与计费成本,也能让短时故障或攻击期间的用户继续获得答案。短 TTL 则便于预定迁移、DNS 负载调度和部分流量改道。问题不在于选择长或短,而在于子区拿自己的选择替父区作证。

NS 到期,不等于地址也一起消失

NS 记录给出名称,解析器还需要 A 或 AAAA 地址才能发包。这个地址如何取得,会改变迁移的尾部。

若权威服务器名称位于子区的 bailiwick 内,父区往往需要附带 glue,避免“必须先问到服务器地址才能去问服务器地址”的循环。RFC 9199 汇总的观察显示:当 NS TTL 短于相应地址 TTL 时,多数解析器在重新需要域内 glue 时会再次查询地址,即便原地址的标称 TTL 似乎更长。

域外名称服务器则不同。它的地址通常通过另一条普通解析链独立取得、独立缓存。NS 到期后,解析器仍可能继续尊重尚未到期的旧地址。于是,“NS 已经换新”与“查询一定送到新地址”不是同一张收据。

迁移台账至少应列出:父区与子区的新旧 NS RRset,新旧名称对应的 A/AAAA,三类 TTL,名称处于域内、同级还是域外,较低值何时真正权威发布,以及旧值最后一次可能装填缓存的时刻。只写一行“TTL=3600”,恰好删掉了最需要判断的分支。

RFC 2181 对不同来源的 DNS 数据可信度作了区分,但可信度排序不是全网覆盖按钮。父区对自己的区和委派具有权威,子区对自身数据具有权威;递归解析器会按来源、响应位置与剩余期限保存信息。称子区答案“更新”,不能让一份仍合法的父区缓存凭空失效。

退役证据要从旧路径上取

一份合格的变更记录必须在切换前开始。先冻结父、子两侧的旧新 RRset、地址、TTL 与生效时间;再计算每个旧值最后可能装填的时刻。旧端点不仅要开着,还应在整个安全窗口内保持正常权威应答,不能以“机器尚未关机”掩盖服务已经降级。

探测也不能只选一个公共递归服务。每个观测要记录解析器实现或服务商、版本(若可得)、观测点、查询时刻、响应来源、剩余 TTL 与最终命中的权威端点。第一个新答案只证明新路已经存在;各类解析器最后一个旧答案,才说明旧路何时真正退出。

旧服务器流量归零是有用信号,却不是全称命题。采样范围里暂时没有旧查询,不等于所有缓存都已清空。父区控制缺失、解析器策略未知、是否允许过期应答,都必须留作显式不确定性。本文不把“过期后继续服务”混进两种正常 TTL;那是另一套政策与证据。

关停之后还要另做一次可达性验收:相关递归类别能否取得委派、解析名称服务器地址,并抵达任一正常权威端点。发布新记录是变更指令;观察到旧路径不再被使用,才是退役收据。

把作者边界与控制边界同时写清

RFC 9199 的作者是 Moura、Hardaker、Heidemann 与 Davids。它属于 Independent Stream,状态为 Informational,不代表 IETF 共识,也不是 Internet Standard。IETF 留存的 Wes Hardaker 个人资料显示,他长期参与 DNS 研究、IETF 工作并协助 B-root 运行;这些经历解释了他为何关注缓存边界,却不能把四人的研究写成一人的发明。

用 Heng Lu 的 agency 视角看,权力分布非常清楚:父区运营者决定委派值,子区运营者决定本区副本,递归软件及其运营者决定缓存与 bailiwick 行为,权威基础设施团队决定何时撤掉旧端点。没有任何一方能替其他三方承诺状态。

早期 DNS RFC 给出了委派、缓存与 TTL 的最小互操作规则,却没有把未来每一次迁移集中到一个控制者手里。局部决策正是这套架构的韧性来源;代价是必须让 running code 提供现场证据。解析器跟踪、权威查询日志和逐时记录,才能说明某次部署究竟走了哪条分支。

共享台账可以协调这些决定,但不会因此获得普遍授权。它的职责更窄:让父区钟、子区钟、地址钟和关停动作出现在同一条可追溯记录里。旧服务器之所以必须多活一段时间,不是因为变化可疑,而是因为仍有合规缓存尚未抵达未来。

来源