尝试将MySQL Workbench与基于SSH的TCP / IP一起使用-连接失败


41

我无法从PC在MySQL Workbench中使用SSH连接使用TCP / IP进行连接。这是怎么回事?

我在Ubuntu服务器mysql.myhost.com上创建了MySQL 5.1数据库。我可以在本地访问它。MySQL Workbench(PC)提供通过ssh通过TCP进行连接。它运行在远程服务器的端口3306上,命令行mysql可以正常工作。

我使用了以下会话详细信息:

  • 连接方法:SSH上的TCP / IP。
  • SSH主机名:mysql.myhost.com:3306
  • SSH用户名:我的Linux登录名
  • SSH公用密钥文件:我的本地公用密钥文件
  • MySQL主机名称:127.0.0.1 MySQL
  • 服务器端口:3306
  • 用户名:root

尝试连接时收到错误消息:“使用用户root通过mysql.myhost.com上的SSH隧道无法通过127.0.0.1:3306连接到MySQL”

“无法连接到'127.0.0.1'(10061)上的MySQL服务器”

作为另一项测试-我使用Putty使用端口3306设置了SSH隧道,并且可以使用MySQL Workbench通过该隧道连接OK,如上所述,该隧道将到本地3306的连接转发到远程服务器。但是我无法在Workbench中使用“基于SSH的TCP / IP”。

第二个问题:当Workbench询问“ SSH公用密钥文件的路径”时,它真的不需要我的专用密钥文件吗?


4
真是的 bugs.mysql.com/bug.php?id=61368显示这是OpenSSH格式所需的PRIVATE密钥文件。我对此感到疑惑,但不确定。
Dizzley 2011年

Answers:


29

当我自己遇到此错误时,我偶然发现了这个问题。我终于可以弄清楚配​​置了。

  1. 我没有触摸/etc/mysql/my.cnf中的任何东西,该文件已经具有bind_address = 127.0.0.1。因此,只有localhost可以连接。
  2. 我使用OpenSSH服务器。因此,在其配置文件/ etc / ssh / sshd_config中,我将负责TCP转发的参数从no更改为yes,因此AllowTcpForwarding yes
  3. 最后,我在MySQL WorkBench中输入了以下内容。

    • SSH主机名:192.168.0.8 : 22(我的SSH服务器侦听端口22)
    • SSH用户名:sshuser
    • SSH密钥文件:* C:\ Users \ windowsuser \ .ssh \ id_rsa *(即使是公开密钥,也应该是私钥)
    • MySQL主机名:127.0.0.1(不应更改,因为默认情况下,MySQL服务器仅绑定到我未更改的本地主机)
    • MySQL服务器端口:3306(也是默认值)
    • 用户名:root

您剩下的唯一事情就是正确配置SSH服务器以使用密钥而不是密码。希望这会帮助某人。


我需要在服务器端做的一件事是确保/ etc / ssh / sshd_config包含以下行:AuthorizedKeysFile /home/root/.ssh/authorized_keys并确保authorized_keys具有我的PUBLIC键作为条目。
RyanNerd

请说明第2步哪个设置AllowTcpForwarding yes是否应用于远程服务器,即具有我们要连接的MySQL实例的主机;或装有MySQL Workbench的本地计算机
Nam G VU

@NamGVU步骤2适用于安装MySQL的远程服务器。特别是到通过SSH提供到MySQL隧道的OpenSSH服务器。
Eye

我尝试过,但仍然无法通过隧道进行。MySQL Workbench告诉我要在日志文件中阅读更多错误详细信息。你知道在哪里读书吗?
Nam G VU

1
我今天可以正常使用-配置AllowTcpForwarding条目后需要重新启动
Nam G VU

8

我认为TCP / IP over SSH方法通过在MySQL连接基础上建立“正常” SSH连接而起作用(-L与使用OpenSSH命令行客户端进行隧道传输的方式相同)。

因此,您需要在建立隧道的服务器上指定到SSH服务器的连接。在这里,您似乎正在使用mysql.myhost.com:3306,这意味着您正在端口3306上运行此SSH服务器(而非MySQL)。

可以在127.0.0.1:3306上将MySQL服务器绑定到外部IP地址mysql.myhost.com上的SSH服务器,并在端口3306 上绑定SSH服务器,但这是不太可能的。我猜您的SSH服务器正在侦听端口22(默认)。

您可能应该使用mysql.myhost.com:22。(检查您是否也可以通过普通的SSH客户端(例如Putty)连接到它。)


8

您可能需要检查mysql.user表中的用户。

运行此查询:

SELECT user,host FROM mysql.user;

您应该会看到以下内容:

mysql> SELECT user,host,password FROM mysql.user;
+------------------+-------------+-------------------------------------------+
| user             | host        | password                                  |
+------------------+-------------+-------------------------------------------+
| root             | localhost   | *7A670E02260CDEEFF062DD08F3A6F6DA079998CB |
| ping             | %           | *124E1DB56CC8D6E2FEE8315BB2544BF04B980DB6 |
| admin            | 10.67.135.% | 1a6858054a41fede                          |
| icorbin          | 10.67.135.% | 366ed93a7396650e                          |
+------------------+-------------+-------------------------------------------+
4 rows in set (0.00 sec)

