在 Windows 上访问 WSL2 服务:通过 localhost 映射 WSL IP 端口

在 Windows 上访问 WSL2 服务:通过 localhost 映射 WSL IP 端口

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 localhost 是否可访问

0.0.0.0

✅ 可以映射访问

127.0.0.1 或 172.x.x.x

❌ 不可访问(ERR_CONNECTION_REFUSED)


三、解决方案: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

参数说明:

参数

说明

listenaddress

Windows 监听的地址,这里是 localhost

listenport

Windows 上的端口号

connectaddress

WSL IP 地址

connectport

WSL 服务端口号


3. 验证端口代理

netsh interface portproxy show all

然后在浏览器访问:

http://localhost:9290

成功访问 WSL 服务,问题解决。


4. 注意事项

  1. WSL IP 会变化

    • 每次重启 WSL 或 Windows,IP 都可能变化,需要重新添加 portproxy。

  2. 防火墙问题

    • 若访问失败,可添加防火墙规则:

    netsh advfirewall firewall add rule name="WSL 9290" dir=in action=allow protocol=TCP localport=9290
    
  3. 长期方案

    • 最稳妥的方法仍是让服务监听 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:9290

  • Windows 浏览器访问 http://localhost:9290 ✅ 成功

Claude Code 安装与使用全指南(含 MiniMax API 配置) 2026-01-12

评论区