为什么 BIND 不自动尝试所有名称服务器,尤其是当 IPv6 名称服务器无法访问时?

为什么 BIND 不自动尝试所有名称服务器,尤其是当 IPv6 名称服务器无法访问时?

我正在 Ubuntu 上使用 BIND 运行递归本地名称服务器。我现在有一个 IPv4 网络。看起来 BIND 默认侦听查询并递归解析 IPv4 和 IPv6 上的名称。

我在系统日志中收到很多错误,例如

命名[1907]:解析“DELETED.FOR.PRIVACY.in-addr.arpa/PTR/IN”时出错(网络无法访问):2001:503:ba3e::2:30#53

在这种情况下,它甚至无法联系2001:503:ba3e::2:30递归过程中的第一台服务器(a.root-servers.net)。

有时(实际上,也许总是,但我不确定),发生这种情况时 dig 会返回 SERVFAIL。我不在乎是否收到这些错误消息,只要 BIND 会进行故障转移,直到找到可访问的服务器,但情况似乎并非如此。我的问题是,既然 IPv6 网络当前无法访问,为什么 BIND 不恢复到它可以找到的另一个名称服务器?我认为这就是拥有多个名称服务器的意义所在。 BIND 在解析查询时会尝试多少个名称服务器。

我知道我可以在 BIND 中禁用 IPv6,但这似乎是一个不好的做法,因为这样我的本地网络就不再自动准备好升级到 IPv6。

答案1

如果您不清楚是否有 IPv6 路由,那么明智的决定是在任何需要它的守护程序中停用它;因为出现问题并不罕见,部分原因是当涉及到同时具有 IPv4 和 IPv6 表示形式的 DNS 名称时,IPv6 比 IPv4 具有优先级。

即使没有公共 IP 地址,守护进程尝试使用 IPv6 链路本地地址作为源进行 IPv6 连接的情况也并不罕见,相信我,多年来我亲眼目睹了至少在电子邮件和 DNS 服务方面出现的问题。

对于您在 IPv6 上看到的错误类型,更令人担忧的是,经常会出现超时,甚至无法进行 IPv4 事务。

此外,没有什么可以阻止您在不久的将来再次启用 IPv6 支持;我也没有必要把事情搞混;拥有仅 IPv4 的 DNS 不会阻止它解析 IPv6 地址,以免在不久的将来您的网络中的某处出现多堆栈 IPv4/IPv6 计算机。

因此,尽力而为,将 BIND 设置为仅 IPv4;我会以 -4 命名运行;在 Debian 中你可以编辑/etc/default/bind9并将其更改为:

OPTIONS="-u bind -4"

我还会从 db.root 中取出所有 AAAA 地址,如下所示:

grep -v "AAAA" /etc/bind/db.root > /tmp/a
mv /tmp/a /etc/bind/db.root

我还将编辑/etc/gai.conf并添加以下行,以使 IPv4 优先于 IPv6:

precedence ::ffff:0:0/96  100 

我建议也在这里阅读我的答案:

第一封电子邮件被退回;第二封及后续电子邮件将通过

至于超时,当 TCP DNS 请求超时时,经过 x 次尝试后,DNS RFC 定义将使用 UDP n 次尝试重试相同的请求。

您的 IPv6 请求显然已超时,因为它仍在尝试执行这些请求,但您的路由无处可去。

除了每个 IPv6 请求大约 6 次尝试和超时之外,您仍然可能落入下一个 IPv6 根;在根名称服务器列表中,有如此多的根名称服务器可供尝试,因此不可能假定 IPv6 地址失败,它会自动重试 IPv4 地址 - 所以我冒昧地说,在获取完整请求时,您的时间变化巨大在这种情况下几乎是预期的行为。

免责声明:这是粗暴的行为,我很了解解析器的行为,而不是 BIND 代码的肮脏细节。

只有使用你tcdump才能dnstracer更好地了解正在发生的事情。查看 也可能会有所帮助named.stats

还值得注意的是,这些超时/请求会在繁忙的生产服务器中累积起来。

然而,在我看来,你只是想得太多了,并且做出了很多假设。

建议的方法是不要尝试使用您知道自己未实现的服务。

我建议仅在 IPv4 模式下运行 BIND。

相关内容