vscode调试connection refused需先查windows防火墙入站规则,因其默认拦截调试端口(如2345、5678、9229),导致连接被系统层丢弃;须在“高级安全windows defender防火墙”中新建tcp端口规则,勾选域、专用、公用网络,且wsl2场景下该规则为必需。

VSCode调试时connection refused,先查Windows防火墙入站规则
绝大多数“connecting to port 2345”或“ERR_CONNECTION_REFUSED”不是代码或配置写错了,而是 Windows 防火墙直接丢弃了入站请求。WSL2 的网络对 Windows 来说属于外部来源,哪怕你绑的是 localhost,只要端口没放行,VSCode 就收不到响应。
验证方法:打开「高级安全 Windows Defender 防火墙」→「入站规则」→ 右侧「新建规则」→ 选「端口」→ TCP → 填你调试用的端口号(比如 9229 或 5678)→「允许连接」→ 必须勾选「域」「专用」「公用」→ 完成。
- 不要只放行
Code.exe,它对调试端口无效;监听端口的是node --inspect或debugpy进程,防火墙按端口判断 - 如果改过默认端口(如把
debugpy改到5679),得为新端口单独建规则,旧规则不会自动覆盖 - WSL2 场景下这个规则是刚需,缺了就必然连不上
launch.json里address写localhost还是0.0.0.0?看调试模式
address 字段填错会导致 VSCode 去连错地址,或者远程进程拒绝绑定。它不取决于你喜不喜欢用 0.0.0.0,而取决于实际网络路径和监听行为。
- 本地调试(Node 进程在 Windows 上运行):
"address": "localhost"—— 正确,node --inspect默认只绑127.0.0.1 - WSL2 调试(Node 在 WSL2 中运行,VSCode 在 Windows):
"address": "localhost"—— 仍然正确,WSL2 的 localhost 映射由系统自动处理,前提是防火墙已放行端口 - 真远程(比如树莓派):
"address": "192.168.1.100"—— 必须填目标 IP,写localhost就会连自己本机 - 如果 Node 进程显式绑了
0.0.0.0:9229,VSCode 的address仍应填目标 IP,不是0.0.0.0
端口到底有没有监听?别只信VSCode报错
VSCode 报 connection refused,最常见原因是目标端口根本没起来,或者被其他进程占用了。不能只盯着 launch.json 或 VSCode 界面,得进 WSL 终端确认。
- 在 WSL 中运行
netstat -tuln | grep :9229(把9229换成你的端口),看有没有LISTEN状态 - 如果没输出,说明
node --inspect没成功启动,检查是否漏了--inspect参数,或进程启动后立刻崩溃 - 如果有输出但显示
127.0.0.1:9229,说明只绑了回环地址,在 WSL2 下 Windows 仍可访问;若显示::1:9229(IPv6),也正常 - 如果提示
Address already in use,说明端口被占,用lsof -i :9229找出 PID 并kill掉
Node服务跑在WSL里,Windows浏览器打不开localhost:3000
这不是 VSCode 的问题,是 WSL2 的 capability 限制导致的端口转发失败。普通用户在 WSL2 里无法绑定特权端口(1–1023),但更重要的是:即使你用 3000 这类非特权端口,Windows 侧也可能打不开,因为 WSL2 默认不自动转发所有监听端口。
- 临时解法:在 WSL 中启动服务时加
--host 0.0.0.0(如npx serve -s ./dist --host 0.0.0.0),确保监听全网卡 - 长期建议:避免把开发服务放在
/mnt/c/下运行,文件系统挂载层会干扰 inotify 和端口映射;项目必须放在 WSL 原生路径(如~/myapp) - 如果仍不行,手动触发端口转发:在 Windows PowerShell 中运行
netsh interface portproxy add v4tov4 listenport=3000 listenaddress=127.0.0.1 connectport=3000 connectaddress=$(wsl hostname -I) - 注意:每次 WSL 重启 IP 会变,这条命令需重跑;更稳的方式是写个脚本配合
wsl --shutdown后自动执行
address 值、端口监听状态、服务运行路径——这四点漏掉任意一个,都会让连接看起来“莫名其妙失败”。尤其容易忽略的是:WSL2 的 localhost 映射依赖防火墙放行,而很多人以为只要写了 localhost 就万事大吉。











