在Windows 10上无法通过VPN进行DNS解析

时间:2020-01-09 10:46:25  来源:igfitidea点击:

为VPN连接配置的DNS服务器和后缀在Windows 10中用于在 强制隧道模式下使用DNS解析名称(“启用在远程网络上使用默认网关”选项),如果VPN连接处于活动状态。在这种情况下,我们无法解析本地网络中的DNS名称,也无法使用内部LAN访问Internet。

同时,我们可以ping LAN上的任何资源(尝试ping网关、邻近计算机或者打印机的IP地址)。它们只能通过IP地址而不是主机名来使用。事实上,Windows10正试图通过VPN连接设置中指定的DNS服务器解析本地网络中的主机名。

我发现了一些关于禁用本地(LAN)接口的IPv6协议的建议,如果我们想使用强制隧道模式,这将有所帮助。

如果我们正在为VPN连接使用 分割隧道(“在远程网络上使用默认网关”选项未选中),我们可以从本地网络访问Internet,但无法解析远程VPN网络中的DNS地址(禁用IPv6在这里没有帮助)。

我们必须了解Windows从网络接口发送DNS查询,该接口具有最高优先级(接口度量值的较低值)。例如,VPN连接在分割隧道模式下工作(我们希望通过VPN从局域网和企业资源访问Internet)。

检查PowerShell中所有网络接口指标的值:

Get-NetIPInterface | Sort-Object Interfacemetric

上面的屏幕截图显示本地以太网连接的指标(25)低于VPN接口(100)。因此DNS流量通过具有较低度量值的接口。这意味着DNS请求被发送到本地DNS服务器,而不是用于VPN连接的DNS服务器。在此配置中,我们无法解析连接的外部VPN网络中的名称。

另外,这里应该提到Windows8.1和Windows10的DNS客户端的一个新特性。 智能多宿主名称解析(SMHNR)被添加到这些操作系统版本中,以更快地响应DNS请求。默认情况下,SMHNR会同时向系统已知的所有DNS服务器发送DNS请求,并使用它首先收到的响应(LLMNR和NetBT查询也会被发送)。它不安全,因为外部DNS服务器(为VPN连接指定)可能会看到DNS流量(DNS请求泄漏)。我们可以通过GPO在Windows 10中禁用SMHNR:计算机配置->管理模板->网络->DNS客户端-> 关闭智能多宿主名称解析=Enabled。

也可以使用以下命令禁用SMHNR(在Windows 8.1中):

Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows NT\DNSClient" -Name DisableSmartNameResolution -Value 1 -Type DWord
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters" -Name DisableParallelAandAAAA -Value 1 -Type DWord

在Windows10 Creators Update(1709)及更高版本中,DNS请求将逐个(而不是并行)发送到所有已知的DNS服务器。如果降低特定DNS的指标,则可以提高其优先级。

因此,更改接口指标允许我们通过连接(LAN或者VPN)发送DNS请求,其中名称解析对我们来说是最优先的。

因此,接口度量值越低,连接的优先级就越高。Windows根据IPv4接口的速度和类型自动分配其指标。例如,速度>200 Mbit/s的LAN连接的度量值等于10,速度为50-80 Mbit/s的Wi-Fi连接的度量值为50(参见表https://support.microsoft.com/en-us/help/299540/an-explainion-of-the-automatic-metric-feature-for-ipv4-routes).

我们可以从Windows GUI、PowerShell或者使用netsh命令更改接口度量。

例如,我们希望通过VPN连接发送DNS请求。我们必须增加LAN连接的指标,使其值超过100(在我的示例中)。

进入 控制面板->网络和互联网->网络连接,打开以太网连接的属性,选择TCP/IPv4属性,进入 高级TCP/IP设置选项卡。取消勾选 自动计量选项,将界面计量改为 120

我们可以使用以下PowerShell命令执行相同的操作(使用可以通过get-NetIPInterface cmdlet获取的LAN接口索引):

Set-NetIPInterface -InterfaceIndex 11 -InterfaceMetric 120

或者使用netsh(指定LAN连接的名称):

netsh int ip set interface interface="Ethernet0" metric=120

以同样的方式,我们可以减少VPN连接属性中的度量值。

我们还可以通过将模式更改为拆分隧道并使用PowerShell为连接指定DNS后缀来更改VPN连接的设置: