vscode + wsl2 调试 node 时 connection refused 的主因是 windows 防火墙未放行 wsl2 监听的调试端口(如 9229),需新建入站规则允许该端口,并确保 node 启动时监听 0.0.0.0(而非 127.0.0.1),且项目位于 wsl2 文件系统内(非 /mnt/c/)。

VSCode + WSL2 调试 Node 时 connection refused,先看防火墙入站规则
绝大多数 connection refused 错误不是代码或配置问题,而是 Windows 防火墙拦掉了 WSL2 进程监听的调试端口(比如 9229)。WSL2 的虚拟网卡 IP(如 172.x.x.x)对 Windows 来说是“外部”来源,其入站连接必须显式放行——仅放行 Code.exe 没用,因为监听端口的是 WSL2 里的 node --inspect 进程,不是 VSCode 主进程。
- 打开
wf.msc→ 左侧「入站规则」→ 右键「新建规则」→ 选「端口」→ TCP → 特定本地端口(填你 launch.json 里用的端口,如9229) - 动作选「允许连接」,配置文件勾选「域」「专用」「公用」(WSL2 默认走「专用」,但全勾更稳)
- 规则名建议带环境标识,例如
vscode-node-inspect-wsl2-9229 - 如果改过端口(比如用
--inspect=0.0.0.0:5678),旧规则不生效,必须为新端口单独建一条
launch.json 中 address 写 localhost 还是 0.0.0.0?
写错会导致 VSCode 连不上,或 Node 进程直接拒绝绑定。关键看调试模式和监听地址是否匹配:
在 Windows 上执行终端命令,或对比 Windows 与 Linux 的 Shell 语法时使用。建议先检测当前 Shell 是 PowerShell 还是 cmd.exe,再给出相应命令……
- 本地调试(Node 在 Windows 本机跑):
"address": "localhost"—— 此时node --inspect默认绑定127.0.0.1:9229,VSCode 从同机连过去没问题 - WSL2 调试(Node 在 WSL2 里跑,VSCode 在 Windows):
"address": "localhost"依然正确 —— WSL2 已自动把localhost映射到其内部服务,前提是防火墙已放行对应端口 - 但 Node 启动时必须监听
0.0.0.0(而非默认的127.0.0.1),否则 WSL2 外部(即 Windows)连不到。启动命令得是:node --inspect=0.0.0.0:9229 app.js - 不要在 launch.json 里写
"address": "127.0.0.1"或"address": "0.0.0.0"—— 这会让 VSCode 去连错误地址,localhost是唯一兼容 WSL2 映射机制的写法
VSCode 主进程出站被拦,导致脚本里 fetch 失败
如果你的 Node 代码里有 fetch、https.request 或连接本地数据库(如 localhost:5432)失败,报 connect ETIMEDOUT 或 net::ERR_CONNECTION_TIMED_OUT,而同一段代码在终端里能跑通,那很可能是 VSCode GUI 进程被防火墙静默拦截了出站流量。
- 验证方法:在 VSCode 内置终端执行
curl -v https://httpbin.org/get,如果成功,说明终端继承了系统白名单;但你的脚本仍超时,问题就在 VSCode 主进程 - 去「控制面板 > Windows Defender 防火墙 > 允许应用通过防火墙」→ 点「更改设置」→ 「允许其他应用…」→ 浏览到
Code.exe(路径通常是C:\Users\<username>\AppData\Local\Programs\Microsoft VS Code\Code.exe</username>)→ 勾选「专用」和「公用」 - 重启 VSCode 时务必杀干净所有残留进程:任务管理器里结束全部
Code.exe和Code Helper (Renderer).exe - Portable 版或 Snap 安装的 VSCode 路径不同,需按实际位置添加
WSL2 文件系统位置影响调试稳定性
把项目放在 Windows 文件系统(如 C:\projects\)下再用 WSL2 访问,会触发跨文件系统桥接,不仅慢,还可能导致调试器 attach 失败或断点不命中——尤其当 Node 进程监听端口后,Windows 防火墙规则有时无法准确匹配来自 WSL2 虚拟网卡的连接请求。
- 最佳实践:项目目录必须放在 WSL2 的 Linux 文件系统内,例如
/home/username/myapp - 用
explorer.exe .可从 WSL2 终端直接打开 Windows 文件资源管理器浏览该目录,编辑体验不受影响 - 避免在
/mnt/c/...下启动node --inspect—— 即使防火墙规则正确,也常出现连接闪断或超时 - 检查当前工作目录:在 WSL2 终端运行
pwd,确保输出不以/mnt/开头
connection refused 就会准时出现。










