核心是本地端口转发(-l),通过ssh -l 3307:192.168.1.20:3306 user@203.101.55.88建立加密隧道,navicat中ssh填跳板机信息、mysql主机填127.0.0.1,springboot需配置jdbc:mysql://127.0.0.1:3307并引入jsch。

直接用SSH隧道访问内网数据库,核心是把数据库流量“套进”SSH加密通道里,不暴露真实端口,也不依赖开放公网防火墙。关键不是连上就行,而是连得对、传得密、管得住。
明确你用哪一类端口转发
SSH隧道有三种常见模式,选错就白配:
- 本地端口转发(-L):最常用。你在本地开一个端口(比如3307),所有发给它的请求,都会经SSH跳板机,转发到内网数据库的3306。适合Navicat、SpringBoot应用等主动连接场景。
- 远程端口转发(-R):跳板机开一个端口(比如3307),外部访问它,流量反向穿过SSH隧道送到你本机起的服务。适合你本地跑着开发版MySQL,想让测试同事临时连——但不适用于常规数据库访问。
- 动态端口转发(-D):在本地起一个SOCKS5代理(如1080端口),浏览器或支持代理的工具配置后,所有流量走SSH加密通道。适合需要绕过网络限制查资料,但对数据库直连支持弱,一般不用来连MySQL。
Navicat这类图形工具怎么填参数
很多人连不上,90%卡在“主机名”填错。记住两组地址必须分开:
- SSH部分:填跳板机的公网IP/域名、22端口、系统用户名(如ubuntu或root)、认证方式(密码或私钥文件)。
- MySQL部分:主机名必须填127.0.0.1或localhost(不是跳板机IP!也不是数据库内网IP!),端口填数据库实际监听端口(如3306),用户名和密码是数据库账号,不是系统账号。
命令行手动建隧道(Linux/macOS/WSL)
比图形界面更透明,也方便脚本化。例如跳板机IP是203.101.55.88,内网MySQL在192.168.1.20:3306:
基础命令(前台运行,便于调试):
ssh -L 3307:192.168.1.20:3306 user@203.101.55.88
后台静默运行(生产环境推荐):
ssh -f -N -L 3307:192.168.1.20:3306 user@203.101.55.88
其中 -f 表示后台运行,-N 表示不执行远程命令,纯做端口转发。
连通后,在本地用mysql -h 127.0.0.1 -P 3307 -u dbuser -p即可访问,所有流量已自动加密。
SpringBoot项目集成要点
不能只改数据库URL,否则会绕过隧道。正确做法是:
- 先确保SSH隧道已建立(可用上面命令手动启,或用JSch在启动时自动建);
- 数据库URL写成:jdbc:mysql://127.0.0.1:3307/mydb?useSSL=false&serverTimezone=UTC;
- 确认Maven引入了com.jcraft:jsch:0.1.55(用于程序内建隧道);
- 避免在配置中硬编码密码,优先使用环境变量或配置中心注入。










