用Apache限制每个访问者的xfer字节数

有时候,我会在几个小时内通过下载整个网站(〜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 。 由于最初的目的是阻止垃圾邮件,这很容易与一个匹配的监狱做到。

假设

  • 该网站包含链接到本地​​资源(例如ZIP或PDF文件)的信息页面,可以很容易地从QUERY_STRING
  • “正常”访问者正在浏览页面,但只挑选了一些“资源”
  • 处理所有页面的“leecher”自然会在短时间内比“普通访问者”在一天中更多的“资源文件”。 就我而言,50次/ d已经足够“普通访客”了。

Fail2Banfilter

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

失败2class监狱

现在在/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个候选人),但可能需要一些微调。 任何处于类似情况的人都应该能够轻松地适应上述情况以匹配网站。