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 不通 → 端口转发配置错误

五、预防措施

  1. 避免频繁切换 WSL2 网络:不要频繁修改 .wslconfig 的网络配置,容易导致 wslhost.exe 状态异常。

  2. 使用固定端口范围:如果运行多个服务,尽量使用固定端口,方便在 wsl --shutdown 后快速验证。

  3. 关注 WSL 版本:Windows 11 的 WSL2 网络栈变化较大,如果遇到反复出现的端口转发问题,可考虑在 .wslconfig 中尝试 networkingMode=mirrored(镜像模式,WSL 2.0.0+ 支持)。

    [wsl2]
    networkingMode=mirrored
    
  4. 编写快捷重启脚本:在 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 --shutdownwsl -d <发行版名>

更新时间:2026-07-08
问题根因:WSL2 自动端口转发服务(wslhost.exe)异常,导致 Windows 侧未建立端口映射。
最终解决wsl --shutdown 重启 WSL2 后恢复正常。

posted @ 2026-07-17 11:42  RK5123153  阅读(49)  评论(0)    收藏  举报