Windows 通过 SSH 隧道免密远程调试 Docker 中的 Spring Boot(JDWP)

本文档说明如何在 Windows 开发机 上,通过 SSH 隧道 + 免密登录 的方式,安全地远程调试部署在 Linux 主机 Docker 容器 中的 Spring Boot 服务(JDWP / Remote Debug)。

适用场景:

  • Spring Boot 服务运行在 Linux Docker 容器中
  • 不希望暴露 5005 调试端口到公网
  • 使用 IDEA Remote Debug
  • 使用 SSH Key 实现免密访问

一、整体架构说明

调试链路如下:

Windows IDEA → localhost:5005
→ SSH 隧道
→ Linux 主机 localhost:5005
→ Docker 容器 JVM JDWP

关键原则:

  • 对外只暴露 SSH(22 端口)
  • JDWP 端口只在内网 / 本机可访问
  • 调试流量通过 SSH 隧道转发

二、SSH 隧道命令说明

在 Windows 开发机上执行以下命令:

ssh -L 5005:127.0.0.1:5005 root@192.168.1.100

参数说明:

部分 含义 备注
-L 本地端口转发 固定参数
5005 Windows 本地监听端口 IDEA 连接的端口
127.0.0.1:5005 Linux 主机上的目标地址 5005 映射到容器 JDWP
root@192.168.1.100 Linux 测试机 SSH 地址 可使用域名

执行成功后:

  • Windows 本机的 localhost:5005 会被监听
  • 所有流量会通过 SSH 转发到 Linux 主机的 127.0.0.1:5005

三、Linux 主机与 Docker 容器约定

1. Docker 容器内 JVM 启动参数

JVM 需开启 JDWP 调试:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005

说明:

  • 5005 为容器内部 JDWP 端口
  • suspend=n 避免容器启动阻塞

2. Docker 端口映射

Docker 启动时,将容器 JDWP 端口映射到 Linux 主机的本地端口(仅本机访问):

-p 127.0.0.1:5005:5005

效果:

  • Linux 主机可通过 127.0.0.1:5005 访问容器 JDWP
  • 不对公网暴露 5005

docker run命令示例:

docker run -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005" -e SERVER_PORT=8003 --name xxx -p 8003:8003 -p 5005:5005 -d openjdk:8u322-jdk-bullseye

四、Windows 端配置 SSH 免密登录

可以参考此文档

1. 生成 SSH Key

在 Windows(Git Bash / WSL / PowerShell)执行:

cd ~
mkdir -p .ssh
cd .ssh
ssh-keygen -t rsa -f for192.168.1.100

说明:

  • 私钥:for192.168.1.100
  • 公钥:for192.168.1.100.pub
  • 可不设置 passphrase 以便自动化

2. 拷贝公钥到 Linux 主机

执行:

ssh-copy-id -i ./for192.168.1.100.pub root@192.168.1.100

首次需要输入 root 密码,之后即可免密登录

3. 配置 SSH Client(~/.ssh/config)

在 Windows 的 ~/.ssh/config 文件中添加:

Host 192.168.1.100
    HostName 192.168.1.100
    User root
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/for192.168.1.100

配置完成后:

  • SSH 自动使用指定私钥
  • 不再询问密码

五、验证免密与隧道

1. 验证免密登录

ssh root@192.168.1.100

如果无需输入密码即可登录,说明配置成功

2. 建立 SSH 隧道

ssh -L 5005:127.0.0.1:5005 root@192.168.1.100

保持该终端窗口不关闭

六、IDEA Remote Debug 配置

在 IntelliJ IDEA 中:

Run → Edit Configurations → + → Remote JVM Debug

配置如下:

Host: localhost
Port: 5005

点击 Debug,即可远程调试 Docker 容器中的 Spring Boot 服务

七、安全与最佳实践说明

  • 不直接暴露 JDWP 端口到公网
  • 所有调试流量通过 SSH 加密隧道
  • 调试权限由 SSH 登录权限控制
  • 适用于测试环境、预发布环境

八、总结

通过 SSH 隧道实现的 Remote Debug 具有以下优点:

  • 不修改业务代码
  • 不暴露调试端口
  • 支持 Windows 开发机
  • 可与 Docker、Nacos、XXL-JOB 共存

这是当前生产和测试环境中最安全、最可控的远程调试方案。

作者:张三  创建时间:2026-01-09 19:56
最后编辑:张三  更新时间:2026-01-14 17:39