Вопрос или проблема
Я использую 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:
- “Пуск->Сброс сети (настройки системы)->Сброс”
- Просто перезагрузите Windows, как в 1998 году.
- Продолжить жить своей жизнью.
Решение 1:
- Прочитайте эту документацию
- Обратите внимание на неясную заметку в настройках WSL о правде, за исключением некоторых сборок.
- Добавьте файл с таким содержимым в
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 у меня не получилось:
- Получите 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>
- Используйте этот 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.
Возможные решения проблемы
-
Использование IP-адреса WSL2:
Поскольку WSL2 использует виртуальную сеть, лучше использовать IP-адрес интерфейса, присвоенный WSL2.- Запустите команду
ifconfig
в терминале Ubuntu и найдите сетевой интерфейс (обычноeth0
), чтобы получить IP-адрес (например, 172.21.115.144). - Используйте этот IP-адрес для доступа к вашему приложению в браузере или Postman:
http://172.21.115.144:80
.
- Запустите команду
-
Настройка конфигурации WSL:
- Добавьте или измените файл конфигурации WSL на вашем компьютере, расположенный по адресу
C:\Users\<ВашеИмяПользователя>\.wslconfig
, и добавьте следующую строку:[wsl2] localhostForwarding=true
- Это позволит перенаправлять запросы к
localhost
из Windows на WSL2.
- Добавьте или измените файл конфигурации WSL на вашем компьютере, расположенный по адресу
-
Проверка IPv6:
- Убедитесь, что у вас включен IPv6 в WSL2, так как Windows может использовать его для доступа к WSL.
- Если у вас есть строка
kernelCommandLine=ipv6.disable=1
в вашем файле конфигурации WSL, уберите ее или измените, чтобы просто не отключать IPv6.
-
Проверка межсетевого экрана:
- Если на вашем Windows установлен фаервол (например, Windows Defender или другие программы), убедитесь, что он не блокирует ваш сервер. Проверьте правила фаервола и добавьте разрешение для порта 80.
-
Использование доменных имен:
- Вы можете добавить запись в файл hosts на Windows, чтобы использовать доменное имя вместо IP-адреса. Например:
127.0.0.1 mydomain.local ::1 mydomain.local
- После этого можно будет обращаться к приложению по адресу
http://mydomain.local
.
- Вы можете добавить запись в файл hosts на Windows, чтобы использовать доменное имя вместо IP-адреса. Например:
-
Рестарт службы:
- Если вы используете сервер вроде Apache или Nginx внутри WSL, убедитесь, что служба запущена. Попробуйте перезапустить ее:
sudo service apache2 restart
- Это гарантирует, что ваш сервер прослушивает запросы на заданном порту.
- Если вы используете сервер вроде Apache или Nginx внутри WSL, убедитесь, что служба запущена. Попробуйте перезапустить ее:
Вывод
Проблемы с доступом к localhost в WSL2 могут быть вызваны различными причинами, начиная от особенностей сетевой конфигурации до настроек безопасности. Следуя приведённым рекомендациям, вы сможете устранить проблему и настроить доступ к своим веб-приложениям из Windows. Если ни одно из предложений не помогло, возможно, стоит просмотреть журналы и конфигурации вашего сервера для дальнейшего изучения происходящего. Удачи!