Node 调试协议口
9229 是 Node.js 调试器(Inspector)的默认端口:启动时加上调试参数,进程就会在这个端口上提供 DevTools 协议接口,支持断点、单步、性能分析与堆快照,浏览器通过 WebSocket 与之通信。这个接口没有任何认证,能连上就等于能在进程里执行任意代码,因此它属于绝不允许对外监听的端口类型;较新版本的 Node 已默认只绑定本机地址。
基本信息
| 服务 | Node.js Inspector(调试协议) |
|---|---|
| 协议 | TCP/HTTP 与 WebSocket(9229) |
| 用途 | 断点调试、性能分析与堆快照 |
| 启动方式 | node --inspect 或 --inspect-brk |
| 暴露要求 | 仅本机;远程调试应经隧道 |
典型使用场景
- 本地调试:启动开发进程并在浏览器开发者工具中打断点
- 首行断点:用暂停模式等待调试器接入,便于排查启动即崩溃
- 内存问题:抓取堆快照分析持续增长的对象
- 容器内调试:把端口通过隧道映射到本机,而不是直接对外监听
- 安全排查:巡检生产容器是否误带调试参数启动
启动参数对照
| 参数 | 行为 | 使用建议 |
|---|---|---|
| --inspect | 启动调试并继续运行 | 适合已在运行的服务 |
| --inspect-brk | 暂停等待接入 | 适合排查启动阶段问题 |
| --inspect=主机:端口 | 指定绑定与端口 | 仅绑定回环地址 |
| --inspect-port | 只改端口不改地址 | 避免与既有端口冲突 |
安全调试方式
安全调试方式
# 只绑定本机地址启动
node --inspect=127.0.0.1:9229 app.js
# 需要远程调试时先建隧道,再在本地浏览器接入
ssh -L 9229:127.0.0.1:9229 user@srv
# 巡检:确认是否有进程把调试口暴露在全部接口
ss -lntp | grep 9229
# 查看容器启动命令里是否带了调试参数
docker ps --format '{{.Names}} {{.Command}}' | grep inspect调试协议的接口清单可以从根路径读取:返回内容里包含 WebSocket 调试地址。这也意味着只做端口探测就能确认目标是不是 Node 调试口,排查误报时很有用,但在非自有资产上不应主动探测。
把调试口暴露在容器或宿主机的外网接口上,等价于给运行时留了一个无认证的代码执行入口:攻击者可以直接在进程里执行脚本、读取环境变量中的凭据。任何情况下都不要在生产环境用监听全部接口的调试参数。
生产巡检要点
- 检查容器启动参数与编排文件是否残留调试参数
- 检查进程实际绑定地址而非仅看端口是否开放
- 把调试端口纳入端口巡检清单,出现即告警
- 远程调试统一走隧道,不占用对外监听