WSL2 的出现让开发者可以在 Windows 上直接运行 Linux 环境,开发和调试 Web 服务变得非常方便。然而,很多人在尝试用 Windows 浏览器访问 WSL2 内的服务时会遇到一个常见问题:
ERR_CONNECTION_REFUSED:localhost 拒绝连接
本文详细讲解问题原因,并给出一个可行的解决方案,让你可以通过 http://localhost:端口 直接访问 WSL2 内运行的服务。
一、问题背景
在 WSL2 下启动服务,例如 Spring Boot、Node.js 或 Python Flask:
# 假设服务启动在 WSL 内部 172.20.115.37:9290
mvn spring-boot:run
# 或 node server.js
# 或 python app.py
此时:
在 WSL 内部访问
curl http://localhost:9290可以正常访问在 Windows 浏览器访问
http://localhost:9290则报错:
ERR_CONNECTION_REFUSED
同时,通过 WSL 分配的 IP 访问则正常:
http://172.20.115.37:9290 ✅ 可访问
二、问题分析
WSL2 是一个虚拟化环境:
Linux 服务监听的 IP 地址决定了它能被谁访问
Windows 的
localhost自动映射只能穿透 监听在0.0.0.0的端口如果服务绑定了 WSL 的具体 IP(如
172.20.115.37)或127.0.0.1,Windows 的 localhost 就无法访问
总结:
三、解决方案:Windows 端口代理(portproxy)
如果无法修改服务监听地址,可以通过 Windows 系统自带的端口代理工具 netsh interface portproxy,将 Windows localhost 请求转发到 WSL IP。
1. 获取 WSL IP
在 WSL2 终端执行:
ip addr show eth0
假设输出 IP 为:
172.20.115.37
2. 添加端口代理
在 Windows PowerShell(管理员权限) 中执行:
netsh interface portproxy add v4tov4 `
listenaddress=127.0.0.1 listenport=9290 `
connectaddress=172.20.115.37 connectport=9290
参数说明:
3. 验证端口代理
netsh interface portproxy show all
然后在浏览器访问:
http://localhost:9290
成功访问 WSL 服务,问题解决。
4. 注意事项
WSL IP 会变化
每次重启 WSL 或 Windows,IP 都可能变化,需要重新添加 portproxy。
防火墙问题
若访问失败,可添加防火墙规则:
netsh advfirewall firewall add rule name="WSL 9290" dir=in action=allow protocol=TCP localport=9290长期方案
最稳妥的方法仍是让服务监听 0.0.0.0,Windows localhost 可直接访问,无需端口代理。
四、总结
WSL2 默认的网络机制导致 Windows localhost 无法访问仅绑定 WSL IP 的服务。
通过
netsh interface portproxy可以实现 Windows localhost → WSL IP 的端口映射。虽然可行,但建议在开发环境中尽量让服务监听 0.0.0.0,省去映射和维护麻烦。
示例效果:
WSL 服务监听
172.20.115.37:9290Windows 浏览器访问
http://localhost:9290✅ 成功