如何实施超长费率限制?

问题描述 投票:0回答:1

对于我的大多数网站,我的正常速率限制为1请求/秒:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

我现在需要每天限制10个特定地点。那可能吗?

limit_req_zone $binary_remote_addr zone=loginmin:10m rate=1tth;

我得到:无效率“rate = 1tth”

nginx
1个回答
1
投票

您链接的文章的引用:

在源代码审查之后,我找到了一种方法,可以将最低费率降低到每天86个请求。下面的补丁添加了使用下一个配置指令的能力:

从中可以学到两件事:

  1. 您将需要修补Nginx的源代码,以使文章中的方法起作用。
  2. 即使有补丁,您也只能将其降低到86个请求/天。

因此,我们可以得出结论,仅凭Nginx目前无法实现您所寻找的目标。

我的建议是将fail2ban用于此目的。您可以创建自定义jail:

# /usr/local/etc/fail2ban/jail.d/nginx-extreme-ratelimit.local

[nginx-extreme-ratelimit]
enabled  = true
filter   = nginx-ratelimit
action   = pf <-- or ufw, ipfilter, ipfw, whatever firewall you use
logpath  = /var/log/nginx-access.log
findtime  = 86400
maxretry = 10
bantime  = 86400

以及相应的自定义过滤器:

# /usr/local/etc/fail2ban/filter.d/nginx-ratelimit.conf

[Definition]

failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST>,

ignoreregex =

datepattern = {^LN-BEG}

显然必须调整failregex以匹配访问字符串。

此外,设置一个每天下午12点运行的cron作业来取消IP地址:

00 00 * * * /usr/local/bin/fail2ban-client set nginx-extreme-ratelimit unbanip 1.2.3.4
© www.soinside.com 2019 - 2024. All rights reserved.