7. 支持带有 NAT64 和 DNS64 的纯 IPv6 网络
虽然许多 IPv6 过渡协议已经标准化并部署, 但其中大多数对客户端设备是透明的. NAT64 [RFC6146] 与 DNS64 [RFC6147] 的组合使用是一种正在部署的流行方案, 并且要求客户端设备做出改变. 处理这些网络的一种可能方式是让客户端设备网络栈实现 464XLAT [RFC6877]. 464XLAT 的优点是不需要修改用户空间软件; 但是, 如果应用使用 IPv4 字面地址, 它就需要逐分组转换, 并且不会鼓励客户端应用软件支持原生 IPv6. 在不支持 464XLAT 的平台上, Happy Eyeballs 引擎 SHOULD 遵循本节建议, 以正确支持带有 NAT64 和 DNS64 的纯 IPv6 网络.
本节描述的功能 SHOULD 只在主机检测到这类网络时启用. 一种简单启发式方法是检查网络是否提供可路由 IPv6 地址、不提供可路由 IPv4 地址, 并且提供 DNS 解析器地址.
7.1. IPv4 地址字面量
如果客户端应用或用户希望连接到 IPv4 地址字面量, Happy Eyeballs 引擎需要为它们执行 NAT64 地址合成. 该解决方案类似于 "Bump-in-the-Host" [RFC6535], 但在 Happy Eyeballs 库内部实现.
当传入库的是 IPv4 地址而不是主机名时, 设备使用 "Discovery of the IPv6 Prefix Used for IPv6 Address Synthesis" [RFC7050] 查询网络中的 NAT64 前缀, 然后使用 "IPv6 Addressing of IPv4/IPv6 Translators" [RFC6052] 中描述的编码合成一个或多个适当的 IPv6 地址. 随后将合成地址插入地址列表, 就像它们是 DNS 查询结果一样; 连接尝试遵循上文描述的算法 (见第 5 节).
7.2. 具有损坏 AAAA 记录的主机名
在本文撰写时, 存在数量不大但不可忽略的主机名, 它们解析为有效 A 记录和损坏的 AAAA 记录. 这里将损坏的 AAAA 记录定义为包含看似有效 IPv6 地址、但在常用端口联系这些地址时它们从不回复的 AAAA 记录. 这些问题可能由以下原因造成:
-
DNS 区域配置中 IPv6 地址输入错误
-
路由黑洞
-
服务中断
虽然符合本文档其他章节的算法会在双栈网络上正确处理这类主机名, 但它们在带有 NAT64 和 DNS64 的纯 IPv6 网络上不一定能正确工作. 由于 DNS64 递归解析器依赖权威名称服务器对 AAAA 记录发送否定 ("no error no answer") 响应来执行合成, 因此它们不会为这些特定主机名合成记录, 而是会透传损坏的 AAAA 记录.
为支持这些场景, 客户端设备需要查询 DNS 获取 A 记录, 然后执行本地合成. 由于这类主机名较少, 并且为了尽量减少 DNS 服务器负载, 只有当客户端已经放弃最初收到的 AAAA 记录时, 才应执行该 A 查询. 可以通过使用更长的超时来实现这一点, 该超时称为 "Last Resort Local Synthesis Delay"; 推荐延迟为 2 秒. 定时器在最后一次连接尝试发起时启动. 如果该定时器触发时仍没有连接尝试成功, 设备就查询 DNS 获取 IPv4 地址, 并在收到有效 A 记录后, 将其视为由应用提供的地址 (见第 7.1 节).
7.3. 虚拟专用网络 (Virtual Private Networks)
一些虚拟专用网络 (Virtual Private Networks, VPNs) 可能被配置为处理来自设备的 DNS 查询. 配置可以涵盖所有查询, 也可以涵盖某个子集, 例如 "*.internal.example.com". 这些 VPN 还可以被配置为只路由 IPv4 地址空间的一部分, 例如 192.0.2.0/24. 然而, 如果内部主机名解析为外部 IPv4 地址, 且底层网络是纯 IPv6, 就可能出现问题. 举例来说, 假设 "www.internal.example.com" 正好有一条 A 记录 198.51.100.42, 且没有 AAAA 记录. 客户端会将 DNS 查询发送到公司的递归解析器, 该解析器会回复这些记录. 此时设备只有一个要连接的 IPv4 地址, 但没有到该地址的路由. 由于公司的解析器不知道底层网络的 NAT64 前缀, 因而无法合成地址. 类似地, 底层网络的 DNS64 递归解析器不知道公司的内部地址, 因而无法解析该主机名. 因此, 客户端设备需要使用公司的解析器解析 A 记录, 然后在本地合成 IPv6 地址, 就像解析得到的 IPv4 地址是由应用提供的一样 (第 7.1 节).