通过 SSH 隧道连接时出现 MySQL 访问被拒绝错误

通过 SSH 隧道连接时出现 MySQL 访问被拒绝错误

几个月来,我一直通过 SSH 隧道连接到本地测试服务器上运行的 MySQL 实例,没有任何问题。然而,突然之间,在我想不到任何改变的情况下,服务器开始拒绝来自 Sequel Pro 的登录尝试,并出现错误:

无法连接到主机 127.0.0.1,因为访问被拒绝。

仔细检查您的用户名和密码,并确保从您当前的位置访问是被允许的。

MySQL 说:拒绝用户“root”@“localhost”访问(使用密码:是)

当通过 SSH 直接连接到服务器时,我能够从终端登录,但不能通过 SSH 隧道登录。这个问题并不只存在于 Sequel Pro 或我自己身上,当通过 MySQL Workbench 连接时,我和办公室里的其他人一样遇到了同样的错误。我重置了密码,只是mysqladmin为了保持理智,这绝对不是问题所在。

当我开始进一步研究时,我注意到错误报告服务器为“localhost”,而不是我在 Sequel Pro 中输入的“127.0.0.1”。一位朋友建议这可能只是错误处理不当,但考虑到 MySQL 中 localhost 和 127.0.0.1 之间的显著差异,这似乎很奇怪。

为了解决隧道问题,我授予 root@% 访问权限,以便我可以直接连接。这在大多数情况下都有效,我可以查看表数据、创建新数据库等。唯一的问题是当我创建用户时出现错误:

拒绝用户‘root’@‘%’访问(使用密码:是)

奇怪的是,用户确实被创建了,我认为这只是授权的问题。不过,再次强调,当我以 root 身份登录时,我可以从终端执行任何操作。

有人能帮忙解释一下为什么隧道连接和(可能的)授予命令会收到访问被拒绝错误吗?

作为参考,MySQ 是 5.6.16 版本,主要采用默认设置,通过 Homebrew 安装在 MAC OS X Server 机器上。

更新

以下是当前授予 root 访问权限的主机列表:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

据我了解,第一行(“%”)真的应该使其他行变得多余吗?

更新 2

修复了授权问题;root@% 用户尚未被授予with grant option末尾带有 extra 的所有权限,因此它可以执行除授权之外的所有操作。不过,我还是想知道为什么 SSH 隧道被拒绝。

答案1

在 MySQL 中,localhost关键字保留用于使用 MySQL 套接字的连接,并且您应该使用 ip 地址127.0.0.1来与 127.0.0.1 上的 MySQL 网络端口建立 TCP 连接。这意味着服务器必须向特定用户授予权限127.0.0.1客户端必须使用-h 127.0.0.1通过隧道而不是连接到本地套接字。

为了允许您使用 SSH 端口转发进行访问,您需要类似以下内容:

GRANT SELECT ON *.* TO user@`127.0.0.1`

然后运行

FLUSH PRIVILEGES;

并且可能

FLUSH QUERY CACHE;

如果仍然不起作用,请重新启动服务器进程。

在反向 DNS 查找翻译后的错误消息 127.0.0.1 使localhost调试变得困难。

作为手动的描述它:

在 Unix 上,MySQL 程序对主机名 localhost 进行特殊处理,与其他基于网络的程序相比,其处理方式可能与您预期的不同。对于与 localhost 的连接,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器。即使给出了 --port-P选项来指定端口号,也会发生这种情况。要确保客户端与本地服务器建立 TCP/IP 连接,请使用--host-h指定主机名值127.0.0.1,或者本地服务器的 IP 地址或名称。您还可以使用 选项明确指定连接协议,即使对于 localhost 也是如此--protocol=TCP。例如:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

--protocol即使其他选项通常默认为其他协议,此选项也使您能够建立特定类型的连接。

答案2

我以前使用 ssh 隧道时发现,将所有权限授予“localhost”和将所有权限授予“127.0.0.1”之间存在差异,因此请尝试授予“127.0.0.1”,而不是授予“localhost”权限,或者在授予“localhost”权限的同时授予“127.0.0.1”。

答案3

不使用 Sequel 来创建隧道,而是自己创建隧道?

ssh -Cc blowfish -Nf -vv -L3306:localhost:3306 sshuser@domain

然后使用 Sequel 连接到 127.0.0.1:3306 可以连接吗? 您的终端(或 ssh 客户端日志)上是否有任何内容出现?

相关内容