如何通过 SSH 隧道安全连接远程 MySQL 数据库端口?

文章导读
最稳妥的做法是通过 SSH 隧道将远程数据库端口映射到本地,避免直接把 MySQL 端口暴露在公网上,适合运维管理或远程开发场景。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

最稳妥的做法是通过 SSH 隧道将远程数据库端口映射到本地,避免直接把 MySQL 端口暴露在公网上,适合运维管理或远程开发场景。

先说结论:SSH 隧道能加密传输流量并利用 SSH 认证机制,比直接开放 3306 端口更安全。

  • 适合:需要远程管理数据库但不想开放数据库端口的场景
  • 先准备:确保拥有远程服务器的 SSH 登录权限和密钥
  • 验收:本地客户端能成功连接映射后的本地端口且数据查询正常

命令速用版

在本地终端执行以下命令,将远程服务器的 3306 端口映射到本地的 3307 端口:

ssh -L 3307:127.0.0.1:3306 -N -f user@remote_host

其中 user 是远程服务器登录用户,remote_host 是服务器 IP 或域名。完成后,本地连接 127.0.0.1:3307 即等同于连接远程数据库。

为什么会这样

MySQL 默认通信协议在未配置 SSL 的情况下是明文的,直接暴露 3306 端口容易受到中间人攻击或暴力破解。SSH 隧道利用已有的 SSH 加密通道转发数据,既不需要额外配置数据库 SSL 证书,又能复用服务器的 SSH 防火墙策略,实现网络层面的隔离。

分步处理

第一步:确认 SSH 连通性
先确保本地能通过 SSH 登录远程服务器,建议使用密钥认证而非密码,减少被爆破风险。如果尚未配置密钥,可使用 ssh-keygen 生成并通过 ssh-copy-id 上传。

第二步:建立隧道
执行上述速用版命令。参数 -N 表示不执行远程命令,-f 表示后台运行。如果需要保持连接活跃,可在 SSH 配置中开启 ServerAliveInterval

如何通过 SSH 隧道安全连接远程 MySQL 数据库端口?

第三步:配置数据库客户端
在 Navicat、DBeaver 或命令行中,主机填 127.0.0.1,端口填 3307,用户名和密码填写数据库本身的凭证,而非 SSH 凭证。

怎么验证是否生效

在本地终端使用 MySQL 客户端尝试连接:

mysql -h 127.0.0.1 -P 3307 -u db_user -p

连接成功后,执行 SELECT 1; 确认数据交互正常。同时可以在远程服务器上执行 SHOW PROCESSLIST;,能看到来自 localhost 的连接请求,说明隧道转发正确。

常见坑

1. 数据库用户权限限制
MySQL 用户表中的 host 字段必须允许来自 SSH 服务器本地的连接。通常设置为 localhost127.0.0.1 即可,因为对数据库而言,连接确实来自服务器本机。如果设置为特定 IP,可能会拒绝连接。

2. 隧道断开导致连接失效
SSH 会话超时会导致隧道关闭。建议在 SSH 配置文件 ~/.ssh/config 中增加保活设置,或使用 autossh 工具自动维护隧道连接。

3. 本地端口被占用
如果本地 3307 端口已被占用,命令会执行失败。可更换为其他高位端口,如 33070,并在客户端相应修改配置。