Рейтинг:2

Как получить доступ к службе, работающей на хосте, из WSL2 (в соединении отказано)

флаг cn

У меня есть селен, работающий на моем хост-компьютере, и мое приложение находится внутри контейнера докеров (внутри WSL2).

Я пытаюсь подключить приложение к селену, который прослушивает порт 4445. Раньше это работало несколько месяцев назад, я думаю, что-то изменилось в WSL.

Хост прослушивает 4445:

PS> нетстат -ано | адрес: 4445
  TCP 0.0.0.0:4445 0.0.0.0:0 ПРОСЛУШИВАНИЕ 11604
  TCP [::]:4445 [::]:0 ПРОСЛУШИВАНИЕ 11604

Я могу получить доступ к селену с хост-машины Windows:

>curl -X ПОЧТИТЬ http://DESKTOP-HED9HVG:4445/wd/hub
{"государство":".....}

но не из WSL2:

$ curl -X POST http://172.22.241.214:4445/wd/hub
curl: (7) Не удалось подключиться к порту 172.22.241.214 4445: соединение отклонено

Я попробовал несколько вариантов ip, которые я использовал в curl:

  • IP-адрес eth0 IP
  • $(имя хоста)
  • IP-адреса по результатам ipconfig/все | найтиstr IPv4
  • IP-адрес результат маршрут -n | ГРЭП ЮГ | голова -n1 | awk '{напечатать $2}'

Я установил tcptracoute на WSL и запустил его. Это результат:

$ tcptracoute $ (имя хоста) 4445
Выбранное устройство lo, адрес 127.0.0.1, порт 53915 для исходящих пакетов
Отслеживание пути к DESKTOP-WXYZ1 (127.0.1.1) через TCP-порт 4445, не более 30 переходов
 1 DESKTOP-WXYZ1.localdomain (127.0.1.1) [закрыт] 0,075 мс 0,082 мс 0,074 мс

Кстати, пинг с WSL на хост работает:

$ пинг $(имя хоста)
PING DESKTOP-WXYZ1.localdomain (127.0.1.1) 56 (84) байт данных.
64 байта от DESKTOP-WXYZ1.localdomain (127.0.1.1): icmp_seq=1 ttl=64 time=0,053 мс

Я пытался полностью отключить брандмауэр Windows, но это не помогает. Я также добавил правило в «Брандмауэр Защитника Windows», чтобы специально включить порт 4445. Это все еще не помогло

Информация о WSL:

>wsl -l -v
  НАИМЕНОВАНИЕ СОСТОЯНИЕ ВЕРСИЯ
* Ubuntu-20.04 Запуск 2
  докер-рабочий стол работает 2
  docker-desktop-data Выполняется 2

Есть идеи, как это решить?

Рейтинг:2
флаг jp

Смотрите руководство здесь

https://docs.microsoft.com/en-us/windows/wsl/networking#accessing-windows-networking-apps-from-linux-host-ip

Если вы хотите получить доступ к сетевому приложению, работающему в Windows (например, к приложению, работающему на сервере NodeJS или SQL) из вашего дистрибутива Linux (например, Ubuntu), вам необходимо использовать IP-адрес вашего хост-компьютера. Хотя это не является распространенным сценарием, вы можете выполнить следующие шаги, чтобы заставить его работать.

Получите IP-адрес вашего хост-компьютера, выполнив эту команду из вашего дистрибутива Linux: кот /etc/resolv.conf Скопируйте IP-адрес после термина: nameserver. Подключитесь к любому серверу Windows, используя скопированный IP-адрес. На рисунке ниже показан пример подключения к серверу Node.js, работающему в Windows, через curl.

Вам также необходимо разрешить входящие подключения к этому порту на хосте. (через правило брандмауэра).

флаг cn
В этом есть загвоздка. Если вы используете демон docker на wsl, сервер имен resolv.conf, по-видимому, будет указывать на шлюз wsl в wsl, а не на фактический IP-адрес хоста Windows.
флаг jp
Вы по-прежнему можете запускать свои службы на хосте, и запросы изнутри WSL будут направляться к ним.
флаг cn
Как бы вы получили к ним доступ? Я предполагаю, что через host.docker.internal? Это зависит от рабочего стола докера, и даже если это не так (используя обходной путь хост-шлюза), он будет искать службы в WSL в качестве хоста для демона, а не те, которые работают в Windows.
флаг jp
Вы можете получить к ним доступ через IP напрямую. Запись dns — это «имя хоста» хоста. Этот IP-адрес предоставляет службы на хосте Windows, а не на WSL. В любом случае это не связано/не относится к докеру. Вы пытаетесь получить доступ к службе на хосте из контейнера?
флаг cn
Я думаю, вы уловили недопонимание. Я говорю о доступе к службам Windows из контейнера, работающего на демоне, размещенном на wsl. Запросы wsl будут переданы в службу Windows, запросы контейнеров будут искать службы в wsl, с чем я столкнулся.
Рейтинг:0
флаг cn

После многих попыток решение пришло из неясного комментария в проблемах github: https://github.com/Microsoft/WSL/issues/1032#issuecomment-891618766

В основном:

если вы также используете Docker Desktop, вы можете получить доступ к хосту Windows с помощью host.docker.internal
Рейтинг:0
флаг cn

Я сам столкнулся с этой проблемой в проекте, над которым работал, и не мог использовать рабочий стол docker.

Что мне нужно было сделать, так это установить правила брандмауэра и прокси-сервера, чтобы обойти брандмауэры wsl и Windows. Вам понадобится IP-адрес хост-адаптера Ethernet, поэтому запустите ipconfig в Windows, чтобы получить его. Вам также понадобится прослушивающий порт для службы в Windows и IP-адрес WSL (ifconfig в wsl, ищите значение ivp4 inet для eth0).

Команды для правил брандмауэра из powershell на хосте:

New-NetFireWallRule -DisplayName 'Разблокировка брандмауэра WSL' -Исходящее направление -LocalPort your_port_here -Action Allow -Protocol TCP

New-NetFireWallRule -DisplayName 'Разблокировка брандмауэра WSL' -Direction Inbound -LocalPort your_port_here -Action Allow -Protocol TCP

При обходе брандмауэра Windows вы можете «перенаправить» порты на wsl также из командной строки Windows:

netsh interface portproxy add v4tov4 listenport=your_port_here listenaddress=host_ip_here connectport=your_port_here connectaddress=wsl_ip_here

После выполнения всех команд вы сможете получить доступ к службе хоста через <host_ip>:<host_port> из контейнера.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.