PulseSecure VPN предотвращает подключение к Интернету по WSL2
На моем предприятии мы начали переход на решение, основанное на WSL2, после того, как услышали его похвалу в сообществе.
Однако после подключения к нашей корпоративной VPN WSL не может подключаться к внешним веб-сайтам (а также к сайтам внутри VPN).
Кажется, проблема с маршрутизацией внутри окон, как ее решить?
4 ответа
Проблема заключается в основном в таблице маршрутизации в 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)
In this example, the interface that we route to is the WSL interface.After we activate the VPN, the interface of this rule should be changed to VPN interface.
Alternatively, I could just use
route
inside WSL, and see the Gateway IP. This was actually the rule ip I had to look for in
route PRINT -4
in my windows machine.
Duplicate entries
Let's assume our found rule from
route
is:
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 is clearly the VPN interface, changed earlier.We still want any traffic destined for 192.168.74.32 to reach our WSL device. Therefore we will create another route entry by:
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
Nice. we got now two entries in our table
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
Note that costs for routing might be different from what you set in the commands. However, it's more likely the VPN will get lesser weight (and therefore, preference over WSL routing entry).
modify the metrics of both entries
На этом этапе мы собираемся сделать запись маршрутизации VPN менее привлекательной, чем аналогичная запись маршрутизации WSL.
Для этого мы собираемся настроить метрику записи маршрутизации VPN так, чтобы она была выше, чем запись маршрутизации WSL. Чтобы это произошло, просто выполните:
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Juniper"} | Set-NetIPInterface -InterfaceMetric 6000
Заметка:
- Убедитесь, что строка "Juniper" однозначно и сама по себе описывает описание вашего интерфейса VPN. (опять же легко из
ipconfig /all
) - Вы можете установить значение InterfaceMetric выше 6000, если ваше правило WSL выше этого значения.
После того, как это будет сделано, Mazal Tov, соединение завершено, и ваш WSL может подключиться к Интернету (теоретически)
Настройка DNS
Эта часть могла вас не волновать, но тем не менее была частью решения, которое я предлагал. Этот вопрос уже обсуждался более чем достаточно и решение уже существует. например это репозиторий на github.
В этом решении мы просто добавляем
nameserver 8.8.8.8
(Google DNS) в файл /etc/resolv.conf внутри WSL. Не нужно перезагружаться, после сохранения изменения должны применяться мгновенно
Завершение сценария
Я автоматизировал этот процесс в этом простом, но очень сыром скрипте. Обратите внимание, что сценарий предполагает, что WSL работает под управлением Centos7 и не выполняет автоматическую модификацию DNS (для чего требуются права root внутри 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
Я модифицировал сценарий, который @Aviv опубликовал с некоторым успехом после того, как завернул | символы в двойных кавычках и вынул чек на centos. Ниже представлен конечный продукт, который у меня сработал.
#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
}
$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
Это также вызывало у меня проблемы с WSL2 и нашим клиентом Pulse Secure VPN, но мне удалось исправить это, установив wsl-vpn.
Я испробовал множество других обходных путей, которые нашел в Интернете, включая ручное добавление DNS-серверов (изменение /etc/resolv.conf), запуск дистрибутива WSL2 перед запуском VPN-клиента и т. д., но ни один из них не работал у меня.
Обходной путь сценария wsl-vpn действительно творит чудеса для меня.
У меня это сработало после добавления DNS-серверов Pulse из Windows и DNS-суффикса в /etc/resolv.conf внутри WSL2.
Теперь это выглядит ниже
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
search internal.*.com
nameserver **.***.*.*
nameserver **.***.*.*
nameserver ***.**.***.***
*s выше являются подстановочными знаками
Кроме того, вы должны отредактировать файл /etc/wsl.conf, как указано в комментариях выше. В противном случае файл /etc/resolv.conf будет перезаписан.
Я думаю, что мне нужно обновить адреса выше, когда эти DNS-серверы изменятся.