远程调试代理端口严禁直接暴露公网,因jdwp协议无认证机制,address=*:5005会监听所有接口,导致任意攻击者可连接执行任意代码;必须通过ssh隧道加密转发,并确保jvm绑定地址(如127.0.0.1:5005)与隧道目标(localhost)严格一致。

远程调试代理端口不能直接暴露在公网
Java 远程调试依赖 JDWP 协议,address=*:5005 会让 JVM 监听所有网络接口——这等于把调试后门直接敞开。只要知道 IP 和端口,任何人就能 attach 并执行任意代码,等同于交出服务器控制权。
- 永远不要用
address=0.0.0.0:5005或address=*:5005配合公网 IP 启动 - 生产/测试环境必须走 SSH 隧道,让调试流量只经加密通道抵达本地 VSCode
- 如果只能临时开放,务必配合防火墙限制源 IP(如仅允许公司办公网段),且调试完立即关闭 JVM
SSH 隧道命令必须匹配 JVM 绑定地址
常见错误是 JVM 启动时写 address=localhost:5005,但 SSH 隧道却用 ssh -L 5005:remote-host:5005 ——此时隧道无法打通,因为 JVM 只响应 127.0.0.1 上的连接,而 SSH 转发默认走远程主机的 localhost 接口,两者逻辑不一致。
- 推荐启动参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:5005 - 对应 SSH 命令:
ssh -L 5005:localhost:5005 user@remote-server(注意是localhost,不是 IP) - 若用
address=*:5005,则 SSH 命令中 remote-host 必须填真实 IP,且需确认远程防火墙放行该 IP 的 5005 端口
VSCode launch.json 中的 hostName 是本地隧道终点
launch.json 里配置的 hostName 不是远程服务器 IP,而是你本地机器上 SSH 隧道监听的地址——绝大多数情况就是 localhost。填错会导致 VSCode 尝试直连远程 IP,绕过隧道,失败且不安全。
- 正确写法:
"hostName": "localhost", "port": 5005 - 错误写法:
"hostName": "192.168.1.100"(这是远程 IP,VSCode 会跳过隧道直连) - 如果用了非标准本地端口(比如
ssh -L 5006:localhost:5005),那port就得改成5006
调试前必须验证隧道连通性
很多问题其实不是配置错,而是隧道根本没生效。别急着点 F5,先用最简方式确认链路通不通。
- 运行
telnet localhost 5005(或nc -zv localhost 5005):能连上说明 SSH 隧道已就绪 - 检查远程 JVM 日志是否含
Listening for transport dt_socket at address: 127.0.0.1:5005 - 确认本地
launch.json的port和telnet测试的端口完全一致 - 如果用的是容器环境,确保容器内 JVM 的
address和宿主机 SSH 隧道目标地址对齐(例如容器内用127.0.0.1,宿主机隧道就得指向容器所在 host 的localhost)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











