MySQL连接通过SSH隧道(MySQL connection over SSH tunnel)

2019-06-25 13:20发布

我已经设置了两台服务器AB之间的SSH隧道。 B有MySQL服务器,而这个工作:

mysql -h localhost -P 3306 -u user -p

虽然这并不:

mysql -h 127.0.0.1 -P 3306 -u user -p

虽然my.cnf中有几行:

bind-address        = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address        = 99.99.99.99

现在关于隧道。 它连接了以下内容: (A) localhost(9989) -> (B) localhost(3306)但是,当(A上,与转发端口)我做

mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p

我得到ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

当我做

mysql -v -h localhost -P 9989 -u user userdb -p

我得到ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)

可能是什么原因? 我究竟做错了什么?

Answer 1:

这里有三个问题。

1 - 忘掉SSH隧道现在

你不能绑定的MySQL超过一个特定的IP。 第一bind-address子句是由第二个覆盖(因此,忽略)。 您的服务器只听99.99.99.99

为什么你可以用来连接的原因-h localhost ,但不能与-h 127.0.0.1是,在第一种形式,你实际上并没有通过TCP / IP连接,而是通过当地的插座。

看在你my.cnfsocket条款。

除去一个冗余bind-address子句。 您可能需要使用bind-address=0.0.0.0 ,指示MySQL守护进程监听所有网络接口。

2 - 让我们设置你的SSH隧道

你错误的原因ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0不是很明显我。 我怀疑 SSH隧道实际上是建立了只有在接收到的连接请求(在你的情况,当你运行mysql客户端)。 因为您的服务器不听127.0.0.1(见前段),该SSH隧道无法建立,连接失败,和你的客户将其解释为网络故障。

3 -为什么mysql -v -h localhost -P 9989 -u user userdb -p失败

请张贴的输出

[编辑:刚刚添加...OR host LIKE 'localhost'下面,因为这可能是相关的故障排除]

mysql > SELECT user, host FROM mysql.user WHERE user LIKE 'user' OR host LIKE 'localhost';

(替换'user' ,后LIKE子句,实际用户名如果必要的话)

MySQL的访问控制检查二者的用户名/密码( user )与连接(的原点host )来识别用户。 你可能没有创建一个用户'user'@'localhost'

注:mysql.com是从我在这个时候位置不可达,我不能链接到相关的手册页。



Answer 2:

我只是遇到了这个非常问题。

在我的情况下,MySQL服务器配置了bind-address: 192.168.4.4 。 我原本设置一个SSH隧道与常提到-L 3306:localhost:3306 user@server字符串,并从我的电脑连接mysql -h 127.0.0.1

这不起作用,因为MySQL不再侦听0.0.0.0或甚至"localhost" (又名127.0.0.1),只有192.168.4.4

正确的通道字符串应该是-L 3306:192.168.4.4:3306 user@server 。 这将告诉端tunnel使用IP MySQL的实际监听连接到MySQL。



Answer 3:

STEP-BY-STEP SSH隧道

- - 服务器端 - -

在目标机器(可通过IP来addresed或域托管)有配置文件/etc/mysql/my.cnf具有线

bind-address    = 127.0.0.1

与控制台确认

netstat -tapn |  grep mysql
// tcp    0    0 127.0.0.1:3306     0.0.0.0:*    LISTEN      18469/mysqld

这意味着MySQL服务器将从本地主机只响应请求

- - 客户端 - -

你有一个帐户(eventualy一个SSH密钥)使用的cygwin,腻子或linux_shell登录

ssh user_name@host_name

建立SSH隧道

ssh -f -N -L 1000:127.0.0.1:3306    user_name@host_name

这意味着哎SSH创建端口1000的I型(客户端)的机器远程HOST_NAME上的永久连接:3306 .... 127.0.0.1意味着这里的远程(HOST_NAME),不应与本地主机词,因为这将被取代就UNIX(命名)插座没有IP连接...你将得到:/var/run/mysql.sock 'ERROR 2002(HY000)无法通过socket连接到本地MySQL服务器''(2)'当试图共同连接mysql

-f =走在后台-N =没有excution

既-f -N样nohoop的 - 你可以关闭控制台和隧道坚持

- - 服务器端 - -

netstat -tapn |  grep ssh
// tcp  0  0  server_ip:22   clint_ip:port  ESTABLISHED 24915/sshd: user_name

这意味着有通过SHH协议的永久连接

- - 客户端 - -

mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass

现在你(客户端)的MySQL客户端conected到远程MySQL服务器...这里127.0.0.1是客户机

同样的工作台,heidiSQL


怎么杀SSH隧道

ps fax | grep ssh
kill process_id


Answer 4:

我也有同样的proble( "Lost connection..."在Windows上)(同时通过腻子使用ssh隧道)。 我有2个问题在这里:

  1. 错误的端口使用,要仔细检查您是否正确设置它
  2. 我忘了让在Putty: Connection > SSH > Tunnels > Local ports accept connections from other hosts


Answer 5:

在我的情况下,在SSH服务的配置挡住隧道。 AllowTcpForwarding值为应该启用。

AllowTcpForwarding yes


Answer 6:

工作对我来说一个简单的一步......我会分享这个,所以也许有些人也不能幸免头痛。

我的设置

在我的具体情况,我在Ubuntu上运行的Percona服务器,连接到MySQL工作台(在Windows VM)通过SSH; 服务器在处理查询随地吐痰错误10060前几天运行良好。

什么工作对我来说

我从Acquia.com,在某些情况下,工作台不会接受“127.0.0.1”作为主机的论坛发现,所以你必须将其更改为“localhost”的。 我做了,而且它的工作(奇怪的是,工作台要求的密码再次,即使他们已存储,但仍然工作)。



文章来源: MySQL connection over SSH tunnel