我的日志中有许多 IPv6 地址的“网络无法访问”消息。抽样:
named[1213]: network unreachable resolving 'results.speedtest.net/AAAA/IN': 2606:4700:4700::1111#53
named[1213]: network unreachable resolving 'results.speedtest.net/A/IN': 2606:4700:4700::1111#53
named[1213]: network unreachable resolving 'results.speedtest.net/AAAA/IN': 2606:4700:4700::1001#53
named[1213]: network unreachable resolving 'results.speedtest.net/A/IN': 2606:4700:4700::1001#53
named[1213]: network unreachable resolving 'getpocket.com/A/IN': 2606:4700:4700::1111#53
标准解决方案是在绑定配置中禁用 IPv6 请求。
我想限制对 LAN 上的主机的 IPv6 请求。
作为对如何完成的猜测,我listen-on-v6 { ::1; };
在本options
节中尝试将 IPv6 限制为本地主机,但这不起作用。尽管我在启动时没有看到语法错误,但仍然收到错误消息。
答案1
每当您的 BIND 请求根 DNS 服务器或任何顶级域的 DNS 服务器的地址时,它将获得 IPv6 和 IPv4 地址的列表 - 根或 TLD 名称服务器既不知道也不关心您可能会没有 IPv6 互联网连接。
由于您至少有本地 IPv6 连接,BIND 将尝试使用 IPv6。因此,如果特定外部域的 NS 记录指定了一个具有与之关联的 IPv6 地址的 DNS 服务器名称,并且该记录恰好是当前循环顺序中的第一个记录,则 BIND 将尝试使用 IPv6 来执行其客户端之一的递归名称解析。
是的,即使客户端确实通过 IPv4 发出请求。
是的,即使客户只请求 A 记录,而不是 AAAA。
但既然你显然没有 IPv6互联网连接时,任何通过 IPv6 联系外部 DNS 服务器的尝试都将失败并出现错误network unreachable
。此时,BIND 将尝试为该 DNS 服务器列出的其他 IP 地址...并且当它尝试 IPv4 地址时,它将正常工作。
请记住:使用 DNS 协议,没有任何东西可以阻止您通过 IPv6 请求 IPv4 信息,反之亦然。当您的 BIND 代表其客户端之一执行递归解析时,它将使用它认为合适的任何协议:客户端可能已使用 IPv4 连接到您的 BIND 这一事实并不自动意味着 BIND 应该将自身限制为仅使用 IPv4 。
要告诉 BIND 不应使用外部 DNS 服务器的任何 IPv6 地址,一种可能是将整个 IPv6 地址空间(除了您的本地域之外,您的 BIND 可能已经对其具有权威)声明为虚假:
server ::/0 {
bogus yes;
};
(我还没有测试过您是否必须为您可能拥有的任何其他本地 IPv6 可访问的 DNS 服务器显式地反转此操作。)
完全阻止 BIND 尝试通过 IPv6 联系其他 DNS 服务器的另一种选择是使用该-4
选项启动 BIND,这似乎不适合您的情况,正如您所说,您的本地网络支持 IPv6,但显然没有 IPv6连接到互联网。
来源:这个问题关于服务器故障。
如果您想阻止 BIND 的任何 IPv4 客户端看到任何 IPv6 地址,您可以将此行添加到以下options
部分:
filter-aaaa-on-ipv4 break-dnssec;
但是,这对于 BIND 在与其他 DNS 服务器的传出连接上使用 IPv6 没有任何影响。只有当您的 BIND 已使用./configure --enable-filter-aaaa
构建时选项进行编译时,它才会起作用。