错误1129: 主机因为连接错误过多而被阻止; 使用'mysqladmin flush-hosts'命令解除阻止。

4
当我运行连接到mysql的python代码时,我看到这个错误:“错误1129:主机''由于许多连接错误而被阻止;请使用'mysqladmin flush-hosts'解除阻止”。
以下是我尝试过的方法: 我增加了max_connection_errors值,并执行了“flush hosts”命令。我还检查了mysql日志,但没有发现问题。此外,我还检查了网络连接,一切正常。
以下是mysql设置:
mysql> SHOW VARIABLES LIKE '%error%';
error_count | 0 log_error | /var/log/mysql/error.log max_connect_errors | 4294967295 max_error_count | 64 slave_skip_errors | OFF
mysql> SHOW VARIABLES LIKE '%max_connections%';
max_connections | 5000
mysql> show status like '%onn%';
Aborted_connects | 6 Connections | 4802 Max_used_connections | 26 Ssl_client_connects | 0 Ssl_connect_renegotiates | 0 Ssl_finished_connects | 0 Threads_connected | 1
mysql>'SHOW STATUS WHERE variable_name LIKE "Threads_%" OR variable_name = "Connections
Connections | 4996 Threads_cached | 7 Threads_connected | 1 Threads_created | 1950 Threads_running | 1
mysql> show processlist;
4800 | root | localhost | NULL | Query | 0 | NULL | show processlist 4807 | root | localhost | db1 | Sleep | 0 | | NULL
请问有人能帮我找出问题所在以及解决方法吗?

2
你应该在http://dba.stackexchange.com上提问。 - Jorge Campos
@BK435 Python和MySQL在同一台服务器上。 - sweetpotatoegg
此外,当我运行代码时,mysql错误立即生成。代码甚至没有失败,也没有生成任何错误。我还在/var/log上进行了检查,没有失败和错误。 - sweetpotatoegg
2个回答

8
这不是你的MySQL服务器软件出现故障,而是你正在运行Python程序的同一台机器上其他软件存在故障的证据。错误1129意味着MySQL的粗略反网络犯罪功能已被激活:试图连接多次(默认为100次)但连接失败的在同一台机器上运行的程序。此时,MySQL会认为该机器已被入侵(或失控),并拒绝来自该机器的任何更多连接。 可能是什么原因导致这种情况?你的机器上是否有cronjob或其他自动运行的程序使用了无效的用户名或密码?如果是这样,它可能会不断地向MySQL服务器发送连接失败的请求。
如果你的机器是基于Linux或BSD的,请使用"ps axuww" shell命令几次,并查找你不认识的进程。(如果你不确定如何操作,请在你所使用操作系统的论坛上咨询。) 你可以考虑重新启动机器。
编辑:你的机器似乎正在受到攻击。你提到在authlog中收到了大量的“failed password”消息。你能否追踪这些攻击的来源?如果攻击源是内部--也就是来自你或你同事控制的机器--那么它们很可能是某种配置有误的程序,
要么运行太频繁
要么使用了错误的密码,
或者两者都有。
查找IP地址是否存在模式。这些连接失败是来自一个或少数几个IP地址吗?它们来自像192.168..或10...*这样的私有地址,甚至是localhost(127.0.0.1)吗?还是它们来自各个地方?如果你不认识这些地址,请将它们输入以下三个网站的表单中:
https://ripe.net
https://apnic.net
https://arin.net

至少其中一个会告诉你这些失败是来自哪个国家和电信提供商。如果它们来自你没有关系的地方,那么你正在受到攻击。
如果攻击是外部的,你需要采取措施在它们到达数据库机器之前阻止它们。大多数运行MySQL的机器都通过防火墙与更广泛的互联网隔离,因为MySQL不如其他软件抵御网络犯罪和脚本小子的攻击。
寻找时间模式。这些失败的时间是否每五分钟一次,或者尽可能快,或者是什么?如果是规律性的,似乎很可能你有某种行为不当的程序。
如果你不理解其中任何内容,请寻求网络工程师的帮助。如果你的MySQL服务器持有敏感或有价值的信息,请不要拖延解决这个问题。祝好运。这种事情曾经毁了我的一些日子。

感谢@Ollie Jones。我检查了/var/log/authlog,发现有很多“Failed password for root from <ip address>”和“authentication failure”来自不同的IP地址。也许这就是错误1129的原因。我还重新启动了机器,但是仍然看到相同的错误。接下来我应该采取什么行动?我能不能阻止可疑的IP地址连接? - sweetpotatoegg
@BK435,你之前提到我应该允许远程连接。但是,我设置了默认仅在本地主机上监听,这更加兼容且不会降低安全性,而不是使用skip-networking。在这里,Host 'X'被阻止是因为连接错误过多,实际上它是localhost DNS。 - sweetpotatoegg
你对我来说是个天使,@Ollie Jones!非常感谢。我注意到有很多可疑的连接失败,比如“sshd[3040]: Failed password for root from..”或“sshd[8726]: pam_unix(sshd:auth): authentication failure; logname=”等。我安装了fail2ban并且已经禁止了许多IP地址。但即使如此,当我运行Python代码时,仍然会看到相同的错误:“Host '' blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'”。我重新启动了MySQL并重启了服务器,但仍然出现相同的错误。我们这里没有网络工程师,我真的很迷茫。请帮帮我。 - sweetpotatoegg

1

如果客户端在同一时间窗口内发起了多个连接请求,那么可以通过运行命令mysqladmin flush-hosts来从阻止列表中删除主机IP。


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