通过 SSH 连接 MySQL 8.0.20

通过 SSH 连接 MySQL 8.0.20

Windows 10 上的 DBeaver 7.1.0 尝试使用 SSH 连接到 Ubuntu 20.04 上的 MySQL 8.0.20。我还尝试了其他 Windows MySQL GUI 客户端,结果相同,这让我相信问题出在 MySQL 配置上(或者可能是我的本地 Java 安装?)。

错误信息是:

Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
  Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

MySQL 版本信息:

# mysql --version
mysql  Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

# mysqld --version
/usr/sbin/mysqld  Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

从 Windows 命令行,我可以 ssh 到我的服务器并毫无问题地连接到我的数据库:

FROM WINDOWS COMMAND LINE:
ssh [email protected]

FOLLOWED BY THE FOLLOWING ON THE SERVER:
$ mysql -u admin -p

这是全新安装的 MySQL,没有任何配置更改。我所做的唯一一件事就是创建一个虚拟数据库(“main”)和一个新的数据库用户(“admin”)并授予该用户访问数据库的权限。

CREATE DATABASE main;
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'XXX_PASSWORD_REDACTED_XXX';  
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';  
FLUSH PRIVILEGES;

SELECT user,plugin,host FROM mysql.user WHERE user='admin';
+-------+-----------------------+-----------+
| user  | plugin                | host      |
+-------+-----------------------+-----------+
| admin | caching_sha2_password | localhost |
+-------+-----------------------+-----------+
1 row in set (0.00 sec)

在 DBeaver 中,单击“测试隧道配置“结果成功,因此 SSH 隧道没有问题。但是单击“测试连接“会导致错误。请参阅下面的错误以及我的配置的屏幕截图。请注意,我尝试使用“MySQL 8+ 驱动程序“ 以及 “MySQL 驱动程序“。我也尝试过同时使用学士沙特基础工业公司结果相同。我还尝试使用127.0.0.1代替本地主机,结果相同。我还尝试将用户的插件从缓存_sha2_密码mysql_native_password,结果相同。

MySQL bind-address 是默认值:

# grep -Irs bind /etc/mysql
mysql.conf.d/mysqld.cnf:bind-address            = 127.0.0.1

IPTables如下:

# iptables -L -v -n
Chain INPUT (policy DROP 328 packets, 18119 bytes)
 pkts bytes target     prot opt in     out     source               destination
11517   76M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
  141 32322 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
   10   492 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
   10   576 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 6069 packets, 647K bytes)
 pkts bytes target     prot opt in     out     source               destination

将不胜感激有关如何进一步调试的任何想法!

截图如下:

DBeaver MySQL 8+ 驱动程序 DBeaver SSH DBeaver 错误消息

答案1

呃……算了……我搞明白了。我忘了允许环回连接。通过运行以下命令修复:sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT

答案2

我遇到了同样的错误,但事实证明远程 MySQL 服务器没有监听 127.0.0.1:3306,而是监听另一个网络适配器上的内部 IP 地址。

您可能需要检查输出以ss -tnlp检查哪个 IP 拥有服务器。

如果发现 MySQL 正在监听内部 IP 而不是环回 IP,并且 SSH 服务器允许 TCP 转发,您仍然可以使用 SSH 转发从 DBeaver 连接,方法是打开 SSH 选项卡下的“高级设置”,并将“本地主机:”设置为 127.0.0.1,“本地端口:”设置为 3306,“远程主机:”设置为数据库服务器的内部 IP,将“远程端口:”设置为服务器上 MySQL 的监听端口(通常为 3306)。

相关内容