一点儿个月现在,我们的一台共享托管服务器一直受到来自数十万个独立 IP 的“POST /”请求的持续攻击。在许多情况下,这已经使服务器不堪重负并导致拒绝服务类型的中断。目标域相当无聊(一家小型房地产经纪公司),因此虽然这似乎是恶意的,但我不明白这种长期且 99% 不成功的攻击的动机。
一个典型的请求(取自 TCPDUMP)看起来像这样:
POST / HTTP/1.1
Accept: */*
Accept-Language: en-us
Content-Type: application/octet-stream
Content-Length: 570
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: xxx.co.uk
Connection: Keep-Alive
Cache-Control: no-cache
2+cIPSyYVJFqB9xPFzWoLj9seNyEKIcuIJz/yfkc9tVP+orXgjDk8ywglufcXsMz
bVP4XLcowz/fQtsn2kceQEj/EaEWx/GEbcC3eTbCbTube0suAfEGje3qISKQJ+ka
HaChqun3whii3OTh7vCayGV72lh4raLRandKC5g/73wgQ9Jzh2OLIzNvsiEMSJco
yG+4i35XJMvX7ovx8qJkyByHUIeE5G5M2Kp97O4sOT4jTAK2y/KAMjf6oFgtAJhI
K4/HdcnyfNdI3/4RJXlrSfhUQAc+qhGMEL7AZdtzgRub7lnu+hbuPGZvS3rF1MvL
WK1q4mrnZr0Q3m0bWkzsMZCndQ7fqOBafchjprhn4JKPsjO+upRm2m+irvmJjqnl
sDiR3fnD6pzbWyLTm2qonMJPCll3p6zg06gEfIaW04t9r89/PdHgz8AU8nzO4BX8
qwTG6dSjgbowHyJQmud8Ro+ZT+gHfw/YQUrBqKm7RoFmfJzUoOCKaP1LTwHfI1Gc
E+L8bwQV6ztKBwVn2NqbE83SAXYr9E0QkpaxGg==
我们无法确定 POST 请求中的内容,因为它看起来像垃圾,但我不确定它是否相关。它不是 base64 编码的。
为了减少响应此请求所占用的带宽量,我们在 Apache2 配置中禁止使用 POST 请求:
<Location />
<Limit POST>
Order deny,allow
Deny from all
</Limit>
</Location>
这会将响应大小限制为简单的 403 Forbidden 消息,而不是客户端的通常主页。
为了尝试阻止执行此操作的 IP,我们尝试通过管道传输访问日志、过滤 POST 请求并将其直接输入到 iptables 中:
tail -f /var/www/vhosts/xxx.co.uk/statistics/logs/access_log | grep "POST / " | awk '{print $1}' | xargs -I{} iptables -A INPUT -s {} -j DROP
这种方法效果很好,可以减少问题的影响,但效果很差,当 iptables/内核出现问题时,我们通常必须清除 iptables 规则集,因为规则集的大小达到 50-60k。这不是一个解决方案,因为我不能让它运行几个星期,直到负责人收到消息并放弃。
我们也关闭了这个特定 VirtualHost 的 KeepAlive,以将占用的 Apache 工作者数量保持在最低限度,这有一定的帮助,但这不是解决方案。
有谁有更好的想法,如何将这些请求(数十万个远程 IP)屏蔽,或者将对 Apache 的影响降至最低?目前我能做的最好的就是将其配置为发送 403 Forbidden,并结合 IP 阻止几个小时……
谢谢!
答案1
如果您具有该机器的 root 访问权限,您可以部署具有有限规则集的 snort/suricata,例如检测和阻止 POST 请求。
优点:
- 在网络层面上工作
- IPS 可以被封锁一段时间
缺点:
- 设置和维护不太容易,应该由知道如何/做什么的人来做
更简单:在 apache 前面设置 nginx,然后从那里处理 403,同时将有效请求传递给 apache
优点:
- 轻松设置
- 可以处理比 Apache 更多的请求
- 限制速率可能用于 IP 级别
缺点:
- 必须测试