这个问题来自这个话题。当我执行此操作时,我会获得查询的名称服务器中 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.com
ANY 记录,我的默认 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.
....
在这里您可以看到回复仅包含有关SOA
、A
和NS
记录的信息。但实际上还有更多记录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 时都重新查询名称服务器是非常糟糕的做法。