用IP表规则阻止DoS攻击?

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

小到我的意思是说,他们正在泛滥我的networking服务器约400多个请求从一个或两个IP地址。 当我注意到他们已经开始点击我的networking服务器时,我可以放弃IP地址,但是通常需要花费几分钟的时间让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表规则,我可以用来删除一个IP地址后,达到150连接? 这样,我不必担心它压倒了Web服务器,我也不必在那里阻止它。

顺便说一下,如果有问题,我在CentOS上使用Apache。

感谢您的时间。

对于提供灵活性的东西,请查看最近(和限制)的模块。 最近将logging在一个给定的时间范围内IP所做的连接数量,并且可以用来触发一个特定的规则。 最近的模块(相对)CPU很重 – 但是与加载dynamic页面相比,这是相当可以接受的。

 -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 

基本上,上述内容相当于:

  • 接受已经build立的连接(即他们已经通过我们的规则)
  • 将端口80和443(SSL)上的所有连接从禁止的IP上删除 – 如果它们不断尝试连接,则延长时间 – 在解除阻塞之前,等待一小时(没有任何连接尝试)。
  • 根据我们的规则检查新的连接:
    • 考虑在10分钟内超过150个连接的攻击
    • 在1分钟内考虑超过50个连接的攻击
    • logging攻击(但每分钟不超过5个条目 – 不要淹没我们的日志); 并阻止连接

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

请记住,ipTables根本无助于networking拥塞,对于任何分布式攻击都是无效的 – 它的优势在于安全性和降低服务器的负载。

可以使用iptables来阻止这样的滥用者,但是你必须小心,因为iptables是非常耗费CPU资源的。 每个数据包都会根据每个规则进行检查,因此添加规则可能会很快导致服务器耗尽周期。 我曾经有一个客户,每次他们想要阻止某人都会增加一个新的规则,然后有一天,他们的stream量略高于正常stream量,系统崩溃了。 表可以减less查看规则的数量,但是你不能仅仅在iptables中抛出很多规则。

另一种select是黑洞路由:

 ip route add blackhole $IP_HERE ip route flush cache 

路由表是散列表 (使用散列表 ),而iptables规则必须按顺序查看,效率要低得多。 这样,你可以有成千上万的路由没有问题,其中数以千计的iptables规则将成为问题,贯穿每一个请求。

至于你的第二个问题,你可以使用hashlimit模块为滥用者创build一个自动黑名单。 看到我的post关于防止DDoS攻击的更多细节,但简短的forms是:

 iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min \ --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP