IPv6 DNS 解析如何在本地网络中工作

IPv6 DNS 解析如何在本地网络中工作

我有一个双栈专用网络。我的路由器是 DHCP 和 DNS 服务器。

所有客户端 IPv4 地址均已注册,并且可以按预期通过 DNS 进行查询,因为它们的主机名已在 DHCP 中注册。

现在,一些主机名查询也会返回 IPv6 地址。例如,这适用于 Windows 10 客户端和 Linux Raspberry Pi (Debian 10),但不适用于 Android 设备和 Arch Linux 服务器。

这通常是如何工作的?由于我的路由器仅通过 DHCPv6 管理 DNS 记录,因此 IPv6 地址在客户端 (SLAAC) 上自动配置。那么路由器如何知道这些 IPv6 地址?这些客户端会自行公布其 AAAA 记录吗?

答案1

通常不会。据我所知,目前没有广泛接受的机制来实现这一点(显然除了 DHCPv6 之外),只有制造商特定的黑客手段。


我最有可能的猜测是(尽管它仍然与您报告的操作系统不完全匹配):

某些路由器 DNS/DHCP 软件(例如 dnsmasq)会尝试猜测获得 DHCPv4 租约的每个设备的 SLAAC 派生地址(但具体来说只是 EUI-64 格式的地址)。由于 DHCPv4 服务器知道主机的 MAC 地址,因此它只需要知道主机的 MAC 地址即可派生 EUI-64 SLAAC 地址。

例如,dnsmasq 文档对于该dhcp-range选项(同时控制 DHCPv4、DHCPv6 和 SLAAC)说明:

ra 名称启用一种模式,该模式将 DNS 名称提供给执行 IPv6 SLAAC 的双栈主机。Dnsmasq 使用主机的 IPv4 租约来派生名称、网络段和 MAC 地址,并假设主机也将拥有使用 SLAAC 算法计算的同一网络段上的 IPv6 地址。对该地址进行 ping,如果收到回复,则会将 AAAA 记录添加到此 IPv6 地址的 DNS 中。请注意,这仅适用于直接连接的网络(而不是通过中继执行 DHCP 的网络),并且如果主机使用隐私扩展,它将不起作用。ra 名称可以与ra-无国籍斯拉克

这显然不能与从 NetworkManager 或 dhcpcd (它执行 SLAAC)获得的 RFC 7217 不透明 SLAAC 地址一起使用,也不能与 Windows 10 生成的地址一起使用,尽管它应该与 Android 和 Linux 内核的内置 SLAAC 支持兼容。

(理论上,一些路由器可以根据其邻居缓存– 例如,如果他们看到特定的 MAC 地址为 2001:db8::1234,他们可能会自动将其与相应的 DHCPv4 租约和主机名关联起来……这有点不可靠和错误,我希望你的路由器不会这样做,但这仍然不是我见过家用路由器对其 DNS 所做的最糟糕的事情。)


其他猜测:

  • 主办方确实可以自行通告 DNS 记录。所有 Windows 客户端都支持自行执行 DNS 更新(RFC 2136),只要权威服务器接受更新而无需任何身份验证,此功能在没有 Active Directory 的情况下也可以工作。可能的虽然我从未见过这种情况,但您的路由器实际上接受来自 LAN 设备的 DNS“更新”消息并使用它们来更新其自己的 DNS。

    Linux 设备几乎从来不会自动执行此操作。不过,可能值得尝试nsupdate针对您的 LAN 域运行以查看其是否有效。

  • 这并不完全令人惊讶——尽管我从来没有真正看到实际上 – 如果路由器的 DNS 服务器充当 mDNS 和/或 LLMNR(LAN 上常见的两种多播名称解析协议)的代理。


非选项:

  • 我还期望有一个“主机名”或“FQDN”选项,可以由 ICMPv6 路由器请求中的主机发送,但没有。

  • ICMPv6 确实有“节点信息请求”数据包,可用于查询主机名,但没有操作系统实现对它们的响应,因此路由器不太可能使用它们。

相关内容