装服务器的时候,相信大家在第一次初始化 mysql 服务器的时候多多少少都有过类似于以下的两种经历:

  1. 在服务器上安装 phpmyadmin 来管理 mysql phpmyadmin

  2. 开放 mysql 的远程访问

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

但是这两种方式,都很不安全,尤其是第二种。

PS: 笔者使用的比较多的是 Windows Server,使用的后端语言也多是 PHP,所以文章是在这种氛围下形成的。

如果我们使用 SSH 隧道对远程服务器进行管理,我们无需对 mysql 进行额外的设置。

无论是什么操作系统、什么后端语言,什么数据库工具,使用 SSH 隧道进行远程管理大概需要几个前提

  1. 你的设备能够访问你的服务器设备
  2. 服务器上有安装 SSH server
  3. 你的设备上有 SSH 客户端

基于这以上三点,相信大家能够自己解决在本篇以外的问题了吧。

我这里所使用的服务器是 Windows Server,如果你和我一样,而且服务器还没安装 SSH server 的话,可以根据我的这篇文章进行安装。

# SSH!连接!

我在我的服务器(Windows Server)上安装了 mysql 并且使用的是 3306 端口。接下来我将使用 macOS 自带的 ssh 客户端工具来连接我的服务器。

在 mac 的命令行输入:

ssh username@192.168.1.10:22 -L 3307:127.0.0.1:3306

这个命令分为几个部分一一解释一下

ssh 为命令本身。

username@192.168.1.10:22 其中的 username 指的是服务器中的账号名,192.168.1.10:22 指的是服务器的 ip 地址以及端口号。

-L 3307:127.0.0.1:3306 指的是创建本地端口转发,将远程服务器中的 3306 端口映射至本地的 3307 端口。其中的 ip 地址 127.0.0.1 指的是远程服务器自己。

问题就来了??什么叫127.0.0.1指的是远程服务器自己?什么时候要设置成别的值?

假设现在有一个网络结构如下图所示:

网络结构图

本机 (192.168.50.16) 由于防火墙的原因能够访问远程服务器Computer B (10.22.12.13) 但是不能访问 Computer C (10.22.12.14)

这时候如果 Computer A 想将 Computer C 的 3306 端口映射到本地的 3307 端口。那么命令就会变成这样:

ssh username@10.22.12.13:22 -L 3307:10.22.12.14:3306

相当于让 Computer B 自己去找 Computer C 请求建立连接。所以如果是一般情况,我们想要将 Computer B 的服务映射到本地,在 -L 参数之后的 ip 地址填 127.0.0.1 就可以了。

连接建立之后,我的终端看起来是这个样子的: 产生连接之后的终端

仿佛一切都没有发生,但其实后台已经建立起了从本地3307到远程3306的SSH隧道了。

# 使用 mysql 服务

如果你习惯使用 mysql 的命令行进行管理。可以使用以下语句进行“远程管理”。

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

也就是连接本地的 3307 端口而已~

而我习惯使用 phpmyadmin,只需要打开 phpmyadmin 的 config.inc.php,并为其添加以下配置:

$i++;
$cfg['Servers'][$i]['verbose'] = 'remote server';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3307';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;

phpmyadmin 的配置可能因版本不同,这段配置也可能因需求的不同而产生差异,具体可以查看官方文档