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.
- Временно отключите сторонний фаервол/антивирус и проверьте доступ.
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 с новым адресом, либо используйте скрипт, который делает это автоматически при запуске.