上周末,我的两个 Web 服务器中的一个被 mysql 服务器阻塞了。结果是,该阻塞 Web 服务器上的所有请求都显示了一个定制的错误页面。
我正在考虑实施一个脚本来防止该问题发生。但我无法在我的测试实验室中重现此错误。
Mysql 文档说这个错误是由于网络问题导致的,这是一种阻止攻击的安全措施。
您对如何重现此错误有什么想法吗?
我尝试使用错误的登录名/密码连接到我的测试服务器,以模拟暴力攻击。我还执行了一个复杂的查询,花了几分钟才得到答案,并在得到答案之前停止了查询(很多次)。
我看到变量 Aborted_connects 增加,但没有 Aborted_clients 增加,并且我的主机没有被该测试服务器阻止。
任何想法?
先感谢您。
答案1
我知道它已经很老了,但我找到了重现它的方法。
首先,您必须降低 max_connection_error 以避免重复:
SET GLOBAL max_connect_errors=2;
然后您可以使用 telnet 程序来建立错误连接。输入命令后只需双击回车键:
$ telnet 192.168.128.98 3306
Trying 192.168.128.98...
Connected to 192.168.128.98.
Escape character is '^]'.
a
5.6.14-1+debphp.org~precise+1?"sC1kHf?s,{MO$dK-<(Smysql_native_password
!#08S01Got packets out of orderConnection closed by foreign host.
$ telnet 192.168.128.98 3306
Trying 192.168.128.98...
Connected to 192.168.128.98.
Escape character is '^]'.
a
5.6.14-1+debphp.org~precise+1?"sC1kHf?s,{MO$dK-<(Smysql_native_password
!#08S01Got packets out of orderConnection closed by foreign host.
然后你会看到你的连接被拒绝:
$ telnet 192.168.128.98 3306
Trying 192.168.128.98...
Connected to 192.168.128.98.
Escape character is '^]'.
kHost '192.168.128.1' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.
答案2
如果来自某台主机的中断连接数超过此数目,则该主机将被阻止进一步连接。您可以使用 FLUSH HOSTS 语句解除对被阻止主机的阻止。
如果在前一个连接中断后,在少于 max_connect_errors 次尝试内成功建立连接,则该主机的错误计数将被清除为零。但是,一旦主机被阻止,FLUSH HOSTS 语句是解除阻止的唯一方法。
来源:http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_connect_errors
请注意,MySQL 5.1.x 中的默认值设置为 10。
编辑:如果您想尝试制作无效的 TCP 数据包,希望它会在 mysql 中生成连接错误,您应该查看这两个工具:
我认为它会产生您想要的错误但我从未尝试过。