关于 Windows DNS Client DNS Leak 你所需要知道的

当你正在阅读这篇文章的时候如果你,

1) 正在使用 Windows (这篇文章也适用于其他同样 smart 的操作系统 笑)

2) 正在当前设备(而不是部署在网关)上使用 VPN (指有一张虚拟网卡)

3) DNS 是由 DHCP 指定的 (默认)

4) 所使用的 VPN Client 不是 OpenVPN (存在一个已知的能够解决这个问题的插件,原理大致是在连接建立时执行一个脚本清空其他网卡的 DNS 设置,断开时再恢复到原本的设置)

那么我非常建议你看看这个大宝贝 https://www.dnsleaktest.com/

没错这其实是一个 Windows 的 feature (

surprise!

这或许是一个足够老生常谈的问题(至少在不止五年前就有人讨论过)..但直到今天在互联网上仍然很难找到解决方案,或者说...正确的解决方案

既然你看到了这里,或许你已经找到了一篇通过启用叫做 Turn off smart multi-homed name resolution 的组策略来关闭 smart multi-homed name resolution 的教程

但我相信但凡认真阅读一下 m$ 对那个组策略的介绍都不会认为启用那个组策略能解决这个问题

If you enable this policy setting, the DNS client will not perform any optimizations.DNS queries will be issued across all networks first.
If you disable this policy setting, or if you do not configure this policy setting, name resolution will be optimized when issuing DNS..

被那个迫真组策略关掉的其实是 smart multi-homed name resolution 里的 smart,而不是我们真正 care 的.... multi-homed
不得不说 m$ 干得漂亮

真正的解决方案

注意一点就好

1) 确保设备上任意网卡所配置的 DNS 服务器地址都会匹配到 VPN 的路由*...在实践中这一般意味着只需要简单为设备上的网卡手动指定一个除 LAN 的网关以外任意可用的你信任的 DNS 就好(即使这里仍然只是普通的 DNS 不走 DoH 也没有关系,因为已经走了 VPN,如果你信任 VPN 出口的话)

为了更加清楚,或许有必要再稍微解释一下:

因为 VPN Client 在连接建立时一般会设置一条优先级最高的 0.0.0.0 的路由,所以几乎所有流量都会走 VPN 的 TUN/TAP 设备...理论上...至少用户的预期是这样,即使 Windows 会自作主张向所有已配置的 DNS 服务器同步发送请求,至少那些多出来的请求也会走 VPN,这样即使在最坏的情况下无法保证能获取正确的解析结果(因为可能混进了一些不可信的 DNS),至少用户的隐私能得到保护,不管是哪个 DNS server 看到的都应该是 VPN 的 endpoint 不是吗

可是真的如此吗?每个网卡的 LAN 都是 on-link 的...所以在非常常见的家用路由器使用场景下如果某个接口(WLAN)的 DNS 被 DHCP 设置为该 LAN 的网关....那么非常聪明的 Windows 额外发送的那些 DNS reqs 就 Leak 到了本地的路由器上而根本不会经过 VPN,这显然是非常反直觉且与 VPN 用户的预期不符的

注:这并非唯一的解决方法,其他解决方法还包括在网关上启用 DoH/DoT,或者在本机/ LAN 内跑一个能通过某种安全的方式进行 DNS 解析的 DNS proxy 并把所有网卡发起的 DNS 请求都指向本地的 DNS (通过手动配置或者透明代理) ,又或者直接丢掉,只要能够保证因为 Windows 无法关闭的 multi-homed name resolution 而多出来的那些 DNS requests 最终在传输过程中不被中间人嗅探/伪造响应就可以了,文中给出的方法是让这些多出来的 DNS reqs 走 VPN 网关。

点击右边的按钮加载评论,如果无法加载那估计是被墙啦..你看着办w