有时候,我会在几个小时内通过下载整个网站(〜2GB)的“leechers”来访问,而普通用户则远远低于50MB。 我想为每个访问者设置一个“字节限制”(例如,允许每天和访问者最多100 MB)。
我已经尝试了mod_cband ,它非常接近我的目标。 不幸的是,我只pipe理了每个VHost的报价,即如果配额被击中,整个VHost就会被封锁。 mod_cband也可以pipe理每个远程IP的配额 – 但为此,我需要事先知道这些IP,而我不知道。
我也看了一下mod_evasive ,我已经在稍微不同的上下文中使用了。 但是这只允许我限制请求的数量,并不考虑“卷”(字节传输)。
有没有“即用型”的解决scheme? 如果我错过了mod_cband的东西,也欢迎提示。 如果一个解决scheme不能绑定到VHost(但将服务器范围内),这也是可以接受的(尽pipe每个VHost是优选的)。
注意我不想限制带宽 (即速度),既不限制同时请求每个IP ; 这不是带宽,而是“抄袭猫”。
编辑:我刚刚发现了Apache ::配额 ,这似乎做了我想要的东西。 但它a)需要mod_perl运行(我不熟悉Perl编码),和b)似乎没有维护(最新版本是v0.04,可以追溯到2007年3月,如果我有那正确)。
Edit2:也欢迎基于mod_security或iptables的解决scheme。 到目前为止,我在这方面发现的只是速度问题,或者限制每个远程IP的连接数量,这不是我所追求的。
编辑3:虽然我已经find了解决scheme的潜在问题(请参阅下面的答案),但我仍然对build立“每个访问者和时间的转移限额”的解决scheme感兴趣,正如我的问题所述 – 因为我的解决scheme不能到处应用(请参阅上述“假设”)。
看起来像我挖掘到XY陷阱 – 完全错过了我已经用于其他事情的一个软件: Fail2ban 。 由于最初的目的是阻止垃圾邮件,这很容易与一个匹配的监狱做到。
Fail2Banfilter利用这些假设,只匹配资源。 这可以通过文件扩展名(上面的例子: .pdf或.zip ),或通过一个path(例如,所有资源位于/downloads – 但应确保不匹配“正常页面”。 (放在/etc/fail2ban/filter.d/apache-leecher.conf ):
[定义] #匹配下面的所有资源/ downloads: failregex = ^ - 。*“(GET | POST)/download.*” #或者,匹配所有的PDF / ZIP文件 #failregex = ^ - 。*“(GET | POST)。* \。(zip | pdf)”
(我已经把ZIP / PDF变体作为注释;你的过滤文件中只应该有一个failregex )
现在在/etc/fail2ban/jail.confconfiguration相应的jail:
[Apache的吸血] #每小时下载不超过100个文件,或者封锁6小时(21600s) enabled = true 端口= http,https filter = apache-leecher logpath = / var / log / httpd / access_log maxretry = 100 findtime = 3600 bantime = 21600
似乎工作(已经抓住了2个候选人),但可能需要一些微调。 任何处于类似情况的人都应该能够轻松地适应上述情况以匹配网站。