我正在使用iptables的速率限制模块来防止DoS攻击(我知道它不能阻止全面的DDoS攻击,但至less可以帮助更小的攻击)。
在我的规则中,我有这样的东西:
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m limit --limit 20/minute --limit-burst 20 -j ACCEPT
它运作良好,直到昨晚有人不停地打我的80港口。 连接按规则丢弃(如日志所示)。 但是,这也使服务器对其他合法用户不可用。
我不明白为什么会这样。 我认为除了淹没服务器之外,不会影响任何其他用户。
是否因为iptables不堪重负?
任何反馈将不胜感激。
谢谢!
您的规则似乎没有指定任何特定的来源。 在一分钟内接受20个NEW连接后,它将停止接受NEW连接。
您需要使用recent模块,以便iptables记住连接来自哪里,并阻止连接到同一地址的人太快。 这需要两个规则:一个用于iptables“学习”地址,然后一个用于iptables,查看该地址在指定时间内已经达到了多less次:
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m recent --set /sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m recent --update --seconds 60 --hitcount 20 -j DROP
这篇文章进入更多的细节。
它也会切断合法用户的stream量,因为您还没有指定源IP地址来应用该规则。 如果您将规则更改为具有源地址,那么您将对该特定地址进行RateLimit。 根据您的规则,RateLimit适用于所有地址。
我有RateLimit设置来限制除了某些规则指定的IP。 我的configuration如下:
-I INPUT -m tcp -p tcp –dport 80 -d xx.xxx.xx.xx -j ACCEPT
-Ainput-m tcp -p tcp –dport 80 -m hashlimit –hashlimit-up至400 / min –hashlimit-burst 500 –hashlimit-mode srcip –hashlimit-name ratelimit -j ACCEPT
然后我有一堆规则如
这将允许在端口80上进行通信,连接限制和突发configuration,并通过源ip(–hashlimit-mode srcip)进行限制。 在RateLimit中会检查IP是否存在(–hashlimit-name ratelimit)。
也许这样的事情更多是你在找什么?