![如果每分钟超过 n 个连接,则限制速率(切断)](https://linux22.com/image/573392/%E5%A6%82%E6%9E%9C%E6%AF%8F%E5%88%86%E9%92%9F%E8%B6%85%E8%BF%87%20n%20%E4%B8%AA%E8%BF%9E%E6%8E%A5%EF%BC%8C%E5%88%99%E9%99%90%E5%88%B6%E9%80%9F%E7%8E%87%EF%BC%88%E5%88%87%E6%96%AD%EF%BC%89.png)
您建议我使用什么来根据每分钟 n 个连接来限制传入的 http 连接 (get/post) 的速率?
如果特定客户端在一分钟内建立超过 n 个连接,则断开所有进一步的连接,直到该分钟结束。
我目前使用 nginx 和 haproxy,但我确实在寻找最适合这项工作的工具。
更新
有些客户端每分钟允许的连接数更多,是否有办法添加每个客户端的规则?API 将是一个额外的好处。
答案1
这取决于您想如何优雅地应用截止。对于 TCP 层上的 DROP/DENY,您可以使用 iptables 执行此操作,例如:
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
你可以针对特定客户设定目标,并为第二条规则提供额外的替代方案,例如
iptables -I INPUT -s 1.2.3.4 -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 50 -j DROP
iptables -I INPUT -s 4.3.2.1 -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
答案2
我不确定 nginx 是否支持此类限制。不过,您可以使用 iptableslimit
模块。您可以查看这一页了解更多解释。
下面是一个以每分钟 5 个连接的速率接受新的 HTTP 连接的示例。
-A FORWARD -d your.server.ip.addr -m state --state NEW -p tcp --dport 80 \
-m limit --limit 5/minute -j ACCEPT