最近在实现 《指定 DNS 服务器的域名解析》任务,使用的是 res_nquery 进行域名解析(具体方案: https://codeday.me/bug/20190527/1162066.html ),在处理 IPv6 网络环境时,出现一些不能理解的情况,望大神指点。

设备环境:
客户端连接到路由( Mac 共享出来的 NAT64 网络)模拟出来的 IPv6 网络,路由外连则是常规的家庭网络( IPv4 网络)。图中第一部分 。 以下简称客户端,Mac,外部网络。
场景一:IPv6 环境下在使用默认 DNS 的情况下,解析 xyz.com 域名,如图中第二部分。抓包得到:
- 客户端向 Mac 发送 AAAA 记录的域名解析请求
- Mac 向外部网络发送 A 记录的域名解析请求
- 外部网络 DNS 解析后向 Mac 发送 A 记录的域名解析响应
- Mac 将 IPv4 地址转化成 IPv6 地址返回给客户端。
场景二:IPv6 环境下在使用指定 DNS 的情况下,解析 xyz.com 域名,如图中第三部分。抓包得到:
- 客户端向 Mac 发送 AAAA 记录的域名解析请求
- Mac 向指定 DNS 服务发送 AAAA 记录的域名解析请求
- 指定 DNS 服务中没有 xyz.com 的 AAAA 记录,响应找不到( SOA )
- Mac 响应,客户端无法解析。
问题如下:
-
根据 IPv6 相关文档解释说:在 DNS64 向 DNS 服务器查询 IPv6 的地址时,如果不存在则会询问 IPv4 的地址。为什么中间的 Mac 没有发起第二次 IPv4 的请求。 是不是 Mac 模拟的 NAT64 网络只是网络转化而已,没有 DNS64 相关功能(不用苹果的方式,自己搭建一个 DNS64 会有一次 AAAA,找不到再有一次 A )。
-
针对上面两个场景的不同,自我猜想,是否正确。
- 第一种情况,默认 DNS,客户端发起域名解析,Mac 无法解析。Mac 主动发起一次 IPv4 的解析请求到外部,得到 A 记录。然后转化成 AAAA 记录给客户端。
- 第二种情况,如果指定 DNS,NAT64 退化成一个常规的路由进行报文转发,所以网路上都是以 AAAA 的报文存在的。
-
针对第二种情况无法解析,我现在的解决方案是查询用 A 参数,解析用 AAAA 参数,可行。这种方式是否合理,如果不合理有没有其他更好的方式。 按照苹果的教程