5

我有一个基于 Perl 的 CGI/Fast CGI Web 服务,并希望通过 IP 地址对客户端进行速率限制,以阻止激进的客户端导致过多的工作。

我四处寻找一些代码并在 CPAN 中找到Algorithm::TokenBucket但那是针对客户端请求的;它没有持久性,也没有每个用户的配置,因此对于服务器端速率限制并不是很有用。

我正在为已经存在的东西寻找建议,否则我需要基于一些简单的持久性来推出自己的建议,例如绑定到DB_File per-IP 地址和一些执行令牌管理的批处理作业。

4

2 回答 2

5

我使用Cache::FastMmap通过跟踪每个 IP 地址的命中来限制速率。它是一个缓存,因此数据会随着时间的推移而过期,但如果您正确设置大小和过期时间,这应该不是问题。

IP 地址是哈希键,哈希值是时间戳数组。我有第二个数据结构(也由Cache::FastMMap支持),它是禁止 IP 地址的哈希,根据第一个结构中的数据进行更新。

于 2009-02-01T20:41:31.230 回答
4

我知道这不是您所要求的,但是您是否考虑过在堆栈中已经为您完成的其他地方处理此问题?显然我不知道你的部署堆栈,但如果它是 apache,你可以使用mod_evasive。或者,如果你在 Linux 上,你可以让 iptables 使用类似的东西来完成它的工作:

#Allow only 12 connections per IP
/sbin/iptables -A INPUT -p tcp --dport 80 -m conn-limit --connlimit-above 12 -j REJECT --reject-with tcp-reset

当然更复杂的规则是可能的。

于 2009-02-02T04:06:57.743 回答