WSL2: порты не открываются на localhost — как пробросить и починить (2025)

Сервис в WSL2 стартует, но браузер на Windows не видит localhost:3000. Это решается: проверим адрес VM, правила фаервола, сделаем корректный portproxy и включим перенаправление в .wslconfig.

Коротко: что проверить сразу

  • Определите IP WSL2: wsl hostname -I — получите адрес вида 172.x.x.x.
  • Убедитесь, что сервис слушает на 0.0.0.0 или на IP интерфейса, а не только на 127.0.0.1 внутри WSL.
  • Временно отключите сторонний фаервол/антивирус и проверьте доступ.
Нужна помощь? Настрою проброс портов WSL2, поправлю .wslconfig и фаервол, разберусь с конфликтами Docker/WSL.

1) BIOS/UEFI

Включите виртуализацию: Intel VT-x/AMD-V и, при необходимости, SVM/Virtualization в BIOS. Для Hyper-V/WSL2 это базовое требование.

2) Драйверы и питание

Убедитесь, что установлены компоненты виртуализации Windows: «Платформа виртуальной машины», «Подсистема Windows для Linux». После изменения компонентов перезагрузите ПК.

3) Система/службы: корректный проброс и .wslconfig

Командная строка (Администратор) — выполнять по одной:

REM Узнаем IP WSL2 (можно и из PowerShell)
wsl hostname -I

REM Проверяем, не занят ли порт на Windows
netstat -ano | findstr :3000

REM Создаем правила порт-прокси Windows для порта 3000 (пример)
REM Замените 3000 и адрес 172.x.x.x на ваши значения
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=127.0.0.1 connectport=3000 connectaddress=172.20.224.1

REM Разрешим вход на порт 3000 в Брандмауэре Windows
netsh advfirewall firewall add rule name="WSL2 3000" dir=in action=allow protocol=TCP localport=3000

PowerShell (Администратор) — вставить целиком:

# Покажем процессы и кто слушает порт
Get-NetTCPConnection -LocalPort 3000 -State Listen -OwningProcess | Format-Table -AutoSize

# Включим перенаправление localhost через .wslconfig
$wslcfg = "$env:USERPROFILE\.wslconfig"
if(-not (Test-Path $wslcfg)){
  @"
[wsl2]
localhostForwarding=true
"@ | Out-File -FilePath $wslcfg -Encoding utf8
}else{
  $c = Get-Content $wslcfg -Raw
  if($c -notmatch '\[wsl2\]'){ $c = "[wsl2]`r`n" + $c }
  if($c -notmatch 'localhostForwarding'){ $c += "`r`nlocalhostForwarding=true`r`n" }
  $c | Out-File -FilePath $wslcfg -Encoding utf8
}
wsl --shutdown
Start-Sleep -Seconds 2
wsl

Внутри WSL убедитесь, что приложение слушает на 0.0.0.0 или на IP интерфейса (например, 0.0.0.0:3000), иначе Windows не увидит службу.

4) Docker/конфликты и устойчивый порт-прокси

  • Если используете Docker Desktop (WSL backend), убедитесь, что он не перехватывает порт. Измените publish-порты контейнеров.
  • Порт-прокси в Windows иногда «теряется» после смены сети. Проверьте список: netsh interface portproxy show all.
  • Для постоянного проброса сделайте планировщик задач, который пересоздаёт portproxy при входе в систему.

Диагностика

  • Проверьте, что сервис реально слушает: ss -lntp внутри WSL.
  • Проверьте, что порт открыт на Windows: Test-NetConnection -ComputerName localhost -Port 3000.
  • Если всё настроено, но доступа нет — проверьте сторонний фаервол/VPN-клиент: он может фильтровать loopback.

FAQ

localhostForwarding в .wslconfig обязателен?

Рекомендуется. На новых версиях WSL проброс часто работает из коробки, но явная настройка снижает сюрпризы.

Можно ли пробросить порт не только на localhost, а на весь LAN?

Да. В portproxy укажите listenaddress IP вашего ПК в сети. Обязательно добавьте правило в брандмауэр и учитывайте риски безопасности.

Порты работали и внезапно «исчезли».

WSL получил другой IP. Пересоздайте правила portproxy с новым адресом, либо используйте скрипт, который делает это автоматически при запуске.

Читайте также: