Nginx速率限制整个子网的计数,而不仅仅是每个IP

时间:2018-04-24 09:50:43

标签: nginx rate-limiting

我在Nginx中有一个用于限制请求的已定义区域,如文档中所述,它非常直接:

limit_req_zone $ binary_remote_addr zone = leash:10m rate = 18r / s;

到目前为止一切顺利。

它非常适合那些采取进攻行动的客户,但最近有些人在访问我的服务时开始轮换他们的IP地址,大多数在/ 24范围内,所以我想知道是否可以将区域连接数量限制应用于一个完整的IP范围(不仅仅是每个IP),类似于--connlimit-mask 24标志可以用iptables做什么......?

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用nginxmap指令的geo组合,这也会给你最大的灵活性,恕我直言。

geo $geoRateBlacklist {
    default        0;
    192.0.0.0/24   1;
    10.0.0.0/24    1;
    172.0.0.0/24   1;
}

map $geoRateBlacklist $rateBlacklist {
    1              $binary_remote_addr;
    0              "";
}

limit_req_zone $rateBlacklist zone=leash:10m rate=18r/s;

从内存中快速完成,但应该可以正常工作。

答案 1 :(得分:0)

可以将map指令与regex一起使用,以提取$binary_remote_addr的子网。例如,对于斜线16子网:

map $binary_remote_addr $bin_slash16 {
"~^(?P<a>..)..$" "$a";
}

来源:https://forum.nginx.org/read.php?2,271483,271788#msg-271788