在 Windows 10 中,当连接到启用了拆分隧道(禁用网关)的 VPN 时,DNS 解析始终使用 LAN DNS 服务器,而忽略 VPN 连接上设置的 DNS 服务器和 DNS 后缀。
预期行为是使用 VPN 的 DNS 服务器,否则将无法解析远程网络(例如域计算机)上的 DNS 条目。
这在以前版本的 Windows 中运行正常。
答案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
答案2
在我拥有的每台物理 Win10 机器上都看到这个问题后,我在虚拟机中重新安装了 Windows 10 进行测试。我测试了此线程中的所有答案,但都不起作用。我发现解决方案是结合“Keenans”和“ECC-Dan”在此处发布的答案:
控制面板 > 网络和共享中心 > 更改适配器设置 > 右键单击以太网或 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'