我在本地托管一个递归名称服务器,因此我不需要服务提供商或其他公共 DNS 服务器进行名称解析。尽管根名称服务器 IP 地址在配置文件(在 Bind 文件中)中被硬编码,但当我为根名称服务器/etc/bind/db.root
运行几个连续的命令时,TTL 字段仍然会减少。nslookup
.
为什么在配置文件中对 TTL 进行硬编码后,TTL 会减少?
为什么在对 TTL 进行硬编码后,首先需要在根级别设置 TTL?
答案1
通常,您会明确配置与以下代码片段类似的 DNS 根服务器:
zone "." {
type hint;
file "/etc/bind/db.root";
};
您所观察到的区域类型不是常见的 ,master
而是slave
特区类型称为hint
。
当名称服务器启动时,它仅使用根提示来查找响应的根名称服务器,然后从那里获取当前的根名称服务器列表。这些是实际在操作期间将使用的根服务器。
由于这些是缓存的,因此它们将需要一个 TTL,正如您所观察到的:该 TTL 将像任何其他缓存的 DNS 记录一样减少。
如果没有为 IN 类指定提示区域,则服务器将使用已编译的默认根服务器提示集。来源:Bind管理员参考手册。
正如 Brian 在他的回答中所解释的那样,根区域确实会发生变化,并且只要至少有一个名称服务器保持有效,提示区域就允许在根名称服务器中进行此类更改,而无需所有现有名称服务器更新其静态配置文件。
答案2
它们不是永久的硬编码 - 根区域文件会随着时间而改变,因此传递给解析器的条目不能设置为永远存在。
例如,文件开头显示,当前文件最后更新于 2014 年这里:
; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers
; (e.g. reference this file in the "cache . <file>"
; configuration file of BIND domain name servers).
;
; This file is made available by InterNIC
; under anonymous FTP as
; file /domain/named.cache
; on server FTP.INTERNIC.NET
; -OR- RS.INTERNIC.NET
;
; last update: November 05, 2014
; related version of root zone: 2014110501
;
; formerly NS.INTERNIC.NET
;
. 3600000 NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30
答案3
db.root 仅用作 DNS 服务器启动过程的一部分,以查找实际的当前根服务器。然后根据 TTL 更新这些服务器。