我有一个基于Perl CGI /快速CGI的Web服务,并希望限速通过IP地址的客户端停止侵略性的客户造成太大的工作。

我环顾四周对一些代码,发现算法:: TokenBucket 在CPAN但这是客户端请求;它没有持久性和不具有每个用户的配置等是不是真的有用用于服务器端的速率限制。

我在寻找一个已经存在的东西的建议,否则我将需要基于一些简单的持久如领带的 DB_File 每个IP地址和确实令牌管理一些批处理作业。

有帮助吗?

解决方案

我使用缓存通过跟踪命中:: FastMmap 以限速每个IP地址。这是一个缓存,这样的数据将随着时间的推移到期,但如果你设置的大小和到期时间的权利,这不应该是一个问题。

的IP地址是散列键和散列值是时间戳的阵列。我有一个第二数据结构(也由缓存:: FastMMap 备份),它是禁止的IP地址的散列值,根据从所述第一结构的数据更新。

其他提示

我知道这是不是你问,但你有没有考虑处理在它已经为你做了这个堆栈的其他地方?显然,我不知道您的部署栈,但如果它的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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top