Mysql不改默认侦听回环地址而ssh通道连接的办法

Mysql不改默认侦听回环地址而ssh通道连接的办法

文:铁乐与猫

比较新版的mysql默认侦听的网卡地址是本地回环地址:127.0.0.1;
比如你在/etc/mysql/my.cnf配置文件中往往可以找到如下配置:
bind-address = 127.0.0.1

mysql默认配置侦听环回地址

同时使用netstat命令查看mysql侦听的端口也可以发现,只侦听本地回环地址过来的请求:

netstat -antlp | grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -

所以这也是为什么你明明设置了一个允许远程登录mysql数据库权限的用户但却仍被报10038错误的缘故。

因为它就根本没有去侦听外网ip或内网网卡的ip。

解决的办法当然是可以修改my.cnf的配置,将bind-address = 127.0.0.1 修改成侦听0.0.0.0或更具体的网卡IP。
但这都不够安全!
两全其美的办法其实是通过ssh通道去连接mysql。
原理就是类似你先ssh远程连接上mysql服务器,然后再连接服务器的本地127.0.0.1网卡的迂回方式达到效果。

一、以navicat图形界面客户端为例,新建连接的时候如下配置:


注意,常规选项下的主机名或ip地址一定是要填127.0.0.1,而不是平常填的远程ip地址,
在上面的示例中,平常填的应该是192.168.50.18,但使用ssh通道后就要填成127.0.0.1才对。
不然连接的时候会报错:Lost connection to MySQL server at 'reading initial communication packet'
这就是因为mysql服务器并没有侦听本地网卡ip引起。
而下面输入的 端口/用户名/密码 三项和数据库有关的就照常填写有权限连接的用户信息。

既然是使用ssh通道,那显然主机名或ip地址这里填的就要是ssh侦听的远程ip地址了,端口也要是ssh侦听的端口。
同样,用户名和密码是系统能连接到ssh的用户信息。又或者更安全的使用密钥连接也是可以的。

以上设置好后,点击连接测试,弹出连接成功的窗口表示设置无误。

ssh通道作为跳板机连接内网数据库服务器

除了作为加密连接到数据库服务器的127.0.0.1以外,还可以实现ssh通道到跳板机A,再连接到跳板机A才能访问到的内网mysql服务器B的效果。
做法就是常规那填的不再是上面的127.0.0.1地址,而是mysql服务器B的内网地址,例如192.168.251.19之类。

二、以命令行ssh连接mysql(不同服务器)为例:

首先是ssh的语法。

-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定配置选项;
-p:指定远程服务器上的端口;
-q:静默模式;

端口转发使用这样的命令语法:

ssh -f [username@remote host] -L [local port]:[full name of remote host]:[remote port] [some command]

你不仅可以转发多个端口而且可以在“~/.ssh/config”文件中用“LocalForward”设置经常使用的一些转发端口。

例,想在A服务器上连接B服务器的数据库:
ssh -fN -L(要绑定到的服务器A本地端口):(服务器B的Host):(服务器B上要访问的服务端口号) -p(服务器B的ssh端口,默认为22) (服务器B的ssh系统用户)@(服务器B的Host)
注:如果不用密码的还可以-i直接指定使用的密钥文件

比如,A服务器ip地址为:192.168.50.29,B服务器ip地址为:192.168.50.18;
在A服务器的终端上敲命令,绑定B服务器上的3306端口到A的3307端口:

ssh -fN -L3307:127.0.0.1:3306 -p22 o2o2@192.168.50.18
Password:
提示输入密码,输的就是ssh系统用户的密码。
netstat -antlp 可以查看到已成功映射B服务器的3306端口到服务器A的3307端口上:

可以看到ssh的进程中,有侦听本地的127.0.0.1:3307。

这时候使用mysql去连接3307端口就是连接到B服务器的mysql数据库:
[root@yunwei_OpenVPN ~]# mysql -h 127.0.0.1 -P 3307 -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 69
Server version: 5.7.21 Homebrew

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

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

MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| task |
+--------------------+
5 rows in set (0.00 sec)

MySQL [(none)]>


另一种命令运行方法,将ssh连接放在前面:

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

这里的o2o2@192.168.50.18 是登陆mysql服务器的SSH用户名和IP地址;
-L 3307:192.168.50.18:3306 这个参数的意思是说在本机开放3307端口到192.168.50.18:3306端口的映射,也就是说隧道的入口为3307出口为mysql服务器的3306

ssh加密通道除了用在mysql连接外还可以用在别的服务上,或者做跳板再ssh另一台服务器也是有可能的。

2018-2-8 周四
End

posted @ 2018-02-26 13:42  铁乐猫  阅读(1347)  评论(0编辑  收藏  举报