本文介绍了PulseSecure VPN阻止WSL2互联网连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的企业中,在社区中听到WSL2的好评后,我们开始迁移到基于WSL2的解决方案。

但是,在我们连接到企业VPN后,WSL无法连接到外部网站(以及VPN内的站点)。

似乎是窗口内的路由问题,我如何解决它?

推荐答案

问题主要出在Windows的路由表中。

该解决方案包括:

  • 找出路线
  • 重复路由条目
  • 修改两个条目的度量
  • 调整DNS

查找所需的路由规则

使用route PRINT -4可以查看现有的路由条目。

您可以通过手动删除任何WSL条目,直到WSL中的连接丢失,从而找出您的WSL需要哪些路由条目。找到后,可以通过禁用和启用WSL网络恢复WSL路由条目:

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互联网连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 09:10