从本地电脑安全连接服务器 DB(SSH 隧道)
想用 HeidiSQL、DBeaver、MySQL Workbench 等程序查看服务器上的 DB 时,不能将 DB 端口(3306)开放到互联网。来自世界各地的自动化登录尝试会马上涌入。改用 SSH 隧道的话,就可以通过已经开放的 SSH 连接安全地连接到 DB。
关于安装 DB 和创建应用专用账户,请先参阅安装数据库。
方法 1. DB 程序的 SSH 隧道功能(最简单)
大多数 DB 程序都有 SSH 隧道设置项。
HeidiSQL
- 新建会话 → 网络类型:MariaDB or MySQL (SSH tunnel)
- 设置标签页:主机
127.0.0.1,用户、密码为 DB 账户,端口3306 - SSH 隧道标签页:SSH 主机 + 端口填服务器 IP 和
22,用户名、密码为服务器 SSH 账户,本地端口填3307等空闲的端口号
DBeaver
- 新建连接 → MariaDB(或 MySQL)
- Main 标签页:Host
127.0.0.1,Port3306,DB 账户和密码 - SSH 标签页:勾选“Use SSH Tunnel”,Host 填服务器 IP,Port
22,服务器 SSH 账户和密码(或密钥文件)
这两个账户很容易混淆。SSH 栏填写服务器登录账户,DB 栏填写 DB 账户。
方法 2. 用命令开启隧道
在本地电脑的终端(PowerShell)中运行,并保持此窗口开启。
ssh -N -L 3307:127.0.0.1:3306 username@server-ip
- 意思是把进入本地电脑
3307端口的连接转发到服务器内部的127.0.0.1:3306(DB)。 - 输入密码后,如果没有任何输出、一直停在那里,就是正常的。
现在,在 DB 程序中用主机 127.0.0.1、端口 3307、DB 账户连接。用完后,在隧道窗口中按 Ctrl + C 关闭。
无法连接时
- Access denied for user —— 请确认 DB 账户是否以
'user'@'localhost'的形式创建。使用隧道时,在 DB 看来是从服务器内部连接的。 - SSH 连接失败 —— 请先按照 SSH 连接指南确认能否在终端中连接。
- 3307 端口已被占用 —— 如果本地电脑上安装了 MySQL,请使用
3308等其他端口号。
如果是用 Docker 运行的 DB
如果像 -p 127.0.0.1:3306:3306 这样只将容器端口连接到服务器内部,就可以直接使用上面的方法。如果是用 -p 3306:3306 开放的,那就处于无视 ufw、对互联网开放的状态,请立即修正。(Docker 指南中的防火墙注意事项)