MySQL如何进行IP地址的反向解析?

3
我们重新启动了一台运行mysql的机器,现在出现了一些奇怪的问题。来自其他机器的大多数进程都能够正常连接,如果我们通过显式地连接回环地址来本地连接也是可以的。
以下内容可正常工作:
mysql -hlocalhost -utest_user -psecret_password

当我们运行以下命令时:

mysql -h192.168.1.10 -utest_user -psecret_password

在本地机器上,我们会得到以下错误:

ERROR 1045 (28000): Access denied for user `test_user`@`SERVER_123`

我们有以下用户:
test_user@localhost
test_user@%

我们已经通过添加以下用户解决了此问题:
test_user@SERVER_123

其中SERVER_123是机器的未经过资格认证的名称。

我们不知道为什么必须添加该附加用户,也不想保留它,但我们也不知道为什么添加它会解决问题。

为什么通过IP从本地机器连接(即mysql -ha.b.c.d -utest_user -ppsswd)无法匹配test_user@%用户,但可以匹配test_user@machine_name,其中machine_name是机器的未经过资格认证的名称?

这是用户表:

anonymous    %
anonymous    SERVER_123
anonymous    localhost
test_user_2  %
test_user_3  %
root         ::1
root         127.0.0.1
root         SERVER_123
root         localhost

注意:找到了问题所在。某种方式重启机器必须改变192.168.1.10的解析方式,使其解析为SERVER_123。这样就导致来自192.168.1.10的登录与test_user@SERVER_123匹配。


2
通常情况下,错误信息对于确诊问题非常关键。请务必包含它。 - eggyal
1
检查您是否有一个匿名用户(用户名为空)以服务器为主机(或者说,检查所有匿名用户)。这将优先于没有主机的非匿名用户。 - Solarflare
@eggyal - 已添加错误消息。 - bpeikes
4个回答

5
我会看一下MySQL文档中这个部分的排序规则:https://dev.mysql.com/doc/refman/5.7/en/connection-access.html 客户端主机名和用户名可能与用户表中的多行匹配。
可能是您的用户被识别为具有不同密码的另一个用户。您的用户表中还有哪些条目?
根据新信息更新:您的登录被识别为“'@'%'”用户。该用户要么具有不同的凭据,要么缺少必要的权限。

它不应该匹配其他任何内容。我仍然不确定为什么user@%没有匹配,而user@local_machine_name却匹配了。 - bpeikes
@bpeikes,你能分享一下用户表的条目吗? - dantheman2865

3
你可以在这里阅读MySQL文档here, 该文档讨论了DNS查找优化以及实现过程。从文档中指出的一个要点是:

MySQL服务器在内存中维护一个主机缓存,其中包含有关客户端的信息:IP地址、主机名和错误信息。服务器将此缓存用于非本地TCP连接。它不会将缓存用于使用环回接口地址(127.0.0.1或::1)建立的TCP连接,也不会将缓存用于使用Unix套接字文件、命名管道或共享内存建立的连接。

另一个帮助您解决问题的要点是引入以下参数:

skip-name-resolve

你可以按照这篇文章的指导,了解MySQL基于IP地址或主机名进行身份验证的方式 - 文章链接 在这里
默认情况下,MySQL基于IP地址或主机名授予权限。当有一个特定主机的连接时,MySQL会执行反向DNS查找并比较主机名和IP地址。
希望这能帮助回答你的问题!

我不理解的是,为什么在通过IP(真实IP,而非回环)从本地机器连接时,user_name@%不能匹配,但通过IP连接时可以工作。 - bpeikes
那是一个奇怪的问题,但我的解决方案对你的情况有效吗,@bpeikes? - N00b Pr0grammer
这是一个生产系统,因此我不能尝试太多更改需要重新启动服务的服务器参数。 - bpeikes
@bpeikes,我懂了! - N00b Pr0grammer

3
首先请记住,只有127.0.0.1, ::1, localhost等... 被认为是环回地址而不是 192.168.1.10或SERVER_123 ,所以您可能会接受它们。
是的!192.168.1.10 应该与通配符主机%匹配,但是不幸的是除了test_user_2和test_user_3之外,在提供的用户表数据中我没有看到test_user条目。
此外,在Linux上,您可以使用/etc/hosts文件将IP地址映射到主机名。

1
我找到了问题所在。有一个匿名用户在特定用户之前匹配。我不确定重启期间发生了什么导致反向解析发生变化,但我们有一个用户''@'SERVER_123',必须开始匹配。删除匿名用户解决了问题,我们不再需要对test_user@SERVER_123拥有特权。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接