繁体   English   中英

通过SSH隧道的MySQL连接

[英]MySQL connection over SSH tunnel

我在两台服务器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)

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

这里有三个问题。

1 - 暂时忘掉SSH隧道

您无法将MySQL绑定到多个特定IP。 第一个bind-address子句被第二个覆盖(因此被忽略)。 您的服务器只侦听99.99.99.99

您可以使用-h localhost而不是-h 127.0.0.1连接的原因是,在第一种形式中,您实际上并不通过TCP / IP连接,而是通过本地套接字连接。

my.cnf查找socket子句。

删除一个冗余的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'在下面...OR host LIKE 'localhost' ,因为这可能与故障排除相关]

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

(在LIKE子句之后,将'user'替换为必要时的实际用户名)

MySQL访问控制检查用户名/密码( user )和连接( host )的来源以识别用户。 您可能没有创建用户'user'@'localhost'

注意:此时我的位置无法访问mysql.com,我无法链接到相关的手册页。

我刚遇到这个问题。

在我的例子中,MySQL服务器配置了bind-address: 192.168.4.4 我最初设置了一个SSH隧道,通常提到-L 3306:localhost:3306 user@server string,从我的计算机连接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 这将告诉远程隧道端使用MySQL实际侦听的IP连接到MySQL。

逐步SSH隧道

- - 服务器端 - -

在目标机器(可以由IP或托管的域添加)有配置文件/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服务器将只响应来自localhost的请求

- - 客户端 - -

你有一个帐户(最后是一个ssh-key)来使用cygwin,putty或linux_shell进行记录

ssh user_name@host_name

创建SSH TUNNEL

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

这意味着嘿ssh从我键入的机器上的端口1000创建一个永久连接(客户端)到远程host_name:3306 .... 127.0.0.1这里意味着远程(host_name),不应该用localhost字替换,因为这将unix(命名)socket上的连接不是通过IP ...你会得到'ERROR 2002(HY000):无法通过套接字连接到本地MySQL服务器'/var/run/mysql.sock'(2)'当尝试co连接mysql

-f =进入后台-N =没有执行

两种-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客户端被连接到远程mysql服务器......这里127.0.0.1是客户端机器

同样适用于工作台,heidiSQL


如何杀死ssh隧道

ps fax | grep ssh
kill process_id

我确实在Windows上遇到了同样的问题( "Lost connection..." )(通过Putty使用ssh隧道)。 我在这里遇到了两个问题:

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

就我而言,SSH守护程序中的配置阻止了隧道。 应启用AllowTcpForwarding。

AllowTcpForwarding yes

一个简单的步骤对我有用......我会分享这个,所以也许你们中的一些人可以免于头疼。

我的设定

在我的特定情况下,我有一个在Ubuntu上运行的Percona服务器,通过SSH连接到MySQL Workbench(在Windows VM中); 服务器运行良好几天,然后在处理查询时吐出错误10060。

什么为我工作

我在Acquia.com的论坛中发现,在某些情况下,Workbench不接受'127.0.0.1'作为主机,因此您必须将其更改为'localhost'。 我做到了,它工作了(奇怪的是,Workbench再次询问了密码,即使它们已经存储,但仍然工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM