WSL2 端口访问不通排查笔记
适用场景:WSL2 内部能访问应用(
curl正常),但 Windows 主机浏览器/程序访问不到(localhost:port或 WSL2 IP 均失败)。环境:Windows 11 + WSL2 (Ubuntu),应用监听
:::8080
一、问题现象
| 访问路径 | 结果 | 说明 |
|---|---|---|
WSL2 内部 curl 172.24.186.43:8080 |
✅ 正常 | 应用本身运行正常 |
Windows 浏览器 http://localhost:8080 |
❌ 无法访问 | WSL2 端口转发失效 |
Windows 浏览器 http://172.24.186.43:8080 |
❌ 无法访问 | WSL2 Hyper-V 虚拟网卡隔离 |
二、排查流程(按顺序)
步骤 1:确认应用监听状态(WSL2 内部)
# 查看端口监听,确认是 :::8080(监听所有接口)而不是 127.0.0.1:8080
ss -tlnp | grep 8080
# 或
netstat -tlnp | grep 8080
预期结果:
tcp6 0 0 :::8080 :::* LISTEN 432/java
如果显示
127.0.0.1:8080,需要修改应用配置,将绑定地址改为0.0.0.0。
步骤 2:确认 WSL2 的 IP 地址
# Windows PowerShell 中执行
wsl hostname -I
示例输出:
172.24.186.43 172.18.0.1 172.17.0.1
第一个 IP 是 WSL2 的虚拟网卡地址,后续排查会用到。
步骤 3:检查 WSL2 内部防火墙(Ubuntu)
# 查看 UFW 状态
sudo ufw status verbose
# 查看 iptables 规则
sudo iptables -L -n -v | grep 8080
预期结果:
8080/tcp ALLOW IN Anywhere
如果此处未放行,执行:
sudo ufw allow 8080/tcp sudo ufw reload
步骤 4:检查 Windows 防火墙
# 以管理员身份运行 PowerShell,添加 WSL2 端口入站规则
New-NetFirewallRule -DisplayName "WSL2-Port-8080" `
-Direction Inbound `
-LocalPort 8080 `
-Protocol TCP `
-Action Allow
# 或者临时关闭防火墙测试(测试完记得开启)
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
# 测试完后恢复
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
注意:如果关闭 Windows 防火墙后仍然访问不了,说明问题不在 Windows 防火墙。
步骤 5:检查 WSL2 端口转发状态(关键)
# 查看 Windows 侧的端口转发映射
netsh interface portproxy show v4tov4
正常情况:WSL2 会自动将内部端口映射到 Windows localhost。
如果为空(无任何记录),说明 WSL2 的自动端口转发机制失效,这是最常见的根本原因。
步骤 6:测试 Windows 到 WSL2 的 TCP 连通性
# 测试 localhost 端口转发
Test-NetConnection -ComputerName localhost -Port 8080
# 测试直连 WSL2 虚拟网卡
Test-NetConnection -ComputerName 172.24.186.43 -Port 8080
失败表现:
TcpTestSucceeded : False
InterfaceAlias : vEthernet (WSL (Hyper-V firewall))
如果 Ping 通但 TCP 不通,且端口转发为空,基本可以确定是 WSL2 端口转发服务异常。
三、解决方案
方案 A:手动添加端口转发(临时修复)
# 管理员 PowerShell
netsh interface portproxy add v4tov4 `
listenport=8080 listenaddress=0.0.0.0 `
connectport=8080 connectaddress=172.24.186.43
# 验证
netsh interface portproxy show v4tov4
然后访问:http://localhost:8080
缺点:WSL2 的 IP 可能会变,重启后可能需要重新添加。
方案 B:重启 WSL2(推荐,根治)
WSL2 的 wslhost.exe 进程负责自动发现 WSL2 内部的监听端口并映射到 Windows。该进程有时会卡住,导致端口转发失效。重启 WSL2 是最有效的解决方式。
# 1. 彻底关闭 WSL2
wsl --shutdown
# 2. 等待 5-10 秒
# 3. 重新启动你的发行版
wsl -d Ubuntu-RestCloud-ETL-MongoDB
重启后,WSL2 会自动重新建立端口转发。在 Windows 浏览器中访问:
http://localhost:8080/restcloud/admin
验证:再次执行
netsh interface portproxy show v4tov4,应该能看到 8080 的映射记录。
方案 C:禁用 WSL2 的 Hyper-V 防火墙(Windows 11)
Windows 11 为 WSL2 新增了虚拟防火墙,有时会阻断端口转发。
# 查看 WSL Hyper-V 防火墙设置
Get-NetFirewallHyperVVMSetting -PolicyStore Localhost
# 临时允许所有入站(测试用)
Set-NetFirewallHyperVVMSetting `
-Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' `
-DefaultInboundAction Allow
或者在 %USERPROFILE%\.wslconfig 中永久禁用:
[wsl2]
firewall=false
保存后执行 wsl --shutdown 再重启。
四、快速决策树
WSL2 内部 curl 通?
├── 否 → 应用未启动或未监听 0.0.0.0,检查应用配置
└── 是 → Windows 浏览器访问 localhost:port 不通?
├── 检查 netsh portproxy 是否为空
│ ├── 为空 → wsl --shutdown 重启 WSL2
│ └── 有记录 → 检查 Windows 防火墙
└── 检查 Test-NetConnection 172.x.x.x -Port 8080
├── 不通 → 可能是 WSL Hyper-V 防火墙拦截
└── 通但 localhost 不通 → 端口转发配置错误
五、预防措施
-
避免频繁切换 WSL2 网络:不要频繁修改
.wslconfig的网络配置,容易导致wslhost.exe状态异常。 -
使用固定端口范围:如果运行多个服务,尽量使用固定端口,方便在
wsl --shutdown后快速验证。 -
关注 WSL 版本:Windows 11 的 WSL2 网络栈变化较大,如果遇到反复出现的端口转发问题,可考虑在
.wslconfig中尝试networkingMode=mirrored(镜像模式,WSL 2.0.0+ 支持)。[wsl2] networkingMode=mirrored -
编写快捷重启脚本:在 PowerShell 中保存为
restart-wsl.ps1:wsl --shutdown Start-Sleep -Seconds 5 wsl -d Ubuntu-RestCloud-ETL-MongoDB Write-Host "WSL2 已重启,请等待应用启动后访问 localhost:8080"
六、相关命令速查表
| 目的 | 命令 |
|---|---|
| 查看 WSL2 IP | wsl hostname -I |
| 查看端口监听 | ss -tlnp | grep 8080 |
| 查看 Ubuntu 防火墙 | sudo ufw status verbose |
| 查看端口转发 | netsh interface portproxy show v4tov4 |
| 添加端口转发 | netsh interface portproxy add v4tov4 ... |
| 测试 TCP 连通 | Test-NetConnection localhost -Port 8080 |
| 关闭 WSL2 | wsl --shutdown |
| 重启 WSL2 | wsl --shutdown 后 wsl -d <发行版名> |
更新时间:2026-07-08
问题根因:WSL2 自动端口转发服务(wslhost.exe)异常,导致 Windows 侧未建立端口映射。
最终解决:wsl --shutdown重启 WSL2 后恢复正常。

浙公网安备 33010602011771号