使用 Apache 限制每个访问者的传输字节数

使用 Apache 限制每个访问者的传输字节数

时不时地,我会被“下载者”访问,他们在几个小时内下载整个网站(约 2 GB),而平均访问者下载量远低于 50 MB。我想为每个访问者设置一个“字节限制”(例如,允许每个访问者每天最多下载 100 MB)。

我试过了mod_cband,这已经非常接近我的目标了。不幸的是,我只建立了一个引文每个 VHost– 即如果达到配额,整个 VHost 将被阻止。mod_cband还可以管理每个远程 IP 的配额 - 但为此我需要提前知道这些 IP,但我不知道。

我也调查过mod_evasive,我已经在稍微不同的环境中使用了它。但这只能让我限制请求的数量,而不考虑“容量”(传输的字节数)。

有没有现成的解决方案?如果我错过了mod_cband,也欢迎提供提示。如果解决方案无法绑定到 VHost(但可以应用于整个服务器),那么这也是可以接受的(尽管每个 VHost 是首选)。

请注意不是想要限制带宽(即速度),限制每个 IP 的同时请求数;这并不是为了带宽,而是为了防止“抄袭”。

编辑:我刚刚发现Apache::配额看起来它几乎满足了我的要求。但是它 a) 需要运行mod_perl(我不太熟悉 Perl 编码),并且 b) 似乎无人维护(最新版本是 v0.04,可追溯到 2007 年 3 月,如果我没记错的话,它是为 Apache 1.3 设计的)。

编辑2:基于的解决方案mod_security或者iptables也欢迎。到目前为止,我在这方面发现的只是速度限制或限制每个远程 IP 的连接数量,这不是我想要的。

编辑3:虽然我已经找到了根本问题的解决方案(请参阅下面的回答),但我仍然对建立“每个访客和时间的转移配额”的解决方案感兴趣,正如我的问题中所述 - 因为我的解决方案不能应用于任何地方(请参阅那里描述的“假设”)。

答案1

看起来我利用了XY 陷阱– 并且完全错过了我已经用于其他用途的一款软件:Fail2ban。由于最初的意图是阻止吸血鬼,因此只需建造配套的监狱就可以轻松实现这一目标。

假设

  • 该网站包含链接到本地​​资源(例如 ZIP 或 PDF 文件)的信息页面,可以通过 QUERY_STRING 轻松匹配
  • “普通”访问者正在浏览页面,但只选择一些“资源”
  • 一个“leecher”处理所有页面,在很短的时间内自然会比“普通访问者”一整天访问更多的“资源文件”。就我而言,每天 50 次访问对“普通访问者”来说已经足够了。

Fail2Ban 过滤器

Fail2Ban 过滤器利用了这些假设,仅匹配资源。这可以通过文件扩展名(上例:.pdf.zip)或路径(例如,所有资源都位于/downloads- 但应确保不匹配“正常页面”。因此,这里有一个示例过滤器(放置在/etc/fail2ban/filter.d/apache-leecher.conf):

[定义]
# 匹配以下所有资源/下载:
failregex = ^ -.*“(GET|POST) /download.*”

# 或者,匹配所有 PDF/ZIP 文件
#failregex = ^ -.*"(GET|POST).*\.(zip|pdf)"

(我已将 ZIP/PDF 变体作为注释放入;您failregex的过滤文件中应该只有一个)

Fail2Ban 监狱

现在针对相应的监狱,配置如下/etc/fail2ban/jail.conf

[apache-leecher]
# 每小时下载文件不得超过 100 个,否则将被阻止 6 小时(21600 秒)
已启用=真
端口 = http,https
过滤器 = apache-leecher
日志路径 = /var/log/httpd/access_log
最大重试次数 = 100
查找时间 = 3600
班次 = 21600

似乎有效(已经捕获了 2 名候选人),但可能需要进行一些微调。任何处于类似情况的人都应该能够轻松调整上述内容以适应网站。

相关内容