NGINX限频的几种方案

CC是常见的网络攻击方法,通过有限的IP去不断请求服务器导致服务器资源耗尽宕机,因此利用NGINX的限频可以在一定程度上降低CC攻击的危害。主要用到的有HttpLimitReqModule和HttpLimitZoneModule,两者都可以基于IP来限制访问频率,不过前者限制的是HTTP请求数、后者限制的是TCP并发连接数。

HttpLimitReqModule使用limit_req_zone和limit_req指令配合达到限制的目的。一旦一段时间内单个IP的HTTP请求超过指定数量,就会返回503错误(为了方便通常可以改为429错误,即429 Too Many Requests)。

HttpLimitConnModule用来限制单个IP的并发连接数,使用limit_zone和limit_conn指令。

HttpLimitReqModule 限制某一段时间内同一IP访问数

http{
    ...
    # 定义一个名为httplimit的limit_req_zone用来存储session,大小是10M内存
    # 以 $binary_remote_addr 即IP地址的二进制格式为key,限制平均每秒的请求为30个(单位r/s可以改为r/m,即每分钟多少次)
    # 1M能存储16000个状态,rete的值必须为整数
    limit_req_zone $binary_remote_addr zone=httplimit:10m rate=30r/s;
    # 超出时返回429错误(默认返回503)
    limit_req_status 429;
    ...
    server{
        ...
        # 限制每IP每秒不超过30个请求,漏桶数burst为10
        # brust的意思就是,如果第1-9秒请求为29个,第5秒的请求为35个是被允许的
        # 但是如果你第1秒就35个请求,第2秒超过30的请求返回429错误(上面定义为429)
        # nodelay,如果不设置该选项,严格使用平均速率限制请求数
        # 第1秒35个请求时,5个请求放到第2秒执行
        # 设置nodelay,35个请求将在第1秒执行

        limit_req zone=httplimit burst=10 nodelay
        ...
    }
    ...
}

HttpLimitZoneModule 限制并发连接数
该功能限制的是TCP连接数

http{
    ...
    # 定义一个名为tcplimit的limit_zone,大小10M内存来存储session
    # 以 $binary_remote_addr 为key
    # nginx 1.18以后用limit_conn_zone替换了limit_conn
    limit_conn_zone $binary_remote_addr zone=tcplimit:10m;
    # 超出时返回429错误(默认返回503)
    limit_conn_status 429;
    ...
    server{
        ...
        limit_conn tcplimit 40;   # 连接数限制
        limit_rate 500K;  # 单连接带宽限制
        ...
    }
    ...
}

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注