tokenpls 定位 Hako iOS 自引用 DNS 解析失败:通配 UDP 监听在系统 VPN 扩展下收不到回环包

在 iOS 自引用 DNS 配置(dns.listen: 0.0.0.0:7874 配合 proxy-server-nameserver: udp://127.0.0.1:7874)的反馈中,作者说明原因在 Hako 内核:系统 VPN 扩展里,内核为通配地址 0.0.0.0 建立的 UDP 监听收不到发往 127.0.0.1 的包,因此 DNS 服务虽然起来了,指向 127.0.0.1 的上游查询却得不到回应,节点域名全部解析超时,于是报 dns resolve failed: couldn't find ip。他称 TCP 方向此前补过这个口子,UDP 漏了。修复做法是:DNS 监听落在通配地址时,内核在同一端口额外为 127.0.0.1 与 ::1 各开一个 UDP 监听,交给同一个 DNS 服务处理。他给出真机测试结果——隧道开启时向 127.0.0.1:7874 发送 10 次查询,修复前 0/10,修复后 10/10。该修复包含在当晚发布的 TestFlight 版本中,下一个正式版也会修复,配置无需改动。

作者原文

原因找到了,是 Hako 内核的问题。

在系统 VPN 扩展里,内核给通配地址 0.0.0.0 开的 UDP 监听收不到发往 127.0.0.1 的包。所以 dns.listen: 0.0.0.0:7874 虽然起来了,proxy-server-nameserver: udp://127.0.0.1:7874 却问不到它,节点域名全部解析超时,于是报 dns resolve failed: couldn't find ip。TCP 我们之前补过这个口子,UDP 漏了。

修复:DNS 监听在通配地址上时,内核在同一端口额外开 127.0.0.1 / ::1 的 UDP 监听,交给同一个 DNS 服务处理。真机测试,隧道开着时向 127.0.0.1:7874 发 10 次查询,修复前 0/10,修复后 10/10。

今晚发的 TestFlight 版本包含这个修复,下一个正式版也会修复。配置不用改。