【问题标题】:Successive DNS caching连续 DNS 缓存
【发布时间】:2026-01-21 04:20:16
【问题描述】:

我找不到任何人在谈论这个问题,但是如果我的权威 DNS 服务器将记录的 TTL 设置为 1 分钟并且客户端尝试在家用计算机上解析该记录,这不正确,通过本地递归 DNS 服务器,由于本地 DNS 服务器和操作系统的缓存正在添加,因此对该 DNS 记录的更改可能需要长达 2 分钟才能传播?

如果客户端 A 在 DNS 记录更新之前尝试通过本地 DNS D 解析 mysite.com,则本地 DNS D 将在其本地现金上拥有一条 TTL 为 1 分钟的新记录,指向错误的记录。现在,如果客户端 B 尝试在 59 秒后使用 DNS D 解析 mysite.com,则客户端 B 的操作系统将再缓存此记录一分钟,实际上至少需要 2 分钟,客户端 B 才能获得正确的值。

我的假设正确吗?如果是这样,在此过程中还有哪些其他可能的缓存?我如何安全地跟踪特定机器为特定主机名解析所落后的所有缓存?

【问题讨论】:

    标签: caching dns ttl nameservers


    【解决方案1】:

    你的假设不正确。向客户端发送响应时,缓存 DNS 服务器将仅发送缓存到期前的剩余时间作为 TTL 值。客户端甚至不会知道(并且并不真正关心)什么是“原始”TTL 值。

    这是一个例子:我已经创建了

    dsmoraes.bajic.nl   A   127.0.0.254
    

    TTL=60。 这是一条新记录,因此可以安全地假设它没有缓存在任何地方。当我第一次查询 Google DNS 时,我会得到 60(或 59)秒的 TTL:

    $ dig dsmoraes.bajic.nl @8.8.8.8

    ; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> dsmoraes.bajic.nl @8.8.8.8
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7656
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    ;dsmoraes.bajic.nl.     IN  A
    
    ;; ANSWER SECTION:
    dsmoraes.bajic.nl.  59  IN  A   127.0.0.254
    
    ;; Query time: 14 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Fri Aug 02 09:49:49 CEST 2019
    ;; MSG SIZE  rcvd: 62
    

    但是随着每个后续请求,发送给客户端的 TTL 会变低(仅剩余时间):

    $ dig +noall +answer dsmoraes.bajic.nl @8.8.8.8
    dsmoraes.bajic.nl.  49  IN  A   127.0.0.254
     
    $ dig +noall +answer dsmoraes.bajic.nl @8.8.8.8
    dsmoraes.bajic.nl.  43  IN  A   127.0.0.254
    

    (Google DNS 是分布式的,因此您可能会在后续请求中访问不同的缓存服务器) 这样,如果缓存服务器表现良好,就不会提供过时的记录(在特殊情况下,可能会故意将自己的 DNS 服务器配置为不同的行为,但这是另一回事)。

    延伸阅读:https://www.rfc-editor.org/rfc/rfc1034#section-6

    【讨论】:

    • 我没有意识到 dig 可以做到这一点。由于谷歌的分布式特性,我还能够测试你所说的我会发现的行为,但我注意到当 dig 返回相同的 ips 时时间减少了。谢谢