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


12

几个月以来,我一直在通过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”。一位朋友建议说这可能只是错误的错误处理,但鉴于localhost与MySQL中的127.0.0.1之间的显着差异,这似乎很奇怪。

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

用户'root'@'%'的访问被拒绝(使用密码:是)

奇怪的是,实际上是创建了用户,我认为这只是授予的问题。同样,从终端我以root身份登录时可以执行任何操作。

谁能帮助我们弄清为什么隧道连接和(可能)授权命令会收到拒绝访问错误?

作为参考,MySQ是版本5.6.16,其中大多数是默认设置,可通过Homebrew在MAC OS X Server计算机上安装。

更新资料

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

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,因此它可以做所有事情,但可以授予。仍然很想知道为什么SSH隧道被拒绝。


因此,在您创建“%”帐户之前,您已经创建了“ 127.0.0.1”和“ localhost”,而这两个都不起作用,对吗?
Sverre 2014年

本地主机仅在您实际上位于正确的主机上时才起作用,因此从理论上讲,只有127.0.0.1(等效于本地主机的网络)可以在ssh隧道上工作。至少在类似OS的Unix中。
Sverre 2014年

Answers:


18

在MySQL中,该localhost关键字保留给使用MySQL套接字的连接,您应该使用ip-address 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进行特殊处理,与其他基于网络的程序相比,它可能与您期望的不同。对于与本地主机的连接,MySQL程序尝试使用Unix套接字文件连接到本地服务器。即使给定了- -port-P选项来指定端口号,也会发生这种情况。为确保客户端与本地服务器建立TCP / IP连接,请使用--host-h将主机名值指定为127.0.0.1,或者使用本地服务器的IP地址或名称。您还可以通过使用该--protocol=TCP选项来显式指定连接协议,即使是本地主机也是如此。例如:

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

--protocol即使其他选项通常默认为某些其他协议,该选项也可以使您建立特定类型的连接。


2
啊! 这就解释了为什么我希望看到127.0.0.1时在错误消息中看到localhost。不管怎样,root用户已被授予@ 127.0.0.1的所有特权,但是通过SSH隧道连接时,我仍然收到拒绝访问错误。我运行的确切陈述是:grant all on *.* to 'root'@'127.0.0.1' with grant option;
亚当(Adam)

我遇到了这个问题,很明显这确实是主机与套接字的问题。当我ssh -h 127.0.0.1 -u root -p在服务器上远程键入时,连接也会被拒绝。
FuzzyTew

-h 127.0.0.1通过重新启动mysql 解决了服务器上的连接失败问题,但是ssh套接字仍然无法正常工作
-FuzzyTew

开始了。1.服务器必须授予@ 127.0.0.1。直到我重新启动服务器,这才对我有用。2.本地连接必须是127.0.0.1 而不是 localhost,以便使用隧道而不是本地套接字。
FuzzyTew

1

我过去在ssh tunels中看到过,将全部授予“本地主机”和授予全部“ 127.0.0.1”之间是有区别的,因此请尝试授予“ 127.0.0.1”,或者除了“本地主机”授予之外,还授予其他权限。


或相反,在你的情况下,它看起来像
斯维尔

谢谢,我已经更新了问题,以包括授予根目录的主机列表。我确实感到奇怪,尽管在Sequel Pro中将MySQL服务器输入为“ 127.0.0.1”,但MySQL错误将其报告为“ localhost”。我不认为这是问题所在。
亚当

您在所有不同的用户上都有密码吗?另外,当您通过隧道连接到mysql时,实际使用的语法是什么?
Sverre 2014年

在您的mysql设置中,对Root用户有什么限制?
斯维尔(Sverre)2014年

只需重新运行这些grant语句,identified by ..以确保所有root密码都相同,但没有任何乐趣。
亚当

0

您不用自己制作续集来创建隧道,而是自己创建隧道?

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

然后用Sequel连接到127.0.0.1:3306是否可以连接?终端(或ssh客户端日志)上是否显示任何内容?

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.