在 Windows 客户端上使用 OpenVPN 时,不存在的域的 DNS 泄漏

在 Windows 客户端上使用 OpenVPN 时,不存在的域的 DNS 泄漏

我有一个连接到 Wi-Fi 热点的 Windows 客户端:

Wireless LAN adapter Wireless Network Connection 2:
   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Atheros Wireless Network Adapter
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 192.168.43.110(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.43.1
   DHCP Server . . . . . . . . . . . : 192.168.43.1
   DNS Servers . . . . . . . . . . . : 192.168.43.1
   NetBIOS over Tcpip. . . . . . . . : Disabled

Wi-Fi 热点有自己的 DNS(如上所示),它会将任何 NXDOMAIN 解析为广告“搜索页面”——这是不受欢迎的行为。这个恶意 DNS 服务器最初需要绕过 Wi-Fi 的强制门户,所以我不能只设置静态 DNS 来覆盖它。

然后我使用 OpenVPN 连接到我的家庭网络。服务器配置:

server 10.1.1.0 255.255.255.0
proto udp
dev tun21
push "route 10.1.0.0 255.255.254.0"    (my home IP subnet)
push "dhcp-option DOMAIN local"
push "dhcp-option DNS 10.1.0.8"
client-to-client

OpenVPN 服务器位于10.1.0.1,我的家庭网关上。

DNS 服务器是 pihole on 10.1.0.8

客户端配置:

client
dev tun
proto udp
remote mydynip.net
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
dhcp-option DNS 10.1.0.8    (I tried adding this for redundancy, has no effect)

OpenVPN连接成功:

Ethernet adapter Local Area Connection 3:
   Connection-specific DNS Suffix  . : local
   Description . . . . . . . . . . . : TAP-Windows Adapter V9
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 10.1.1.6(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.252
   Default Gateway . . . . . . . . . :
   DHCP Server . . . . . . . . . . . : 10.1.1.5
   DNS Servers . . . . . . . . . . . : 10.1.0.8

现在,如果 Windows 客户端查找一个域存在,一切都按预期运行。例如:

>ping mypc.local
Pinging mypc.local [10.1.0.2] with 32 bytes of data:
Reply from 10.1.0.2: bytes=32 time=60ms TTL=127
...

...我在 pihole 查询日志中看到了这一点(一切正常):

Time            Type  Domain      Client         Status         Reply
2019-07-16...   A     mypc.local  gateway.local  OK (forwarded) IP (2.5ms)

但是,如果我查找一个不存在的域名,即使有前缀.local,该域名也会解析为广告页面(!):

>ping nonexist.local
Pinging nonexist.local [198.xx.xx.xx (!!!)] with 32 bytes of data:
...

查询先穿过小孔:

Time            Type  Domain          Client         Status         Reply
2019-07-16...   A     nonexist.local  gateway.local  OK (forwarded) NXDOMAIN (2.5ms)

...但似乎在收到 NXDOMAIN 后,Windows 客户端会尝试 Wi-Fi 热点的恶意 DNS 服务器!我该如何阻止这种行为?


我尝试过的方法:添加redirect-gateway def1到客户端 OpenVPN 配置可以很好地将所有流量重定向到 VPN,但对上面描述的 DNS 行为没有任何影响。它有效地使我的家庭网关(gateway.local)连接到广告“搜索页面”,并通过 OpenVPN 隧道将其转发到 Windows 客户端。但此时,DNS 查询已经泄露到 Wi-Fi 热点的 DNS 服务器。


以下看起来是一个可能的解决方案:

如果我让 Windows 客户端查找一个域受阻在 pihole 上,Windows 不会将请求转发到 Wi-Fi 热点的 DNS:

>ping googletagservices.com
Ping request could not find host...

...在 pihole 查询日志中:

Time            Type  Domain      Client         Status             Reply
2019-07-16...   A     goo....com  gateway.local  Blocked (gravity)  - (0.5ms)

这是因为 pihole 解析了地址0.0.0.0并且 Windows 客户端似乎对此感到满意。

问题是,我如何让 pihole 使用 而0.0.0.0不是来回复所有不存在的域NXDOMAIN?我在 dnsmasq 中找不到可以做到这一点的任何选项...

答案1

哎呀,再搜索几分钟我就能找到它了!

添加block-outside-dns到 OpenVPN 客户端配置可修复此行为。

相关内容