HSYUN 下载中心站

换了网络,域名结果为什么没有立刻一致:TTL、负缓存与加密DNS边界

切换Wi-Fi或热点只改变当前网络,并不会同时清空应用、本机和递归解析器里的DNS状态。记录查询名称、记录类型、解析器、响应码与剩余TTL,才能判断差异来自正向缓存、负缓存、查询口径还是当前网络。

电脑离开公司Wi-Fi并连接手机热点后,浏览器仍显示旧页面;同一热点上的手机却能打开目标域名。连续替换DNS地址看似积极,实际会让应用缓存、本机缓存、递归解析器和网络路径同时变化,最后无法说明哪一层返回了旧结果。

网络切换只改变当前接入与新查询可能使用的解析器。已经保存在浏览器、操作系统或递归服务器里的答案,不会因为Wi-Fi图标变化而收到全网清除命令。

DNS不是一张同时更新的地址表

RFC 1034把DNS设计成分布式数据库。名称资料由不同授权区域维护,解析器可递归取得答案,也会把先前结果放入缓存。缓存减少网络等待和名称服务器负载,代价是更新需要逐步传播。

规范明确接受这种取舍:信息可用性比所有副本瞬间一致更重要。DNS更新逐步传到使用者,不保证所有副本同时刷新。两个解析器在过渡期返回不同答案,单凭差异不能判定其中一个受到劫持或配置错误。

应用通常把名称交给本机解析器。本机可能直接命中缓存,也可能把查询交给当前网络提供的递归服务器;递归服务器又可能命中自己的缓存。公司网络与手机热点使用不同递归器,只代表后续路径不同,不代表应用此前保存的状态消失。

对照时应记录完整名称。example.testwww.example.test是不同查询,末尾搜索域还可能把短名称补成其他完整名称。只写“同一网站”无法证明两次查询的问题相同。

TTL约束缓存寿命,不是全网倒计时

每条DNS资源记录带有TTL,单位为秒,主要供解析器缓存使用。解析器把到达记录的TTL换成过期时刻,之后忽略或丢弃旧记录。在TTL有效期内,缓存答案通常足以满足普通查询。

TTL从记录进入某个缓存时开始消耗。解析器A在10:00取得一份300秒记录,解析器B在10:03才取得同一份记录,两边的过期时刻不会相同。授权方后来修改记录,也不会让已经发出的TTL远程归零。

因此,“TTL是300秒”不等于全球在修改后五分钟整同时更新。它描述单份缓存记录最多还能怎样使用,实际观察还受查询时刻、缓存层次和本地策略影响。

TTL为零的记录不应进入普通长期缓存,但这也不代表浏览器没有连接复用、页面缓存或其他非DNS状态。看见旧页面时,需要把解析答案与页面内容分开,不用页面外观反推DNS一定未更新。

换了网络,域名结果为什么没有立刻一致:TTL、负缓存与加密DNS边界 配图 1
换了网络,域名结果为什么没有立刻一致:TTL、负缓存与加密DNS边界 配图 1

失败答案也会被保存

缓存并不只保存地址。RFC 2308把负缓存定义为保存某个对象不存在、不能回答或没有答案的知识。这样能减少重复失败查询,也避免同一个错误持续增加名称服务器流量。

NXDOMAIN表示名称不存在。NODATA表示名称有效,却没有所查记录类型。例如名称有A记录但没有AAAA记录,AAAA查询可以得到NODATA;它不等于整个名称不存在。查询A与查询AAAA若不分栏,两份结果会看似互相矛盾。

负答案需要寿命。负答案TTL取SOA.MINIMUM与SOA自身TTL中的较小值,并随缓存时间递减;降到零后不得继续使用。无SOA记录的负答案不应缓存,因为缺少防止错误无限循环的倒计时依据。

这能解释一个常见时间线:域名刚创建时,递归器取得NXDOMAIN并缓存;管理员随后补上记录,授权服务器已经能回答,但旧递归器在负TTL结束前仍返回不存在。切换网络若换到另一个未保存失败的递归器,结果可能立即不同。

