
Я пытаюсь разрешить WSL использовать локальный прокси-сервер (на самом деле это Fiddler) в Windows, но не вижу никаких соединений, и загрузки обычно прерываются. Как это исправить?
Я знаю, что могу подключиться к локальному хосту Linux из Windows, но как это отменить?
WSL — это Ubuntu 18.04
решение1
Я не уверен, будет ли следующее работать с приложениями, привязанными ктолькоlocalhost, но это сработало для Fiddler и WSL2:
решение2
Вам следует выполнить следующую команду в PowerShell от имени администратора:
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
Эта команда исходит из этогоБилет WSL2. Любое правило брандмауэра, связанное с IP-адресом WSL, не будет эффективным, поскольку в WSL2 IP-адрес каждый раз меняется.
Редактировать 2023: Новыйрежим сетевого зеркалаи новыйинструмент управления брандмауэромбыли реализованы.
решение3
WSL 2 требует некоторой дополнительной работы по сравнению с WSL 1.
Разрешите требуемый порт(ы) через брандмауэр.
1.1 Запуск
Windows Defender Firewall with Advanced Security
1.2 На левой панели выберите
Incoming Rules
.1.3 На правой панели нажмите
New Rule
.1.4 Для типа правила выберите
Port
. Далее.1.5 Выберите
TCP
иSpecific local ports
. Вставьте порт, список портов, разделенных запятыми, или диапазон портов. Далее.1.6 Выберите
Allow connection
. Далее.1.7 Проверить только
Public
профиль. Далее.1.8 Введите имя правила, например
WSL
, Готово.Узнайте IP-адрес WSL из него:
grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'
Это IPv4-адрес сетевого интерфейса vEthernet (WSL)
.
Проверьте подключение к хосту Windows с помощью
curl
илиtelnet
:3.1
curl ip.from.step.2:port
Я использовал эту процедуру для подключения к серверу Oracle и X-серверу, работающему под управлением Windows.
Обновлять: Поскольку IP-адрес WSL будет меняться при каждом перезапуске Windows, удобно автоматически извлекать его и обновлять файл hosts
.
В ВСЛ:
выполните
cat /etc/hosts
, чтобы узнать имя хоста Windows.Добавьте следующий код в
~/.profile
:HOST=<WINDOWS_HOSTNAME> IP_HOST=$(grep -m 1 $HOST /etc/hosts) OLD_IP=$(echo "$IP_HOST" | awk '{print $1}') NEW_IP=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}') if [ "$NEW_IP" != "$OLD_IP" ]; then echo "Updating IP Address-hostname mapping" sudo sed -i "s|$IP_HOST|$NEW_IP\t$HOST|" /etc/hosts echo "$HOST has the IP Address $NEW_IP" fi
решение4
Есть удобная «функция», которая идет в комплектеWSL-VPNKit. Если вы установите и импортируете этот дистрибутив, как показано в инструкциях README, вы затем сможете использовать его host.internal
для доступа к хосту Windows, не зная его IP-адреса.
После загрузки,
wsl --import wsl-vpnkit --version 2 $env:USERPROFILE\wsl-vpnkit wsl-vpnkit.tar.gz
Добавьте в ваш ~/.bashrc,
wsl.exe -d wsl-vpnkit --cd /app service wsl-vpnkit status >/dev/null || wsl.exe -d wsl-vpnkit --cd /app service wsl-vpnkit start
После перезагрузки терминала попробуйте нажать host.internal
из WSL. Например, если порт прокси Fiddler — 8888,
nc -v -w5 -z host.internal 8888