本文介绍了PulseSecure VPN阻止WSL2互联网连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我的企业中,在社区中听到WSL2的好评后,我们开始迁移到基于WSL2的解决方案。
但是,在我们连接到企业VPN后,WSL无法连接到外部网站(以及VPN内的站点)。
似乎是窗口内的路由问题,我如何解决它?
推荐答案
问题主要出在Windows的路由表中。
该解决方案包括:
- 找出路线
- 重复路由条目
- 修改两个条目的度量
- 调整DNS
查找所需的路由规则
使用route PRINT -4
可以查看现有的路由条目。
netsh interface set interface "vEthernet (WSL)" disable
netsh interface set interface "vEthernet (WSL)" enable
假设我们的规则如下:
192.168.74.32 255.255.255.240 On-link 192.168.74.33 5256
^ inet ^ mask of subnet ^Interface ^Metric (cost of routing)
在本例中,我们路由到的接口是WSL接口。我们激活VPN后,此规则的接口应更改为VPN接口。或者,我也可以在WSL中使用route
,然后查看网关IP。这实际上是我必须在Windows计算机的route PRINT -4
中查找的规则IP。重复条目
让我们假设从route
找到的规则是:
192.168.74.32 255.255.255.240 On-link 172.22.0.1 1
^ inet ^ mask of subnet ^Interface ^Metric (cost of routing)
172.22.0.1显然是之前更改过的VPN接口。我们仍然希望发往192.168.74.32的所有流量都能到达我们的WSL设备。因此,我们将通过以下方式创建另一个路由条目:
route ADD 192.168.74.32 MASK 255.255.255.240 0.0.0.0 METRIC 2 IF NN
NN -> interface index of WSL. you can find it out easily from ipconfig /all
不错。现在我们的表中有两个条目
192.168.74.32 255.255.255.240 On-link 172.22.0.1 1
192.168.74.32 255.255.255.240 On-link 192.168.74.33 522
请注意,路由成本可能与您在命令中设置的成本不同。但是,VPN更有可能获得较小的权重(因此,优先于WSL路由条目)。修改两个条目的度量
在此阶段,我们将使VPN路由条目的吸引力低于类似的WSL路由条目。
为此,我们将把VPN路由条目度量调整为高于WSL的路由条目。要实现此目的,只需执行:Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Juniper"} | Set-NetIPInterface -InterfaceMetric 6000
注意:
- 确保字符串";Juniper";唯一地描述您的VPN接口描述。(同样,很容易从
ipconfig /all
) - 如果您的WSL规则高于该值,则可以将InterfaceMetric值设置为大于6000。
完成后,Mazal Tov,链接完成,您的WSL可以连接到互联网(理论上)
调整DNS
这一部分可能不会影响您,但却是我不得不提供的解决方案的一部分。这个问题已经讨论得够多了,解决方案也已经存在了。例如this github repo。
在此解决方案中,我们只需将nameserver 8.8.8.8
(Google DNS)添加到WSL内的/etc/analyv.conf文件中。无需重新启动,保存更改后应立即应用
打包成脚本
我在这个简单但非常原始的脚本中自动化了这个过程。请注意,该脚本假定运行Centos7的WSL不会自动执行DNS修改(这需要WSL内的超级用户权限)
#Test VPN is ON
$VpnIsOn = Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Juniper"} | Measure-Object -Line
if ($VpnIsOn.Lines -eq 0)
{
Write-Host "No VPN is ON!";
exit
}
$activeWSLDist = wsl -l -q --running
if (-Not $activeWSLDist -Contains 'Centos7')
{
Write-Host "Turn ON WSL!";
exit
}
$dns = wsl -- grep -e allot -e rdlab /etc/resolv.conf | wc -l
if ($dns -eq "0")
{
Write-Host "add 'nameserver 8.8.8.8' in /etc/resolv.conf"
}
else
{
Write-Host "DNS Already configured"
}
$gateway_ip = wsl -- route -ne | grep ^[1-9] | cut -d" " -f1
$gw_mask = wsl -- route -ne | grep ^[1-9] | column -t | cut -d" " -f5
$tmp = Get-NetIPConfiguration -InterfaceAlias "*WSL*" | select InterfaceIndex
$tmp -match "d{1,4}"
$ifindex = $matches[0]
# recreate the route entry to WSL (pulse secure turs the GW to it own NIC)
route ADD $gateway_ip MASK $gw_mask 0.0.0.0 METRIC 2 IF $ifindex
# set priorities - VPN to 6000 WSL to 4000 (WSL should be done)
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Juniper"} | Set-NetIPInterface -InterfaceMetric 6000
# Not needed - but good to mention anyways
#Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "WSL"} | Set-NetIPInterface -InterfaceMetric 4000
这篇关于PulseSecure VPN阻止WSL2互联网连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!