对于常规 DNS 查询,可以使用 Dig 获取包含 DNS 记录剩余 TTL 的答案。如果该答案来自缓存,则 TTL 将“倒计时”直到下一个权威查询,以及该查询出现之前的剩余时间(如本问题所述:检查名称服务器的剩余 TTL)。
如何获取负缓存记录的相应“剩余时间”?答案根据定义是“NXDOMAIN”或不存在的域;除了 SOA 记录(最大可能时间值)之外,似乎没有与此答案相关的 TTL。
我也可以直接访问 [BIND 9] 服务器,因此直接从缓存中获取这些信息的方法也是受欢迎的,尽管我希望有一种基于查询的方法来做到这一点。
答案1
没有基于查询的方式来获取服务器状态。必须使用命令从内存中转储胶水、负缓存计时器等rndc dumpdb
。
- 以 开头的记录类型
\-
被负面缓存。\-A
,\-AAAA
等等。 \-ANY
表示为真NXDOMAIN
。此实体旁边或下方均无记录。
如果您以前没有接触过这个概念NODATA
,上述内容可能会让您感到困惑。(RFC 2308) 它的意思是看到了具有 0 个答案的答案NOERROR
,而不是NXDOMAIN
。NXDOMAIN
表示根本不存在具有该名称的记录。
负面缓存条目示例:
test1.example.com. 442 \-ANY ;-$NXDOMAIN
test2.example.com. 352 \-AAAA ;-$NXRRSET
自动解析此文件并不容易,尤其是当标签名称由于重复而被省略时。
答案2
首先,应该通过回复NXDOMAIN
中的 SOA 记录传达TTL 。请参阅我的回答AUTHORITY SECTION
负面 DNS 缓存通常会持续多长时间?了解详情。
关于在后续查询中看到递减的 TTL 的问题。我相信这是一个 DNS 服务器实现细节。
在我的测试中,我观察到一些递归名称服务器不会返回AUTHORITY SECTION
带有递减 TTL 的 SOA 记录以用于后续请求,而其他一些则返回了。
例如,cloudflare 解析器会这样做(注意递减的 TTL 值):
$ dig nxdomain.serverfault.com @1.1.1.1 | grep 'AUTHORITY SECTION' -A 1
;; AUTHORITY SECTION:
serverfault.com. 674 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
$ dig nxdomain.serverfault.com @1.1.1.1 | grep 'AUTHORITY SECTION' -A 1
;; AUTHORITY SECTION:
serverfault.com. 668 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
而 AWS VPC 中的默认解析器仅在第一次请求时响应权限部分:
$ dig nxdomain.serverfault.com @169.254.169.253 | grep 'AUTHORITY SECTION' -A 1
;; AUTHORITY SECTION:
serverfault.com. 300 IN SOA ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
$ dig nxdomain.serverfault.com @169.254.169.253 | grep 'AUTHORITY SECTION' -A 1 | wc -l
0
请注意,权威服务器应始终返回完整的 TTL,该 TTL 应为 SOA.MINIMUM 字段和 SOA 记录本身的 TTL 中较小的一个。您只会在递归(缓存)名称服务器的答案中看到递减的 TTL。
还要注意,当查询递归服务器时,您通常会碰到负载均衡器,因此,您会根据碰到的负载均衡服务器得到不同的答案。