SERVFAIL与服务器不可达不是NXDOMAIN。它们描述临时故障或获取失败,RFC 2308给出的缓存边界也不同。记录表应保留原始响应码,不把所有空结果统一写成“域名不存在”。

同一个名称还要固定记录类型

DNS查询总是带记录类型。A查询IPv4地址,AAAA查询IPv6地址,CNAME查询别名。浏览器可按自己的网络能力请求一种或多种类型,手工工具若只查A,不能完整复现浏览器路径。

一台设备有可用IPv6,另一台只有IPv4,两者即使得到相同A答案,实际连接选择仍可能不同。某个AAAA答案失效,也可能只影响优先尝试IPv6的环境。把名称、QTYPE、响应码和答案一起记录,才能知道比较的是同一问题。

别名又会引入下一段查询。CNAME指向的新名称拥有自己的记录和TTL。只抄最终IP会丢掉别名链中的缓存状态;只抄第一个CNAME也不能说明最终地址是否取得。

Windows本机缓存与直接查询分开看

Microsoft的DNS客户端排查文档指出,nslookup不使用Windows DNS客户端缓存,而是向已配置的DNS服务器查询。它得到新答案时,只能证明该服务器此刻怎样回答,不能证明浏览器刚才没有使用本机旧缓存。

ipconfig /displaydns用于查看本机客户端缓存。若失败名称下出现“Name does not exist”,说明负响应已返回并保存在客户端。此时应用结果、displaydns内容和nslookup结果应放在三列,而不是挑一个符合预期的结果作结论。

换了网络,域名结果为什么没有立刻一致:TTL、负缓存与加密DNS边界 配图 2
换了网络,域名结果为什么没有立刻一致:TTL、负缓存与加密DNS边界 配图 2

清理Windows DNS缓存是一项会改变现场的操作。保存旧缓存条目、响应状态和测试时刻后再执行,前后结果才可比较。直接清理而没有记录,会失去判断旧答案来自本机还是递归服务器的证据。

nslookup也有范围限制。它绕过的是Windows DNS客户端缓存,不代表绕过上游递归服务器缓存。指定不同服务器查询会改变比较对象,查询前后要写明服务器地址或名称。

建立六列解析对照

第一列写完整查询名称,第二列写记录类型。第三列写解析器,包括应用默认、本机缓存或指定递归服务器。第四列保留响应码,区分NOERROR、NXDOMAIN与SERVFAIL。第五列写答案和剩余TTL,第六列写网络与测试时刻。

公司Wi-Fi、手机热点和移动数据分别建立记录,不在一次测试中同时改代理、防火墙和客户端。应用现象另设一列,描述“显示旧页面”“连接超时”或“证书错误”,不把它自动翻译成DNS结论。

若应用仍旧而nslookup已新,差异可能位于本机或应用缓存。displaydns也新而应用仍旧,才把注意力移向应用内部、连接复用或页面缓存。两个工具都旧,则结合剩余TTL与指定解析器查询继续定位。

若同一解析器、同一名称和同一类型在相近时刻返回不同答案,还需检查TTL、负载分配或授权数据,不能从一次样本断言恶意行为。保留原始响应比反复刷新更能支持后续判断。

解析成功只得到名称对应数据,不证明目标端口、TLS、应用服务或账号状态可用。DNS答案更新后网页仍打不开,问题可以位于连接、证书、服务器或应用层;反过来,页面能打开也可能使用已有连接而没有发起新DNS查询。

网络切换是解析路径的一次变化,不是所有缓存的重置键。固定查询名称、记录类型和解析器,记录响应码、答案、剩余TTL、网络和测试时刻,再区分正向缓存、负缓存与应用现象,才能解释两台设备为何暂时不同。

资料来源

  • IETF:《RFC 1034 — Domain Names: Concepts and Facilities》,发布或更新于 1987-11-01
  • IETF:《RFC 2308 — Negative Caching of DNS Queries》,发布或更新于 1998-03-01
  • Microsoft:《Troubleshooting DNS clients》,发布或更新于 2020-08-07