我正在使用 iptables 的速率限制模块来防止 DoS 攻击(我知道它无法阻止全面的 DDoS,但至少它可以帮助阻止较小的攻击)。
在我的规则中我有类似这样的内容:
/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 负载过大了?
任何反馈都将不胜感激。
谢谢你!
答案1
您的规则似乎没有指定任何特定来源。在一分钟内接受 20 个新连接后,它将停止接受新连接。
您需要使用该recent
模块,以便 iptables 记住连接来自何处并阻止从同一地址连接速度过快的人。这需要两个规则:一个用于 iptables “学习”地址,另一个用于 iptables 查看该地址在指定时间内访问服务器的次数:
/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
本文更详细地讲解。
答案2
由于您没有指定应用该规则的源 IP 地址,因此它还会切断合法用户的流量。如果您将规则更改为具有源地址,那么您将对该特定地址进行 RateLimit。按照您现在的规则,该 RateLimit 对所有地址均有效。
我设置了 RateLimit 来限制除特定规则指定的 IP 之外的所有 IP。我的配置如下:
-I 输入 -m tcp -p tcp --dport 80 -d xx.xxx.xx.xx -j 接受
-A 输入 -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 400/min --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name ratelimit -j 接受
- -A 输入-p tcp -m tcp --dport 80 -j RateLimit
然后我有一堆规则,例如
- -A RateLimit -s xx.xxx.xx.x -j 接受
这将允许在端口 80 上进行通信,并配置连接限制和突发,并按源 IP 进行限制(--hashlimit-mode srcip)。将检查 IP 是否存在于 RateLimit 中(--hashlimit-name ratelimit)。
也许这样的东西正是您所寻找的?