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

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

这个问题来自这个话题。当我执行此操作时,我会获得查询的名称服务器中 A 记录到期前的剩余秒数:

dig stackexchange.com

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

dig any stackexchange.com 

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

答案1

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

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

非权威查询

$ dig stackexchange.com

或者

$ dig stackexchange.com @8.8.8.8

在上述两种情况下,查询都会返回非权威答复,因为您的 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.
       ...

解答部分为域名提供权威的名称服务器stackexchange.com,因此如果我们需要获得权威的答复,那么

$ dig stackexchange.com @cf-dns01.stackexchange.com.

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

任何记录的工作原理

ANY 记录就像一张通配符,您可以使用它来获取缓存/存储在 DNS 服务器中的所有记录。例如,我查询了stackexchange.comANY 记录,我的默认 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.
    ....

在这里您可以看到回复仅包含有关SOAANS记录的信息。但实际上还有更多记录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.
    ....

现在我再次查询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
     ....

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

答案2

您没有理解 DNS 查询中的 TTL 字段。TTL 是客户端在再次查询名称服务器之前应缓存结果多长时间的指标。除非您使用不同的 TTL 值更新 DNS 服务器,否则响应将始终相同。每次需要将主机名解析为 IP 时都重新查询名称服务器是非常糟糕的做法。

相关内容