我最近更改了某个特定域的 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 记录查询仍会返回旧 IP 地址,直到传播完成。
这对我很重要,因为解析域名的应用软件似乎执行相当于 A 记录查询而不是 ANY 查询的操作,因此,这些应用程序仍将 IP 地址解析为旧值,直到 DNS 传播完成。
我只是在寻找一个解释,为什么任何结果似乎都比 A 记录结果传播得更快......这是为了我自己的理解和启迪。
非常感谢。
答案1
看起来,具有新 IP 的权威 DNS 服务器正在响应“ANY”记录查询,而其他递归 DNS 服务器正在响应“A”记录查询,其中新 IP 地址传播仍处于待处理状态,因此返回旧 IP 地址,因为这是其缓存中的信息。
答案2
- 给出所涉及的真实名称,否则无法解决您的问题。并且使用
dig
nothost
进行调试。并且始终明确指定您查询的名称服务器 - ANY 不是真正的记录,它只是要求解析器返回缓存中给定名称的所有内容;因此,它是一种非常糟糕的调试工具,因为结果完全取决于所查询的解析器;出于某种原因,有些人想完全弃用它
- 因此任何记录都不会“传播”
- 事实上,由于 DNS 不是自上而下的,因此根本没有记录传播。这是一个到处都在使用的术语,但它并不能很好地反映现实。
至少从 2019-01-10 开始RFC 8482“为 QTYPE=ANY 的 DNS 查询提供最小大小的响应”,名称服务器可以自由地“化解”ANY
请求并使用最少的数据(它们认为合适的任何记录子集,或者仅一个 HINFO 记录)进行回复。
请参阅 Cloudflare 的这个可爱示例:
$ dig @ns7.cloudflare.com cloudflare.com ANY +noall +ans
cloudflare.com. 1h3m9s IN HINFO "RFC8482" ""
答案3
在这种情况下,dig 的输出很有帮助,因为我们缺少其他详细信息,例如与两个查询相关的 TTL。
我发现这不太可能ANY
导致不同的行为。无论使用哪种查询类型,缓存中的单个记录都会具有不同的 TTL,并且这两个查询在提示服务器更新其缓存值方面没有区别。如果有的话,ANY
通常会导致特定记录类型的答案省略如果它们当前不在缓存中。(即已过期)
您的查询很可能被定向到负载平衡的 DNS 集群,并且您的一些查询会到达旧答案的 TTL 已过期的服务器,而其他查询会到达仍在缓存中记录的服务器。将来验证这一点的一个简单方法是注意远程服务器返回的 TTL。如果它没有根据现实世界时间以秒为单位持续递减,则您会看到来自不同服务器的 TTL 值。