我有一个运行 PHP5、prefork MPM、eaccelerator 和 modevasive 的 Apache 2 服务器。
我的服务器有时会宕机,显然是由于某些 IP 的泛滥造成的。至少这是我通过运行 netstat 了解到的情况。我得到如下信息:
tcp 0 0 my.ip.is.here:80 88.160.126.117:55864 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57073 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:56989 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57813 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57695 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57274 ESTABLISHED
tcp 602 0 my.ip.is.here:80 80.214.0.41:51131 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57513 ESTABLISHED
tcp 0 0 my.ip.is.here:80 77.88.31.248:64551 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:55131 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57565 ESTABLISHED
tcp 357 0 my.ip.is.here:80 209.85.228.92:51134 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57817 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:53902 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57060 ESTABLISHED
tcp 718 0 my.ip.is.here:80 82.252.2.103:49506 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57553 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57692 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:55571 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57762 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57771 ESTABLISHED
tcp 1750 0 my.ip.is.here:80 41.105.112.207:19940 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57187 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:56782 ESTABLISHED
tcp 668 0 my.ip.is.here:80 86.72.212.166:64263 ESTABLISHED
tcp 750 0 my.ip.is.here:80 88.160.126.117:57681 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:56741 ESTABLISHED
所以看起来 88.160.126.117 正在淹没我的服务器。(每次都是不同的 IP,所以我无法手动阻止它)Mod_evasive 确实会将此 IP 记录在其日志中,但根本无法阻止此问题!
即使我重新启动 apache2 和网络,服务器仍然会再次卡在达到其 maxclients 设置的位置。
知道我能做什么吗?
我的模式化配置是:
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 20
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
答案1
低限
您的限制可能太低了。您的限制是每秒 20 次。如果攻击者的攻击次数低于此限制,则不会触发拦截。
如果他们访问的资源是进程密集型的(例如搜索功能),那么非常低的请求率可能会导致系统崩溃。
您可能需要根据攻击模式对块进行微调。
mod_evasive 中包含一个 test.pl 脚本,请尝试一下,看看是否可以触发阻止。
目标网址
另外,IP 访问的是什么?尝试在 Apache 中打开服务器状态并检查 URL。这将让您知道他们访问的是同一个页面还是不同的页面。这将让您知道 PageCount 或 SiteCount 是否更合适。
检查日志中的 IP,看看它们的连接速率。使用它来调整限制。请注意,限制是针对每个子进程的。不能保证它们会命中相同的子进程。
洪水泛滥
最后,我见过攻击者一次发起数十个连接的洪水攻击。在这种情况下,dos evasive 可能没有时间做出响应。它会阻止未来的请求,但如果已经发起了 100 个请求,那就太晚了。在这些情况下,使用 mod_dosevasive 的功能调用 iptables 并在防火墙处执行完全丢弃。
每个孩子的最大请求数
您的 Apache 的 MaxRequestPerChild 设置是什么?速率限制是按每个子级进行的。我见过 MaxRequestPerChild 太低而导致 mod_evasive 无法工作的情况。通常这不是问题,但需要检查一个方面。