请注意

  • root @ localhost只能从localhost登录。
  • ping @'%'可以通过TCP / IP登录
  • admin@10.67.135.%只能通过TCP / IP从该netblock登录
  • icorbin@10.67.135.%只能通过TCP / IP从该网络块登录

如果您希望root用户通过TCP / IP连接,则必须为root用户指定IP地址或netblock。

像这样:

GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'whateverpassword';

或者,如果root密码与root @ localhost相同,则

GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY PASSWORD '*7A670E02260CDEEFF062DD08F3A6F6DA079998CB ';

CAVEAT:通常不建议使用root @'%'。也许尝试root@'10.%'或任何其他netblock作为root。

试试看 !!!


3
不应...@localhost通过SSH隧道工作,因为就MySQL服务器而言,连接来自隧道的末端?
布鲁诺

@Bruno:一种确定的方法是成功连接,然后运行SELECT USER(),CURRENT_USER();。并查看其输出。函数USER()回显您尝试进行身份验证的内容,而CURRENT_USER()回显MySQL允许您进行身份验证的内容。如果CURRENT_USER()回显root @ localhost,则您的问题的答案为是。
RolandoMySQLDBA 2011年



2

我的问题是由于我尝试使用ed25519SSH密钥。我在SSH服务器上注意到此错误auth.log

sshd[25251]: Connection closed by 192.168.x.x [preauth]

一旦我改用RSA密钥,一切都会按预期进行。


1

您正在尝试通过ssh但使用mysql端口连接到服务器。所需的端口是ssh服务器正在侦听的端口,通常为22,然后为localhost和3306作为mysql主机名和端口。


1

我遇到了同样的问题。我检查并尝试将AllowTcpForwarding设置为Yes,但在我的sshd_config中丢失了它,因此没有帮助。确保SSH hostname是不是与MySQL主机(使用localhost)相同。

在工作台中,选择+添加新连接并设置以下内容:

  • 连接方式:通过SSH的标准TCP / IP
  • SSH主机名:192.168.0.50 :22 (放置远程SSH服务器IP和端口(可选))
  • SSH用户名:sshuser
  • 您可以设置密码或在提示时添加
  • MYSQL主机名:localhost或127.0.0.1
  • MYSQL服务器端口:3306
  • 您可以设置密码或在提示时添加

测试连接。它应该会成功,然后单击OK。Viola!


1

有时PuTTY创建的密钥将无法使用。在Linux机器上使用ssh-keygen创建密钥对。将新id_rsa的内容复制到Windows上的文本文件。确保在Linux机器上将id_rsa.pub的内容添加到authorized_keys。Workbench中的所有其他默认值都很好,包括MySQL主机名的127.0.0.1。当然,它必须是基于SSH的标准TCP / IP。


1

我想出了同样的错误。问题是“有点”超时。我甚至将值提高到120秒也无济于事。

就我而言,我可以使用nslookup myserver.com并使用IP地址代替主机名来解决它。我的假设是尝试从IPv4连接到IPv6时出现问题。


0

在连接运行MySQL版本5.5.29和MySQL Workbench 5.2.40的服务器的Ubuntu计算机上也遇到了同样的问题。SSH服务器需要使用ssh-key。

我无法使用root用户连接到MySQL服务器,相反,我不得不创建一个单独的非root用户进行登录。之后,我就可以正常连接了。

希望这可以帮助。


0

好的,我知道这是一个老问题,但是我花了几个小时才拔掉头发。我检查了Bruno和Eye提到的所有内容,一切似乎都很好。然后我意识到这确实是私钥/公钥的事情。因此,我启动了Pageant并添加了我的私有密钥,以便它创建了一个公共密钥,MySQL Workbench可以读取该公共密钥,并且可以连接!(当MySQL Workbench实际开始工作时,这实际上是一种滑稽动作,但是以一种愉快的方式。)

TLDR:使用Pageant从您的私钥生成公钥。


私钥绝对不能用作公钥,这就是它们为什么是私钥的原因。
James Anderson

@JamesAnderson不是那个错误是关于什么的吗?文字要求私有,至少应根据错误链接将其读为公开。或不?
Thufir

-1

只有我发现的东西...通常我会在没有外壳的SSH服务器上创建用户(例如/ sbin / nologin),以防止他们能够登录到服务器并在其中创建文件等(对于生产系统,我们在防火墙上进行)。

之后,在常规Linux环境中,您仍然可以在此之后转发端口,例如:

ssh -Nf -L 3306:%mysql_ip%:%mysql_port% %ssh_host%

然后从本地工作站将其连接为:

mysql -h localhost:3306 -u %mysql_user% -p

但是工作台给出了一个错误,提示它无法连接到MySQL ...如果您要将该用户的shell更改为/ bin / bash,则此后一切正常。

不知道为什么Workbench在远程SSH服务器上需要本地shell。


-1

只需创建一个新的RSA密钥,其格式应与mysql workbench正确。

例如:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.