使用 IP 表规则阻止 DoS 攻击?

Jos*_*ett 6 iptables centos ddos apache-2.2

我想知道是否可以使用简单的 IP 表规则来防止小型 (D)DoS 攻击?

小我的意思是他们用来自一两个 IP 地址的大约 400 多个请求淹没了我的 Web 服务器。在我注意到 IP 地址开始攻击我的 Web 服务器后,我可以删除它们,但 IP 表通常需要几分钟才能针对该 IP 启动,然后开始完全删除它,以免影响该 Web 服务器.

我使用以下命令删除 IP:

iptables -I INPUT -s "IP HERE" -j DROP

然后显然保存它:

/etc/init.d/iptables save

我通常使用以下命令找出攻击 IP 地址:

netstat -plan|grep :80|awk '{print $5}'|cut -d: -f 1|sort|uniq -c|sort -n

这样做的问题是我必须在那里,并且需要我事后采取行动。是否有 IP 表规则可用于在达到 150 个连接后立即删除 IP 地址?这样我就不必担心它会压倒 Web 服务器,而且我也不必在那里阻止它。

顺便说一句,如果重要的话,我在 CentOS 上使用 Apache。

感谢您的时间。

cyb*_*x86 13

对于提供灵活性的东西,请查看最近(和限制)模块。最近将跟踪 IP 在给定时间范围内建立的连接数,并可用于触发特定规则。最近的模块(相对)占用大量 CPU - 但与加载动态页面相比,可以完全接受。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -m recent --update --seconds 3600 --name BANNED --rsource -j DROP
-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j ATTK_CHECK

-A ATTACKED -m limit --limit 5/min -j LOG --log-prefix "IPTABLES (Rule ATTACKED): " --log-level 7
-A ATTACKED -m recent --set --name BANNED --rsource -j DROP
-A ATTK_CHECK -m recent --set --name ATTK –-rsource
-A ATTK_CHECK -m recent --update --seconds 600 --hitcount 150 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -m recent --update --seconds 60 --hitcount 50 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

本质上,上述相当于:

  • 接受已经建立的连接(即它们已经通过了我们的规则)
  • 从禁止的 IP 中删除端口 80 和 443 (SSL) 上的所有连接 - 如果它们继续尝试连接,请延长时间 - 等待一个小时(没有任何连接尝试),然后再取消阻止它们。
  • 根据我们的规则检查新连接:
    • 考虑 10 分钟内超过 150 个连接的攻击
    • 考虑 1 分钟内超过 50 个连接的攻击
    • 记录攻击(但每分钟不超过 5 个条目 - 不想淹没我们的日志);并阻止连接

有关更详细的解释以及我使用的上述分层版本,请参阅这篇文章

请记住,ipTables 根本无法解决网络拥塞问题,而且对任何分布式攻击都相当无效——它的优势在于安全性和减少服务器负载。