时不时地,我会被“下载者”访问,他们在几个小时内下载整个网站(约 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 名候选人),但可能需要进行一些微调。任何处于类似情况的人都应该能够轻松调整上述内容以适应网站。