【问题标题】:Nginx Rate Limiting count for a whole subnet, not just per IP整个子网的 Nginx 速率限制计数,而不仅仅是每个 IP
【发布时间】:2018-10-04 12:41:46
【问题描述】:

我在 Nginx 中有一个定义的区域用于限制请求,正如他们的文档中所述,它很简单:

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

到目前为止一切顺利。

它适用于攻击性行为的客户,但最近他们中的一些人在访问我的服务时开始轮换他们的 IP 地址,主要在 /24 范围内,所以我想知道是否可以将区域连接计数限制应用于整个 IP 范围(不仅仅是每个 IP),比如 --connlimit-mask 24 标志对 iptables 有用...?

【问题讨论】:

    标签: nginx rate-limiting


    【解决方案1】:

    最简单的方法是 nginx 组合 mapgeo 指令,这也将为您提供最大的灵活性,恕我直言。

    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;
    

    从记忆中快速完成,但应该可以工作。

    【讨论】:

    • 感谢您的想法。这可能会部分完成这项工作。问题是在地理块中,您将传入的 IP 块作为常数。虽然它实际上在某些时候是一个常数,但他们可以改变它,所以我的假设是 IP 块最初是未知的
    • @IstvanProsinger 我真的很想知道你是否找到了答案。
    • 如果我错了,请纠正我,但这不会仍然是每个 IP 的阻塞吗? geo 块从客户端 IP 创建一个新的 $geoRateBlacklist 变量。该变量将是 0 或 1。映射块会将 0 或 1 映射到新的 $rateBlacklist 变量,该变量是“”或 $binary_remote_addr。这是否意味着,对于该变量不为空的情况,它仍将始终等价于“limit_req_zone $binary_remote_addr zone=leash:10m rate=18r/s”,即限制每个 IP 而不是子网?跨度>
    【解决方案2】:

    可以使用带有正则表达式的map 指令来提取$binary_remote_addr 的子网。例如,对于斜线 16 的子网:

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多