通过SSH隧道连接MySQL数据库

李洋发表于:2019年02月19日 15:48:28更新于:2019年02月19日 16:41:40

一.背景

问题所在:MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,数据安全如果只靠MySQL应用层面显然是不够的,虽然说MySQL实现的登录机制基本不存在泄露密码的风险,但是登录之后的SQL语句和执行结果的传输却都是明文传输的;

解决方案:出于数据库的安全性,数据库管理员在配置数据库时会为数据库增加一层“保护伞”,保护用户在连接数据库时的安全和信息不被泄漏,通常的做法就是通过SSH(SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell提供安全的传输和使用环境)隧道进行连接,也就是为数据库增加一个安全协议,这也导致了用户进行远程连接时的困难。

以下是通过ssh隧道连接的示意图:

0015c6baec0c129326d8498873395da

下面我们就介绍一下如何远程连接和通过SSH隧道连接滴滴云DC2中的MySQl数据库。

二.连接方法

本文操作均使用的滴滴云产品,所以操作过程中注意在"控制台"的"安全组"中设置好IP和端口的访问限制。

DC2主机名角色IP端口
10-254-81-196MySQL主机116.85.57.9422/3306
10-255-0-218远程主机116.85.33.18522/3306/3307

2.1 Linux 普通远程连接

默认情况下,MySQL帐号不允许从远程登陆,只能在localhost登录,如按照普通方式远程连接MySQL,需要添加远程主机(116.85.33.185)的登录权限。

  • 修改MySQL允许远程连接:

[root@10-254-81-196 dc2-user]# mysql -u root -p

# 本地登录MySQL;

Enter password:

# 输入MySQL密码;

mysql> grant all on *.* to root@'116.85.33.185' identified by 'pass4you';

# 允许root用户通过116.85.33.185访问数据库

mysql> flush privileges;


  • 远程连接:

[root@10-255-0-218 dc2-user]# mysql -h 116.85.57.94 -P 3306 -u root -p

# 在DC2:10-255-0-218上通过3306端口远程连接DC2:10-254-81-196中的MySQL数据库;    

Enter password:

# 输入MySQL密码;

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7591
Server version: 5.7.25 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 

# 远程连接成功。


2.2 Linux SSH隧道连接(推荐)

默认远程主机已安装MySQL;被连接MySQL不允许远程登录;

0015c6bb0090b3007328ca1fa5394e5

  • 建立隧道:

[root@10-255-0-218 dc2-user]# ssh -fCPN -L 3307:127.0.0.1:3306 -p 22 dc2-user@116.85.57.94

# 在本地打开一个SSH的守护进程,该进程会监听本地的3307端口,这个端口为隧道的入口,当访问本地的3307端口时,数据包会通过ssh进程,发送到10-254-81-196的3306端口;
# -C    使用压缩功能,是可选的,加快速度;
# -P    用一个非特权端口进行出去的连接;
# -f    一旦SSH完成认证并建立port forwarding,则转入后台运行;
# -N    不执行远程命令.该参数在只打开转发端口时很有用(V2版本SSH支持);

The authenticity of host '116.85.57.94 (116.85.57.94)' can't be established.
ECDSA key fingerprint is SHA256:lmwBveuC78QBzZBIEDPXgoNI0J58cT8u9k4A3Yh6+wQ.
ECDSA key fingerprint is MD5:aa:34:00:e4:36:d3:a3:fd:08:4d:8f:62:01:50:6f:40.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '116.85.57.94' (ECDSA) to the list of known hosts.

dc2-user@116.85.57.94's password:

# 输入被远程主机10-254-81-196的主机密码;
  • 连接数据库:

[root@10-255-0-218 dc2-user]# mysql -h 127.0.0.1 -P 3307 -u root -p

# 通过本地3307端口连接MySQL数据库;

Enter password:

# 输入MySQL密码;

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7581
Server version: 5.7.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

# 通过SSH隧道远程连接MySQL成功。

注意若购买的数据库为滴滴云云数据库 MySQL,连接时需要确保主库有关联的DC2(可通外网),并将ssh时的"127.0.0.1"修改为主库地址。

2.3 MAC 系统 SSH隧道连接(推荐)

默认远程主机已安装MySQL;被连接MySQL不允许远程登录;借助第三方工具Navicat for MySQL(免费试用版,可免费试用14天)实现SSH隧道连接MySQL,这是一套管理和开发MySQL或MariaDB的可通过图形界面操作的应用程序。

  • 安装软件

    Navicat官方网站下载Navicat for MySQL软件,并安装。

  • 创建新的连接

    常规选项:

    "连接名" 自定义填写; "主机" 填写回环地址; "端口" 填写MySQL数据库所启用的端口号; "密码" 填写MySQL数据库的密码;

0015c6bb0a2c03786995a655376accc

    SSH选项:

    "使用SSH通道" 勾选; "主机" 填写DC2:10-254-81-196的公网IP; "端口" 填写SSH所启用的端口号; "用户名" 填写滴滴云DC2登录账号,注意只能为"dc2-user"; "密码" 填写DC2:10-254-81-196的主机密码; 

0015c6bb0b82e962f81ecb6b692bbd6

  • 连接成功

0015c6bb0c67a6965e566088ede5ace