не удается получить доступ к 127.0.0.1:80 вне WSL2 / Ubuntu 20.04

Вопрос или проблема

Я использую Ubuntu 20.04 на WSL2 / Hyper-V / Windows 10.

Когда я ввожу curl http://127.0.0.1 в Ubuntu, я получаю следующий ответ:

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.19.3</center>
</body>
</html>

Когда я делаю это на хосте – непосредственно на Windows 10 (с Git Bash), я получаю следующее:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
curl: (7) Не удалось подключиться к 127.0.0.1 порт 80: Соединение отклонено

Как сделать так, чтобы порт 80 был доступен вне Ubuntu? Мне нужно обновить правила брандмауэра в Windows или что-то еще?

Это потому, что каждый хост имеет свой localhost 127.0.0.1. Хост Windows считает, что он обращается к себе. Самое простое решение – использовать реальный IP. Например, 192.168.x.x

Я нашел следующий фрагмент информации

На ранних стадиях WSL 2 мы не можем использовать localhost. Нам нужен IP, так как Linux находится внутри VM.

Чтобы получить доступ к вашему приложению в данный момент, мы будем использовать IP.

Проблема:

Windows 10 считает, что localhost – это ::1.

PS C:\Users\michael> ping localhost

Pinging DESKTOP[::1] with 32 bytes of data:
Reply from ::1: время<1ms

Ubuntu считает, что localhost – это 127.0.0.1

$ ~ > cat /etc/hosts
# Этот файл был автоматически сгенерирован WSL. Чтобы остановить автоматическую генерацию этого файла, добавьте следующую запись в /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
127.0.1.1       DESKTOP.localdomain     DESKTOP

Текущее решение: 31.05.2022

У меня не было этой проблемы в последнее время. Я думаю, что “Сброс сети” я делал один раз за последние 4 месяца.

Решение “Сброс сети”: 27.07.2021

WSL меняется относительно быстро.

Мое текущее решение с WSL2:

  1. “Пуск->Сброс сети (настройки системы)->Сброс”
  2. Просто перезагрузите Windows, как в 1998 году.
  3. Продолжить жить своей жизнью.

Решение 1:

  1. Прочитайте эту документацию
  2. Обратите внимание на неясную заметку в настройках WSL о правде, за исключением некоторых сборок.
  3. Добавьте файл с таким содержимым в C:\Users\Me\.wslconfig или, соответственно, C:\Users\%UserProfile%\.wslconfig:
[wsl2]
localhostForwarding=true

Это то, что сработало для меня.

Решение 2:

Это не сработало так хорошо для меня, но может сработать для вас. Остановите автоматическую генерацию, как указано в комментариях в /etc/hosts, и измените localhost на ::1, чтобы они обращались к одному и тому же адаптеру. Для совместимости 0.0.0.0 привязывается ко всем интерфейсам (127.0.0.1 и ::1), поэтому это работает.

# Этот файл был автоматически сгенерирован WSL. Чтобы остановить автоматическую генерацию этого файла, добавьте следующую запись в /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       ip4-localhost
::1 localhost

...

Проблемы не возникнут? Вероятно. Если возникнут, вам придется помнить об этом, чтобы это работало.

Вот что сработало для меня, поскольку с localhost/127.0.0.1 у меня не получилось:

  1. Получите IP WSL2, используя ifconfig:
aristos32@DESKTOP-V493N00:~$ ifconfig
eth0: флаги=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.115.144  netmask 255.255.240.0  broadcast 172.21.127.255
        inet6 fe80::215:5dff:fea0:1a98  prefixlen 64  scopeid 0x20<link>
  1. Используйте этот IP в браузере вместо localhost

http://172.21.115.144/

Вы можете использовать либо IPv6 адрес для localhost в Windows http://[::1]/, либо http://localhost.
Оба работают для меня с Windows 11 и WSL2.

Моим решением было добавить как 127.0.0.1, так и ::1 для локального домена в файл hosts Windows.

127.0.0.1       mydomain.local
::1             mydomain.local

Я использую Ubuntu 20.04 на WSL2 / Windows 10
и запускаю свой бэкенд (nodejs + koa) на ubuntu (localhost) и делаю запрос с помощью postman из Windows.

С использованием URL http://127.0.0.1:port я не мог получить доступ к своему серверу

Звучит странно, но мне помогло просто изменить URL (в postman) с http://127.0.0.1:port на http://localhost:port

дата: февраль 2023.
Что я использую: Windows 10 с VSCode WSL2.
Что сработало для меня?
Отключение службы IP Helper решило проблему. Перейдите в servcies.msc> отключите ее или установите в ручной режим.
Вы также можете проверить инструмент мониторинга ресурсов в Windows, который показывает порты, используемые приложением.
Источник моего решения:
https://github.com/microsoft/WSL/issues/5575

