使用 dig 查询任何记录时的 TTL

whi*_*edb 4 dns nameserver dig

这个问题来自这个话题。当我这样做时,我会得到剩余的秒数,直到查询的名称服务器中的 A 记录过期:

dig stackexchange.com
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,我会得到权威的 TTL 值:

dig any stackexchange.com 
Run Code Online (Sandbox Code Playgroud)

所以,我不明白为什么dig any stackexchange.com当我真正进行递归查询时,我得到所有 TTL 值,就好像我做了一个权威问题一样。

小智 7

简而言之,您在问题中提到的两个查询都是非权威查询。

可以从缓存 DNS 服务器或权威 DNS 服务器查询域的 DNS 记录。因此,当您要查询缓存 DNS 服务器时,您可以指定 DNS IP 地址,或者如果未指定,则将使用已配置的默认 DNS 服务器/etc/resolv.conf

非权威查询

$ dig stackexchange.com
Run Code Online (Sandbox Code Playgroud)

或者

$ dig stackexchange.com @8.8.8.8
Run Code Online (Sandbox Code Playgroud)

在上述两种情况下,查询都返回非权威回复,因为您的 ISP 的 DNS 或 Google 的公共 DNS (8.8.8.8) 对stackexchange.com域不具有权威性。当您查询非权威名称服务器时,它提供的 TTL 值会随着您每次查询而减少。一旦 TTL 值到期,缓存名称服务器将重新查询权威 DNS 服务器。

权威查询

因此,要获得权威回复,您需要从权威 DNS 服务器查询记录,可以使用以下方法找到该记录。

$ dig ns stackexchange.com
       ...
;; ANSWER SECTION:
stackexchange.com.  84894   IN  NS  cf-dns02.stackexchange.com.
stackexchange.com.  84894   IN  NS  cf-dns01.stackexchange.com.
       ...
Run Code Online (Sandbox Code Playgroud)

回答部分提供了域的权威域名服务器stackexchange.com,因此,如果我们需要得到权威的答复,然后

$ dig stackexchange.com @cf-dns01.stackexchange.com.
Run Code Online (Sandbox Code Playgroud)

当我们查询权威 DNS 服务器时,TTL 值不会改变,因为这些名称服务器是信息的主要来源,并且在管理员更改它之前它们不会过期。

任何记录的工作原理

ANY 记录就像一个通配符,您可以使用它来获取缓存/存储在 DNS 服务器中的所有记录。例如,我查询stackexchange.com了任何记录,我的默认 DNS 服务器回复如下。

$ dig any stackexchange.com
    ....
;; ANSWER SECTION:
stackexchange.com.  86350   IN  SOA cf-dns01.stackexchange.com. dns.cloudflare.com. 2017456480 10000 2400 604800 3600
stackexchange.com.  176 IN  A   198.252.206.140
stackexchange.com.  84338   IN  NS  cf-dns01.stackexchange.com.
stackexchange.com.  84338   IN  NS  cf-dns02.stackexchange.com.
    ....
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到回复只包含关于SOA,ANSrecord 的信息。但实际上还有更多记录stackexchange.com没有缓存在我的默认 DNS 服务器中,因为我没有查询过。

现在我正在MX向我的默认 DNS 服务器查询记录,回复如下

$ dig MX stackexchange.com
    ....
;; ANSWER SECTION:
stackexchange.com.  300 IN  MX  10 aspmx3.googlemail.com.
stackexchange.com.  300 IN  MX  5 alt2.aspmx.l.google.com.
stackexchange.com.  300 IN  MX  5 alt1.aspmx.l.google.com.
stackexchange.com.  300 IN  MX  10 aspmx2.googlemail.com.
stackexchange.com.  300 IN  MX  1 aspmx.l.google.com.
    ....
Run Code Online (Sandbox Code Playgroud)

现在我再次查询ANY记录,现在您可以看到该查询ANY也返回了MX记录。因此ANY记录将只提供仅缓存在您的默认名称服务器上的记录。

$ dig any stackexchange.com
     ....
;; ANSWER SECTION:
stackexchange.com.  298 IN  MX  5 alt1.aspmx.l.google.com.
stackexchange.com.  298 IN  MX  10 aspmx2.googlemail.com.
stackexchange.com.  86084   IN  NS  cf-dns01.stackexchange.com.
stackexchange.com.  298 IN  MX  10 aspmx3.googlemail.com.
stackexchange.com.  298 IN  MX  1 aspmx.l.google.com.
stackexchange.com.  298 IN  MX  5 alt2.aspmx.l.google.com.
stackexchange.com.  86084   IN  NS  cf-dns02.stackexchange.com.
stackexchange.com.  243 IN  A   198.252.206.140
stackexchange.com.  86343   IN  SOA cf-dns01.stackexchange.com. dns.cloudflare.com. 2017456480 10000 2400 604800 3600
     ....
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,非权威回复的 TTL 值正在发生变化。