标题:iOS 端 Fake-IP 在上游 DNS 返回 AAAA 时出现 DNS 泄露,macOS 同配置正常
问题描述:
我这里遇到一个比较稳定的 DNS 泄露问题,怀疑可能和 iOS 端最近的 IPv4 / IPv6 双栈处理有关。
我使用的是同一份 Mihomo 配置,DNS 开启 Fake-IP,并且 nameserver 只配置了一个我自己的私人 DNS(国内自建 AdGuard Home)。
同一份配置在 macOS Hako 和 iOS Hako 上表现完全不同。
一、macOS Hako
macOS 最新版 Hako 下表现正常:
- Fake-IP 工作符合预期
- DNS 只使用我配置的私人 DNS
- 代理流量对应域名没有发现本机 DNS 泄露
- 代理节点相关的真实域名解析最终由远端 VPS 处理
二、iOS Hako
iOS 端使用完全相同的配置时,只要我的私人 DNS 正常返回 AAAA 记录,就会出现 DNS 泄露。
而且泄露不只表现为 IPv6,有时 DNS 泄露测试中还会出现额外的 IPv4 DNS 地址。
我已经尝试在 Mihomo 配置中同时设置:
ipv6: false
dns:
ipv6: false
但问题依然存在。
也就是说,这两个配置项似乎无法阻止 iOS 端出现这个现象。
三、可以稳定消除问题的方法
目前我测试下来,唯一可以稳定消除泄露的方法是:
直接在我自己的 AdGuard Home 服务端设置“丢弃 AAAA 响应”。
也就是:
正常返回 AAAA
→ iOS Hako 出现 DNS 泄露
AdGuard Home 丢弃 AAAA
→ DNS 泄露立即消失
这个现象可以稳定复现。
而 macOS Hako 使用同一份 Mihomo 配置,即使私人 DNS 正常返回 AAAA,也没有这个问题。
四、复现条件
- Hako iOS
- Mihomo Fake-IP
- DNS 只配置一个私人 nameserver
- 私人 DNS 同时正常返回 A 和 AAAA
- 进行 DNS Leak Test
- 可以观察到额外 DNS 地址
然后只需要在私人 AdGuard Home 上禁止 / 丢弃 AAAA:
- 不修改客户端其他配置
- 再次进行 DNS Leak Test
- 泄露立即消失
五、预期行为
Fake-IP 模式下,如果已经明确指定了 nameserver,并且相关流量应该通过代理处理,不应该因为私人 DNS 返回 AAAA,就额外触发其他系统 DNS / resolver 查询。
尤其是在已经设置:
ipv6: false
dns:
ipv6: false
的情况下,理论上不应该仍然因为 AAAA 响应触发额外 DNS 行为。
六、怀疑方向
我目前不能确定根因,只能根据现象怀疑可能和以下某一层有关:
- iOS 端 IPv4 / IPv6 双栈处理
- 最近新增的双栈功能
- Happy Eyeballs / IPv4 IPv6 并发逻辑
- iOS Network Extension
- Hako iOS Adapter
- 收到 AAAA 后额外触发了系统 resolver
- 某条 IPv6 相关解析路径没有经过 Mihomo Fake-IP DNS 接管
最让我怀疑双栈相关逻辑的原因是:
只有服务端返回 AAAA 时问题才出现,一旦从服务端直接丢弃 AAAA,泄露立即完全消失。
另外,同一份配置在 macOS 端完全正常,因此感觉不像单纯是 Mihomo YAML 配置的问题,更像是 iOS 平台特有路径导致的。
希望能帮忙看看 iOS 端最近的双栈实现是否有可能绕过 Fake-IP / Mihomo DNS 流程。
标题:iOS 端 Fake-IP 在上游 DNS 返回 AAAA 时出现 DNS 泄露,macOS 同配置正常
问题描述:
我这里遇到一个比较稳定的 DNS 泄露问题,怀疑可能和 iOS 端最近的 IPv4 / IPv6 双栈处理有关。
我使用的是同一份 Mihomo 配置,DNS 开启 Fake-IP,并且 nameserver 只配置了一个我自己的私人 DNS(国内自建 AdGuard Home)。
同一份配置在 macOS Hako 和 iOS Hako 上表现完全不同。
一、macOS Hako
macOS 最新版 Hako 下表现正常:
二、iOS Hako
iOS 端使用完全相同的配置时,只要我的私人 DNS 正常返回 AAAA 记录,就会出现 DNS 泄露。
而且泄露不只表现为 IPv6,有时 DNS 泄露测试中还会出现额外的 IPv4 DNS 地址。
我已经尝试在 Mihomo 配置中同时设置:
ipv6: false
dns:
ipv6: false
但问题依然存在。
也就是说,这两个配置项似乎无法阻止 iOS 端出现这个现象。
三、可以稳定消除问题的方法
目前我测试下来,唯一可以稳定消除泄露的方法是:
直接在我自己的 AdGuard Home 服务端设置“丢弃 AAAA 响应”。
也就是:
正常返回 AAAA
→ iOS Hako 出现 DNS 泄露
AdGuard Home 丢弃 AAAA
→ DNS 泄露立即消失
这个现象可以稳定复现。
而 macOS Hako 使用同一份 Mihomo 配置,即使私人 DNS 正常返回 AAAA,也没有这个问题。
四、复现条件
然后只需要在私人 AdGuard Home 上禁止 / 丢弃 AAAA:
五、预期行为
Fake-IP 模式下,如果已经明确指定了 nameserver,并且相关流量应该通过代理处理,不应该因为私人 DNS 返回 AAAA,就额外触发其他系统 DNS / resolver 查询。
尤其是在已经设置:
ipv6: false
dns:
ipv6: false
的情况下,理论上不应该仍然因为 AAAA 响应触发额外 DNS 行为。
六、怀疑方向
我目前不能确定根因,只能根据现象怀疑可能和以下某一层有关:
最让我怀疑双栈相关逻辑的原因是:
只有服务端返回 AAAA 时问题才出现,一旦从服务端直接丢弃 AAAA,泄露立即完全消失。
另外,同一份配置在 macOS 端完全正常,因此感觉不像单纯是 Mihomo YAML 配置的问题,更像是 iOS 平台特有路径导致的。
希望能帮忙看看 iOS 端最近的双栈实现是否有可能绕过 Fake-IP / Mihomo DNS 流程。