我检查了 /etc/bind/db.root 文本文件,发现所有根名称服务器 IP 都是最新的(我逐一检查了 IP)。因此,BIND9 读取了此文件并知道如何查找根服务器。
命令的输出dig . ns
显示了这一点。为什么我在输出中看不到实际的 IP 地址?这是正常的吗?
;; ANSWER SECTION:
. 13309 IN NS i.root-servers.net.
. 13309 IN NS e.root-servers.net.
. 13309 IN NS g.root-servers.net.
. 13309 IN NS d.root-servers.net.
. 13309 IN NS b.root-servers.net.
. 13309 IN NS a.root-servers.net.
. 13309 IN NS m.root-servers.net.
. 13309 IN NS l.root-servers.net.
. 13309 IN NS k.root-servers.net.
. 13309 IN NS j.root-servers.net.
. 13309 IN NS f.root-servers.net.
. 13309 IN NS c.root-servers.net.
. 13309 IN NS h.root-servers.net.
那么为什么有些人将其包含在他们的配置文件中?
zone "." {
type hint;
file "root.hints";
};
或者:
zone "." {
type hint;
file "db.root";
};
答案1
您没有在命令的答案部分看到 IP,dig
因为根服务器的 IP 不是您提供的查询的权威答案的一部分。如果您询问其中一个根如果您向根服务器提出相同的问题,您将得到一个答案,该答案在响应的“附加”部分中包含根服务器的 IP 地址,但这是因为该信息属于该问题的“管辖范围”。当您向本地递归解析器询问该信息时,它超出了管辖范围,因此您无法获得该信息。
至于为什么人们会包含根提示文件,这是因为如果没有它,DNS 服务器就不知道从哪里开始查找。由于它是一个“提示”类型的区域,因此内容永远不会用于回答查询,而只是为解析器提供一些内部信息来“引导”自身。一旦从根服务器本身收到更多最新信息,解析器就会忘记提示区域中的内容,而是使用更新的信息。
答案2
BIND9 具有默认编译到其中的根提示,在没有特定配置指令的情况下使用。
在启动时,BIND 将向根名称服务器发送“启动查询”,以用当前列表替换已加载的根提示(如果选定的根服务器没有响应,则会尝试其他根服务器)。
根名称服务器确实会返回 IP 列表,因为该列表是该查询的必要“粘合剂”。一些递归服务器可能会返回它,其他则可能不会。[我刚刚检查过,我的一个服务器会返回它,但另一个不会 - 我还没弄清楚为什么]