使用SSH隧道连接MYSQL

1. 概述

本文介绍了如何使用SSH隧道连接MySQL,网络隔离导致无法直接访问数据库的问题. 第2节对需求进行了简单的描述;第3节介绍了linux环境下,如何通过SSH隧道连接MySQL;第4节介绍了windows环境下,如何通过SSH隧道连接MySQL.

2. 需求描述

图1 需求示意图

图1描述了用户的具体需求,即用户在localhost这台机器上,数据库实例在B这台机器上,由于网络隔离的原因,用户无法直接访问B这台机器.但是,用户可用SSH到A这台机器,而A这台机器是可以访问B这台机器上的数据库实例的.因此,可以考虑将A作为跳板机,使用SSH隧道技术,以便用户在localhost上可以直接访问B这台机器上的数据库.

额外说明:接下来将以图1中的IP和端口为例,演示linux环境下和windows环境下用户通过SSH隧道访问MySQL的具体方法,在图1中,用户可以通过SSH登录到A这台机器,A的IP为106.2.32.177,A的SSH端口是1046,数据库实例所在的机器IP为10.164.172.204,数据库的端口为3306,假设现在存在一个数据库用户为test,密码为123456.

3. linux环境

假设localhost是一台linux,则可以在该机器上执行如下命令,建立一个SSH隧道:
ssh -fCPN –L 3307:10.164.172.204:3306 -p1046 rds-user@106.2.32.177

说明如下:执行上面的shell语句,会在本地打开一个ssh的守护进程,该进程会监听本地的3307端口,这个端口为隧道的入口,当访问本地的3307端口时,数据包会通过ssh进程,经由106.2.32.177(A)发送到最终的10.164.172.204(B)的3306端口,以此达到localhost机器直接访问B上的数据库实例的目的.

1
2
3
4
5
# 参数解释
# -C 使用压缩功能,是可选的,加快速度.
# -P 用一个非特权端口进行出去的连接.
# -f 一旦SSH完成认证并建立port forwarding,则转入后台运行.
# -N 不执行远程命令.该参数在只打开转发端口时很有用(V2版本SSH支持)

执行成功以后,可以通过如下命令查看SSH进程:

也可以通过如下命令查看打开的端口号:

设置完成以后,直接访问本地的3307端口,就可以登录远程的MySQL了,如下所示:

可以看到,只需要一条命令,就能够实现通过SSH隧道连接MySQL.只要保证localhost能够通过SSH登录A机器,A机器能够访问B机器上的MySQL实例,设置几乎没有任何困难.

4. windows环境

windows下通过SSH隧道连接MySQL与linux几乎一样,首先设置SSH隧道,然后连接本地的端口,下面以XShell与Navicat为例,说明如何在windows下实现通过SSH隧道的方式访问MySQL.

第一步,设置ssh连接,这与普通的SSH连接一模一样.

第二步,设置SSH隧道,如下所示:

第三步,设置完成以后,点击确定,并且使用SSH登录到A机器,以便打开SSH隧道. 第四步,打开Navicat,建立一个新的连接,连接的地址为localhost或127.0.0.1,连接的端口为3307(在本例中),如下所示:

点击Test Connection,将看到连接成功的提示,经过以上简单的几步,我们就实现了,访问localhost的本地端口,但是实际却连接的是我们原本无法访问的机器B上的数据库实例.


情景描述,公司开发数据库部署在内网,而且这个开发数据库有连接需要有IP验证,就是只能在内网的某个IP才能连接,所以每次连接都会先连接外网能访问的跳板机,在从跳板机上ssh到内网上的A机器,在从A机器连接到在内网数据库,如此几经波折,才能见到庐山真面目,内网开发数据库。但是连上才发现,所以的MySQL操作还必须能过MySQL命令行来执行,当初用习惯了Navicat,用命令行总感觉麻烦,经探索,识得一方法可以通过本地Navicat直接连接公司内网数据库。

工具:SecureCRT(当然不只是这个工具,类似这个工具的只要有端口转发即可)、Navicat;

一、通过SecureCRT设置端口转发。

1)先连上跳板机,然后设置菜单里选择选项->会话选项


点击确定。

2)此时通过SecureCRT 输入刚才设置的本地IP端口,以后需要连接的内网IP与端口、用户名(rex:不用执行这一步)

3)此时可以直接连接到公司内网(前提是跳板机连接未断开

二、Navicat设置SSH通道

1)刚才设置过的SSH本地端口和以及公司内网用户名密码 点击保存(rex:不用执行这一步)

2)输入公司内网数据库地址用户名密码

连接测试,成功。


上面的方法适用于本地终端读写MySQL,比如在本地终端执行爬虫,向MySQL写入数据,只能在SecureCRT设置端口转发。如果只是要连接MySQL修改数据的话,只要使用Navicat就可以了,操作方法如下。

一、navicat ssh连接方式

由于公司使用的是阿里云的RDS,需要通过内网连接数据库(不直接提供公网访问),此时可以使用navicat的ssh方式,通过一台跳板机连接内网的RDS

二、连接报错及解决方式

报错:SSH: expected key exchange group packet from server

解决方式:

1、升级navicat

2、修改sshd的配置

1
2
[root@Manager ~]#vim /etc/ssh/sshd_config  #编辑sshd配置文件,在最后添加
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1

参考文档:总结SSH登陆故障:expected key exchange group packet form server
navicat使用ssh登录mysql报错:expected key exchange group packet from server