Сетевые проблемы с использованием WSL2
В настоящее время для разработки я использую Windows10 и WSL2 с Ubuntu 20.04. В большинстве случаев это работает отлично, за исключением одной проблемы. Кажется, что-то сломано на сетевом уровне между Windows/WSL2. При обслуживании angular с помощью ng serve я не могу получить к нему доступ из Windows.
Только при использовании терминала в VS Code и открытии браузера по ссылке в выходных данных терминала Windows откроет его, однако он не открывает "localhost:4200", он открывает 127.0.0.1: "случайный порт", который является не разрешено нашим прокси, что означает, что приложение angular будет отображаться, но не будет использоваться. После этого приложение будет доступно по адресу localhost:4201, но никогда раньше не открылось из VS Code. Это означает, что я не могу использовать другие терминалы (например, новый Windows Terminal или ConEmu) для запуска приложений.
Насколько я могу судить, это проблема Windows, а не проблема самой установки Linux, но я не нашел способа "переустановить" Windows-часть WSL2 без потери всех данных при установке Linux. Любые указатели будут оценены.
4 ответа
Мой ответ основан на статье " Запуск общедоступного сервера из 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 Networking.
Для этого мне понадобились три вещи:
- Обновите Windows до последней версии
wsl --shutdown
- Настройки> Сеть и Интернет> Сброс сети, как описано здесь
Я тоже столкнулся с этим; это мое решение: 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
Это решило мою проблему:
Откройте диспетчер Hyper-V от имени администратора.
Выберите свой компьютер, откройте диспетчер виртуальных коммутаторов.
Выберите WSL
Установить внешнюю сеть
Выберите сетевую карту, через которую проходит трафик
Затем войдите в терминал wsl2 и настройте IP-адрес. Например
sudo ip addr flush dev eth0
sudo dhclient eth0
Вот где я это нашел: https://stackoverflow.com/a/62438375/10853017