bind 使用什么 DNS 服务器?

bind 使用什么 DNS 服务器?

我在 14.04.1 中安装了 Bind9,没有进行任何配置更改,也没有触碰任何文件/etc。这意味着我的笔记本电脑是一个缓存 DNS 服务器。

我的问题是:

  • bind 从哪里获取它的 DNS?
  • 我正在连接到哪些服务器?

我在配置文件中没有设置转发器。过去我曾使用工具来测量性能,没有转发器的 Bind9 是最快的,但 bind 从哪里获取它的 DNS 数据?

答案1

当您的笔记本电脑过去从 dhcp 服务器获取 IP 地址时,它曾经更新文件/etc/resolv.conf

如今,事情不再那么简单。Ubuntu 运行域名系统默认情况下。这是一个缓存名称服务器,可加速您的网页浏览。因此,第一个问题的答案是“来自 dnsmasq”。

顺序如下:

  • NetworkManager 获取 IP 地址和 DNS 服务器,并将 DNS 服务器的 IP 地址存储在 DBus 中

  • dnsmasq 从 DBus 获取该 IP 地址,并在没有缓存命中时将其用于上游查询。

sudo grep dnsmasq /var/log/syslog您可以使用命令(或者 syslog.1 或任何其他轮换的系统日志(如果您很久以前启动))找出您的上游 DNS 服务器。

“正确”的方法是使用以下命令:

sudo qdbus --system --literal org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/IP4Config/0 org.freedesktop.NetworkManager.IP4Config.Nameservers

它将输出一个十进制数数组,如 17249034。您将其转换为十六进制:0107330a,向后读取,分隔字节:0a.33.07.01,然后转换回十进制:10.51.7.1,这是您的上游 DNS 服务器。

答案2

我在配置文件中没有设置转发器。过去我曾使用工具来测量性能,没有转发器的 Bind9 是最快的,但 bind 从哪里获取它的 DNS 数据?

如果您没有配置任何转发器,Bind 将查询根名称服务器。这是遍布全球的 13 台服务器*,负责维护 DNS 系统的根。

要获取根名称服务器列表,请运行dig +short

[~]$ dig +short
h.root-servers.net.
b.root-servers.net.
e.root-servers.net.
g.root-servers.net.
m.root-servers.net.
a.root-servers.net.
k.root-servers.net.
d.root-servers.net.
j.root-servers.net.
f.root-servers.net.
c.root-servers.net.
i.root-servers.net.
l.root-servers.net.

这些服务器的 IP 地址非常稳定,因此 Bind 附带的默认配置包含所有这十三台服务器的条目。信息包含在 中/etc/bind/db.root

给定一个查询,bind 将查询该域的其中一个根名称服务器。例如对于 example.org,根名称服务器将回复说它不知道,但 .org 的名称服务器可能知道,并为您提供 .org 名称服务器的 IP 和名称列表。

然后,Bind 继续查询 .org 名称服务器,这些服务器可能会回答说他们不知道,但他们知道哪个名称服务器 (NS 记录) 负责 example.org,并为您提供这些名称服务器的 IP 和名称列表。最后,Bind 将查询 example.org 的 NS,并希望得到答案。

如您所见,这至少涉及三次查找,这相当慢。缓存 NS(例如 google 或 Cloudflare)将缓存常用名称,因此响应速度更快。

它还显示了 DNS 的层次结构。根服务器包含对顶级域名名称服务器的引用。TLD 自己的名称服务器包含在该 TLD 下注册的所有域名的 NS 记录,等等。

*:物理服务器数量超过 13 台。但从逻辑上讲,它们显示为 13 个不同的名称服务器。

(这其他答案关注客户端操作系统如何处理 DNS。这与 Bind 如何处理 DNS 无关。

相关内容