如何从 Nginx ngx_http_limit_req_module 中排除 IP

如何从 Nginx ngx_http_limit_req_module 中排除 IP

我尝试在主 Nginx 配置文件中使用以下命令来限制 ip 的连接数:

limit_conn_zone $binary_remote_addr zone=alpha:8m;
limit_req_zone  $binary_remote_addr zone=delta:8m rate=30r/s;

在我的域 nginx 配置文件中如下:

limit_conn alpha 10; 
limit_req  zone=delta burst=50 nodelay;

一切运行良好!

但是现在我想将 Cloudflare ip 排除在外,因为我从它们那里获得了很多连接,我不想让它们被阻止,但是该怎么做呢?

Cloudflare 的 IP:

192.168.1.0/24 
199.27.128.0/21 
173.245.48.0/20 
103.21.244.0/22 
103.22.200.0/22 
103.31.4.0/22 
141.101.64.0/18 
108.162.192.0/18 
190.93.240.0/20 
188.114.96.0/20 
197.234.240.0/22 
198.41.128.0/17 
162.158.0.0/15 
104.16.0.0/12 

答案1

如果你想封锁 IP,你必须使用类似 fail2ban 的工具。只需安装 fail2ban 并创建一个 nginx 过滤器文件:

vim /etc/fail2ban/filter.d/nginx-req-limit.conf

在其中添加以下内容:

[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>

在以下位置创建一个新的监狱配置:

vim /etc/fail2ban/jail.local

如果您没有看到 jail.local,只需运行:

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

在末尾添加以下内容:

[nginx-req-limit]

enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/*error.log
findtime = 600
bantime = 7200
maxretry = 10

findtime 和 maxretry 值很重要。它们共同决定了违规 IP 被禁止的频率。如果你将这些值调小,IP 被禁止的频率就会更高。根据需要进行调整。

保存两个配置文件后,使用以下命令重新启动 fail2ban:

service fail2ban restart

您还可以使用fail2ban-client通过以下命令查找特定监狱的状态:

fail2ban-client status nginx-req-limit

相关内容