Windows 10 通过 VPN 连接进行 DNS 解析不起作用

Windows 10 通过 VPN 连接进行 DNS 解析不起作用

在 Windows 10 中,当连接到启用了拆分隧道(禁用网关)的 VPN 时,DNS 解析始终使用 LAN DNS 服务器,而忽略 VPN 连接上设置的 DNS 服务器和 DNS 后缀。

预期行为是使用 VPN 的 DNS 服务器,否则将无法解析远程网络(例如域计算机)上的 DNS 条目。

这在以前版本的 Windows 中运行正常。

这在此 Microsoft Answers 帖子

答案1

我已经通过手动永久修复了这个问题将我的 LAN 连接的度量设置为高于 VPN 连接的度量的值。

可以通过两种方式实现:

  • 通过 GUI:网络连接 > 属性 > 双击 IPv4 > 高级 > 取消选中自动度量 > 输入 15 作为接口度量 > 确定 > 确定。
  • 命令行: netsh int ip set interface interface="LAN CONNECTION NAME" metric=15

效果立竿见影(至少在使用命令行时)并且 DNS 查找现在可以按预期通过我的 VPN。

这与拆分隧道配合使用,并且是重新连接和重启后的永久修复。

IPv6 用户注意事项,您还需要更改 LAN IPv6 属性中的度量。

根据您的环境,您的 VPN 连接可能具有不同的默认度量标准。只需将您的 LAN 度量标准调整为高于 VPN 的数值即可。

请注意,您也可以更改 VPN 的度量而不是 LAN 连接的度量,但这不是永久性的,因为 Windows 会在建立连接时重置度量。

此外,如果您发现无法编辑 VPN 的 TCP/IP 属性,因为在早期的 Windows 10 版本中也存在问题, 你可以通过 Powershell 设置大多数属性

1. Get-VpnConnection
2. Set-VpnConnection -Name "myVPN" -SplitTunneling $True
3. Set-VpnConnection -Name "myVPN" -DnsSuffix yourdomain.local

或者,请参阅下面的答案,了解如何使用 PowerShell 永久解决给定 VPN 隧道的问题

答案2

在我拥有的每台物理 Win10 机器上都看到这个问题后,我在虚拟机中重新安装了 Windows 10 进行测试。我测试了此线程中的所有答案,但都不起作用。我发现解决方案是结合“Keenans”和“ECC-Dan”在此处发布的答案:

http://answers.microsoft.com/en-us/windows/forum/windows_10-networking/win-10-dns-resolution-of-remote-network-via-vpn/513bd​​eea-0d18-462e-9ec3-a41129eec736?page=1

控制面板 > 网络和共享中心 > 更改适配器设置 > 右键单击​​以太网或 Wifi 适配器 > 属性 > 双击 IPv4 > 高级 > 取消选中自动度量 > 输入 15 作为接口度量 > 确定 > 确定。

在同一属性页面上,双击 IPv6 > 高级 > 取消选中自动度量 > 输入 15 作为接口度量 > 确定 > 确定。

只有在更改这两个设置后,问题才得以解决。我测试过将其中一个改回来,但问题再次出现。更改两者后,我从命令行运行 nslookup,它返回 VPN 连接到的远程网络上的 DNS 服务器,否则它将返回本地 DNS 服务器。然后,我在以太网接口上使用 Wireshark 捕获,对随机网站进行了一些 ping,并验证没有捕获到 DNS 数据包。这证明在进行更改后,DNS 查询仅通过 VPN 连接发送,而不是同时通过所有连接发送(这称为 Win10 DNS 泄漏)。所以这也是 Win10 DNS 泄漏解决方案的一部分:

https://medium.com/@ValdikSS/beware-of-windows-10-dns-resolver-and-dns-leaks-5bc5bfb4e3f1#.7ppsn1nda

请注意,要修复 DNS 泄漏,您首先需要执行上述步骤。然后您需要设置两个注册表值。链接的文章仅列出了一个,它本身并不能修复 Win10 较新版本中的问题。设置这些注册表值:

Key: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\DNSClient
Value:  DisableSmartNameResolution
Data:  1

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters
Value: DisableParallelAandAAAA
Data:  1

只有完成所有这些操作后,您的 DNS 客户端行为才会恢复到 Win7 中的样子。您一定想知道这在 Microsoft 是如何通过 QA 的。

答案3

找出网络索引:

Get-NetIPInterface | select ifindex,*int*

ifIndex InterfaceAlias              InterfaceIndex InterfaceMetric
------- --------------              -------------- ---------------
     26 vEthernet (Default Switch)              26            5000
     11 VPN - VPN Client                        11              30
      7 Ethernet                                 7              25
      1 Loopback Pseudo-Interface 1              1              75

我的 VPN 是索引为 11 的 VPN。将 VPN“interfaceMetric”从 30 更改为 1:

Get-NetIPInterface -InterfaceIndex 11 | Set-NetIPInterface -InterfaceMetric 30

验证更改:

Get-NetIPInterface | select ifindex,*int*

ifIndex InterfaceAlias              InterfaceIndex InterfaceMetric
------- --------------              -------------- ---------------
     26 vEthernet (Default Switch)              26            5000
     11 VPN - VPN Client                        11              1
      7 Ethernet                                 7              25
      1 Loopback Pseudo-Interface 1              1              75

答案4

正如其他答案所提到的,OP 问题的解决方案是将 VPN 接口度量设置为低于所有常规网络接口的度量,合理的默认值为 1。可以通过访问 UI 来保留此设置:

在此处输入图片描述

所有给出的答案都具有有限的脚本支持。@ECC-Dan回答依赖于找到系统的网络适配器并调整度量值以使其高于 VPN 接口。相反@JoseOrtega回答调整 VPN 连接,Set-NetIPInterface但在 L2TP/IPSec 连接的情况下,重新连接时该值将丢失。此类 VPN 连接的问题是它们不是永久网络接口,而是基于称为“RASPhone”(旧拨号连接存储)的配置设置动态创建的。可以使用 powershell cmdlet 创建 VPN 连接添加 VpnConnection但缺少一个设置接口度量的特定选项。在解决这个问题之前(如何向微软报告缺少的功能?),解决方案是手动调整 RASphone 存储,可在 中找到C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk。这是通过以下脚本函数执行的,基于此论坛邮政

function PushVpnConnection(
    [string]$connName,
    [string]$connUrl,
    [string]$sharedKey)
{
    Remove-VpnConnection -AllUserConnection -Name $connName -Force 2> $null
    Add-VpnConnection -AllUserConnection -Name $connName -ServerAddress $connUrl `
        -TunnelType L2TP -L2tpPsk $sharedKey -Force -AuthenticationMethod MSChapv2,Chap `
        -SplitTunneling $True -EncryptionLevel 'Optional'

    # Tweak the rasphone to change the IpInterfaceMetric setting to 1
    $rasphonepath = 'C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk'
    $rasphone = Get-Content $rasphonepath -Raw
    $regex = "^([\s\S]*\[${connName}\][\s\S]*IpInterfaceMetric=)(\d+)([\s\S]*)$"
    $match = [Regex]::Match($rasphone, $regex)
    $rasphone = $match.Groups[1].Value + '1' + $match.Groups[3].Value
    $rasphone | Set-Content $rasphonepath
}

这将创建一个启用了拆分隧道且度量为 1 的 L2TP/IPSec VPN 连接。它必须以管理员权限运行。它可以按如下方式运行:

PushVpnConnection 'ConnectionName' 'connectionurl.com' 'presharedkey'

相关内容