我最近更改了特定域的 IP 地址,称之为example.com
. 我知道传播 DNS 更改需要时间,而且传播尚未完成还为时过早。
我注意到运行 ANY 查询与运行 A 记录查询给出不同的结果。例如 ...
% host -t a example.com
example.com has address THE.OLD.IP.ADDRESS
% host -t any example.com
example.com has address THE.NEW.IP.ADDRESS
我知道最终,DNS 将完全传播,然后 A 记录查询将返回 THE.NEW.IP.ADDRESS。但我想知道是否有人可以解释为什么 ANY 查询返回新 IP 地址,而 A-record 查询仍然返回旧 IP 地址,直到传播完成。
这对我来说很重要,因为解析域名的应用程序软件似乎执行 A-record 查询而不是 ANY 查询,因此,这些应用程序仍然将 IP 地址解析为旧值,直到 DNS 传播完成。
我只是在寻找解释为什么任何结果似乎都比 A 记录结果传播得更快……这是为了我自己的理解和启发。
非常感谢。
看起来“ANY”记录查询正在由具有新 IP 的权威 DNS 服务器响应,而“A”记录查询正在由其他递归 DNS 服务器响应,其中新 IP 地址传播仍在等待中,并且因此返回旧的 IP 地址,因为这就是它在缓存中的信息。
dig
不host
用于调试。并始终明确指定您查询的名称服务器现在至少从 2019 年 1 月 10 日开始,使用RFC 8482“对具有 QTYPE=ANY 的 DNS 查询提供最小大小的响应”,名称服务器可以自由地“解散”
ANY
请求并以最少的数据(他们认为的任何记录子集)进行回复适当的,或者只有一个 HINFO 记录)。从 Cloudflare 看这个可爱的例子:
dig 的输出在这种情况下会有所帮助,因为我们缺少其他详细信息,例如与两个查询关联的 TTL。
我发现这不太可能
ANY
导致不同的行为。无论使用何种查询类型,缓存中的各个记录都会有不同的 TTL 与之相关联,这两个查询没有区别会提示服务器更新其缓存值。如果有的话,如果它们当前不在缓存中,ANY
通常会导致特定记录类型的答案被忽略。(即过期)您的查询很可能被定向到负载平衡的 DNS 集群,并且您的一些查询正在登陆旧答案中的 TTL 已过期的服务器,而其他查询则登陆仍在缓存中的记录的服务器上。将来验证这一点的一个简单方法是注意远程服务器返回的 TTL。如果它不是基于真实世界时间以秒为单位持续递减,那么您将看到来自不同服务器的 TTL 值。