![Проблемы с сетью при использовании WSL2](https://rvso.com/image/1628807/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B%20%D1%81%20%D1%81%D0%B5%D1%82%D1%8C%D1%8E%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20WSL2.png)
В настоящее время я использую Windows10 и WSL2 с Ubuntu 20.04 для разработки. В большинстве случаев это работает отлично, за исключением одной проблемы. Кажется, что-то сломалось на сетевом уровне между Windows/WSL2. При обслуживании angular с помощью 'ng serve' я не могу получить к нему доступ из Windows.
Только при использовании терминала в VS Code и открытии браузера по ссылке в выводе терминала Windows откроет его - однако он не открывает 'localhost:4200', а открывает 127.0.0.1:'random port', который не разрешен нашим прокси-сервером, что означает, что приложение Angular будет отображаться, но не будет доступно для использования. После этого приложение будет доступно с localhost:4201 - но никогда до его открытия из VS Code. Это означает, что я не могу использовать другие терминалы (например, новый Windows Terminal или ConEmu) для запуска приложений.
Насколько я могу судить, это проблема Windows, а не проблема самой установки Linux, но я не нашел способа «переустановить» часть Windows WSL2 без потери всех данных на установке Linux. Буду признателен за любые указания.
решение1
Мой ответ основан на статье Запуск публичного сервера из WSL 2, где теория заключается в том, что Windows создает виртуальный адаптер, который не подключен должным образом к сетевому адаптеру Интернета.
В статье поднимаются следующие вопросы:
В WSL убедитесь, что ваш сервер использует IPv4
Если вы используете брандмауэр в WSL, разрешите соответствующий порт (3390)
В Windows перенаправьте свой порт с публичного IP-порта на порт WSL в командной строке или Powershell с правами администратора:
netsh interface portproxy add v4tov4 listenport=$PORT listenaddress=0.0.0.0 connectport=$PORT connectaddress=127.0.0.1
В Windows разрешите порт через брандмауэр Windows, используя новое правило для входящего трафика.
Для доступа из Интернета настройте переадресацию портов на маршрутизаторе.
Видео на YouTube, описывающее процесс с некоторыми небольшими отличиями, можно найти здесь. Сеть WSL 2.
решение2
Для того чтобы это сработало, мне понадобилось три вещи:
- Обновите до последней версии Windows
wsl --shutdown
- Настройки > Сеть и Интернет > Сбросить настройки сети какописано здесь
решение3
Я тоже с этим столкнулся; вот мое решение:WSL2-PortForward.cmd
Он позаботится о правилах прокси-сервера и брандмауэра для вашего порта и уберет за собой.
@ECHO OFF
SET LXDISTRO=MyWSL2vm & SET WSL2PORT=3399 & SET HOSTPORT=3398
NETSH INTERFACE PORTPROXY RESET & NETSH AdvFirewall Firewall delete rule name="%LXDISTRO% Port Forward" > NUL
WSL -d %LXDISTRO% -- ip addr show eth0 ^| grep -oP '(?^<=inet\s)\d+(\.\d+){3}' > IP.TMP
SET /p IP=<IP.TMP
NETSH INTERFACE PORTPROXY ADD v4tov4 listenport=%HOSTPORT% listenaddress=0.0.0.0 connectport=%WSL2PORT% connectaddress=%IP%
NETSH AdvFirewall Firewall add rule name="%LXDISTRO% Port Forward" dir=in action=allow protocol=TCP localport=%HOSTPORT% > NUL
ECHO WSL2 Virtual Machine %IP%:%WSL2PORT%now accepting traffic on %COMPUTERNAME%:%HOSTPORT%
Выполните команду:
.\WSL2-PortForward.cmd
Результат:
WSL2 Virtual Machine 172.17.109.95:3399 now accepting traffic on MYCOMPUTER:3398
решение4
Выполнение этих действий решило мою проблему:
Откройте Hyper-V Manager от имени администратора.
Выберите свой ПК, откройте Virtual Switch Manager.
Выбрать WSL
Настроить на внешнюю сеть
Выберите сетевую карту, через которую проходит трафик
Затем войдите в терминал wsl2 и настройте IP-адрес. Например:
sudo ip addr flush dev eth0
sudo dhclient eth0
Вот где я это нашел:https://stackoverflow.com/a/62438375/10853017