28

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

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

4

6 回答 6

31

这里有三个问题。

1 - 暂时忘记 SSH 隧道

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

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

在你的my.cnfforsocket子句中查找。

删除一个多余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,我无法链接到相关的手册页。

于 2012-06-16T08:55:32.143 回答
11

我刚刚遇到了这个问题。

在我的情况下,MySQL 服务器配置为bind-address: 192.168.4.4. 我最初使用常用-L 3306:localhost:3306 user@server字符串设置 SSH 隧道,并从我的计算机连接到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。

于 2013-09-25T18:13:14.680 回答
10

循序渐进的 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服务器将只响应来自本地主机的请求

- - 客户端 - -

你有一个使用 cygwin、putty 或 linux_shell 登录的帐户(最终是一个 ssh 密钥)

ssh user_name@host_name

创建 SSH 隧道

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(命名)套接字上建立连接,而不是通过 IP ...你会得到'ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysql.sock' (2)'尝试共同连接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
于 2016-11-15T20:34:56.043 回答
6

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

AllowTcpForwarding yes
于 2018-06-08T14:58:32.523 回答
1

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

  1. 使用了错误的端口,请仔细检查您是否设置正确
  2. 我忘了启用Putty: Connection > SSH > Tunnels > Local ports accept connections from other hosts
于 2016-11-28T11:05:23.583 回答
0

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

我的设置

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

什么对我有用

我在 Acquia.com 的一个论坛中发现,在某些情况下,Workbench 不会接受“127.0.0.1”作为主机,因此您必须将其更改为“localhost”。我做到了,并且成功了(奇怪的是,工作台再次要求输入密码,即使密码已经存储,但仍然有效)。

于 2015-08-19T13:50:53.487 回答