Windows 的智能多宿主名称解析(Smart Multi-Homed Name Resolution)旨在加速 DNS 查询,但在使用 VPN 或代理时会导致 DNS 请求绕过隧道,造成泄露和污染。
问题背景
当系统存在多个网络接口时,Windows 会向所有配置的 DNS 服务器同时发送查询,使用最快返回的结果。这在以下场景会出问题:
- VPN 环境:DNS 请求可能从物理网卡发出,绕过 VPN 隧道
- TUN 代理模式:如 sing-box、v2rayN 等,DNS 查询可能泄露真实请求
- 多网卡服务器:可能收到来自错误网络的 DNS 响应
典型症状:
- 使用 VPN 后仍能被运营商劫持 DNS
- 代理软件无法完全接管 DNS 解析
- 访问某些网站时 DNS 被污染
方法一:组策略编辑器(推荐)
适用于 Windows Pro/Enterprise/Education 版本。
按下
Win + R,输入gpedit.msc,按 Enter导航至:计算机配置 → 管理模板 → 网络 → DNS 客户端
找到并双击 “禁用智能多宿主名称解析”
选择 “已启用”,点击 应用 和 确定
重启电脑使更改生效
方法二:注册表编辑器
适用于所有 Windows 版本(包括 Home 版)。
以管理员身份运行 PowerShell
执行以下命令:
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v "EnableMulticast" /t REG_DWORD /d 0 /f- 重启电脑使设置生效
💡 此命令在注册表中创建
EnableMulticast键值并设为 0,效果等同于组策略设置。
验证注册表设置
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v EnableMulticast输出 0x0 表示已成功禁用。
方法三:临时禁用(针对特定代理软件)
如果只需要在运行特定代理时禁用,可以通过脚本临时将网卡 DNS 设为无效地址。
启动代理前执行
# 将指定网卡的 DNS 设为无效,阻止其发送 DNS 请求Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ("0.0.0.0")Set-DnsClientServerAddress -InterfaceAlias "Wi-Fi" -ServerAddresses ("0.0.0.0")关闭代理后恢复
# 恢复为自动获取(DHCP)Set-DnsClientServerAddress -InterfaceAlias "以太网" -ResetServerAddressesSet-DnsClientServerAddress -InterfaceAlias "Wi-Fi" -ResetServerAddresses⚠️ 此方法需根据实际网卡名称修改
-InterfaceAlias参数。使用Get-NetAdapter命令查看所有网卡名称。
IPv6 注意事项
上述策略主要影响 IPv4。如果设备同时有 IPv6 地址,DNS 请求仍可能通过 IPv6 泄露。
解决方案:
- 禁用网卡的 IPv6:在网络适配器属性中取消勾选 IPv6
- 使用 WFP 严格路由:通过 Windows 筛选平台强制所有流量走指定接口
- 代理软件配置:确保代理同时接管 IPv4 和 IPv6 的 DNS
总结
| 方法 | 适用版本 | 持久性 | 推荐场景 |
|---|---|---|---|
| 组策略 | Pro/Enterprise | 永久 | 长期使用 VPN/代理 |
| 注册表 | 所有版本 | 永久 | Home 版用户 |
| 临时脚本 | 所有版本 | 临时 | 仅特定软件需要 |
✅ 建议:如果你经常使用 VPN 或 TUN 模式代理,推荐使用方法一或方法二永久禁用此功能。
⚠️ 副作用:禁用后,DNS 解析可能略微变慢(因为不再并行查询),但可以确保 DNS 请求完全走预期的网络接口。