对某些 IP 地址应用 nginx 速率限制,对其他 IP 地址应用另一个速率限制

对某些 IP 地址应用 nginx 速率限制,对其他 IP 地址应用另一个速率限制

在我们的 Nginx 配置中,我们目前有以下内容:-

limit_req_zone $binary_remote_addr zone=two:10m rate=15r/m;
limit_req zone=two burst=5 nodelay;

现在我们想要改变这种情况,以便此速率限制适用于某些 IP 地址,然后再对其他 IP 地址应用另一个稍微不那么严格的速率限制。

geo $limited_net {
    default      0;
    111.222.333.444  1;
}

map $limited_net $addr_to_limit {
    0  "";
    1  $binary_remote_addr;  
}

limit_req_zone  $addr_to_limit  zone=two:10m  rate=15r/m;


geo $less_limited_net {
    default      1;
    111.222.333.444  0;
}

map $less_limited_net $addr_to_limit {
    0  "";
    1  $binary_remote_addr;
}

limit_req_zone  $addr_to_limit  zone=three:10m  rate=25r/m;

因此,来自 IP 111.222.333.444 的流量将受到第一个限制较严格的速率限制的影响,而不会受到第二个限制较少的速率限制的影响。

我们还使用 cloudflare,并在 /etc/nginx/cloudflare.conf 中设置了 cloudflare 的 ip 地址,类似于此https://support.cloudflare.com/hc/en-us/articles/200170706-如何恢复原始访客 IP-使用 Nginx-

这会给我我想要的东西吗?

或者应该更像这样?

geo $limited_net { 
default 0; 
111.222.333.444 1; 
} 

map $limited_net $addr_to_limit { 
0 ""; 
1 $binary_remote_addr; 
} 


limit_req_zone $addr_to_limit zone=two:10m rate=15r/m; 
limit_req_zone $binary_remote_addr; zone=three:10m rate=25r/m;

答案1

尽管这个问题很老了,但它可能会与将来偶然发现这个问题的人有关:

您可以使用多个 limit_req_zone 指令以不同的速率处理来自不同来源的请求:

limit_req 指令可以有多个,例如,以下配置将限制来自单个 IP 地址的请求的处理速率,同时限制虚拟服务器的请求处理速率:

 limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
 limit_req_zone $server_name zone=perserver:10m rate=10r/s;

 server {
     ...
     limit_req zone=perip burst=5 nodelay;
     limit_req zone=perserver burst=10;
 }

当且仅当当前级别没有 limit_req 指令时,这些指令才会从上一级别继承。

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req

答案2

在这个问题上花了很长时间之后,我在配置中遇到了这个问题,

这是正确的,你唯一的问题是你正在检查每个速率限制中的 $addr_to_limit 变量而不是映射变量($limited_net 或 $less_limited_net)

加上一些细节

正确的配置应该是:

geo $limited_net {
    default      0;
    111.222.333.444  1;
}

map $addr_to_limit1 $limited_net {
    0  "";
    1  $binary_remote_addr;  
}

limit_req_zone  $limited_net  zone=addr_to_limit1:10m  rate=15r/m;


geo $less_limited_net {
    default      1;
    111.222.333.444  0;
}

map $addr_to_limit2 $less_limited_net {
    0  "";
    1  $binary_remote_addr;
}

limit_req_zone  $less_limited_net  zone=addr_to_limit2:10m  rate=25r/m;

相关内容