Предложение: НИКАК не отключайте IPv6 на WSL2

Работаю с 22.04 WSL2 Windows 10 – такие же проблемы, как описано выше.

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

В попытке решить совершенно другую проблему, я получил совет отключить IPv6 для WSL2, добавив

kernelCommandLine=ipv6.disable=1

в C:\Users\MYUSER.wslconfig

Это действительно отключает IPv6 внутри WSL2… но теперь оказывается, что это было причиной того, что я потерял доступ к localhost в WSL2 из Windows.

Снова включение IPv6 для WSL2 восстановило доступ.

Я предполагаю, что Windows пытается использовать канал IPv6 ::1 localhost, чтобы получить доступ к WSL2?!?

… Просто еще одна вещь, которую вам стоит учесть, пытаясь решить эту проблему.

Проверьте брандмауэр, у меня по умолчанию был UFW

iptables -Lf

ufw status

еще одна распространенная проблема: используйте другой сетевой флаг, а не loopback или dhcp
проверьте IP-адрес с помощью ifconfig и используйте желаемый IP – в моем случае “inet 172.30.122.107”

Перезапустите службу apache2:

sudo service apache2 restart

Ответ или решение

Не удается получить доступ к 127.0.0.1:80 вне WSL2 / Ubuntu 20.04? Вы не одиноки. Эта проблема часто возникает, когда вы работаете с WSL2 (Windows Subsystem for Linux 2), поскольку WSL2 представляет собой отдельную виртуальную машину, в которой Linux не использует тот же интерфейс локальной сети, что и ваша основная система Windows. Вернемся к вашему вопросу и рассмотрим возможные решения.

Проблема

Когда вы пытаетесь получить доступ к http://127.0.0.1:80 с хостовой системы (Windows 10), соединение не устанавливается, и вы получаете ошибку "Connection refused". Однако при выполнении того же запроса внутри Ubuntu на WSL2 соединение проходит успешно. Это связано с тем, что в WSL2 localhost (127.0.0.1) относится к виртуальной машине, а не к самой Windows.

Возможные решения проблемы

  1. Использование IP-адреса WSL2:
    Поскольку WSL2 использует виртуальную сеть, лучше использовать IP-адрес интерфейса, присвоенный WSL2.

    • Запустите команду ifconfig в терминале Ubuntu и найдите сетевой интерфейс (обычно eth0), чтобы получить IP-адрес (например, 172.21.115.144).
    • Используйте этот IP-адрес для доступа к вашему приложению в браузере или Postman: http://172.21.115.144:80.
  2. Настройка конфигурации WSL:

    • Добавьте или измените файл конфигурации WSL на вашем компьютере, расположенный по адресу C:\Users\<ВашеИмяПользователя>\.wslconfig, и добавьте следующую строку:
      [wsl2]
      localhostForwarding=true
    • Это позволит перенаправлять запросы к localhost из Windows на WSL2.
  3. Проверка IPv6:

    • Убедитесь, что у вас включен IPv6 в WSL2, так как Windows может использовать его для доступа к WSL.
    • Если у вас есть строка kernelCommandLine=ipv6.disable=1 в вашем файле конфигурации WSL, уберите ее или измените, чтобы просто не отключать IPv6.
  4. Проверка межсетевого экрана:

    • Если на вашем Windows установлен фаервол (например, Windows Defender или другие программы), убедитесь, что он не блокирует ваш сервер. Проверьте правила фаервола и добавьте разрешение для порта 80.
  5. Использование доменных имен:

    • Вы можете добавить запись в файл hosts на Windows, чтобы использовать доменное имя вместо IP-адреса. Например:
      127.0.0.1       mydomain.local
      ::1             mydomain.local
    • После этого можно будет обращаться к приложению по адресу http://mydomain.local.
  6. Рестарт службы:

    • Если вы используете сервер вроде Apache или Nginx внутри WSL, убедитесь, что служба запущена. Попробуйте перезапустить ее:
      sudo service apache2 restart
    • Это гарантирует, что ваш сервер прослушивает запросы на заданном порту.

Вывод

Проблемы с доступом к localhost в WSL2 могут быть вызваны различными причинами, начиная от особенностей сетевой конфигурации до настроек безопасности. Следуя приведённым рекомендациям, вы сможете устранить проблему и настроить доступ к своим веб-приложениям из Windows. Если ни одно из предложений не помогло, возможно, стоит просмотреть журналы и конфигурации вашего сервера для дальнейшего изучения происходящего. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...