nginx 限流 cc/ddos基础防御

位置:首页>文章>详情   分类: 教程分享 > Linux和Shell教程 > Linux安全防护   阅读(578)   2024-04-17 10:24:04

Nginx 限流组件limit_req

limit_req作用:

  • 限制用户(同一个ip)在给定时间内HTTP请求的数量,
  • 流量限制主要用作安全目的,
  • 可以防止大量请求的攻击下服务被压垮,
  • 可以减慢暴力密码破解的速率

limit_req原理:

漏桶算,

在limit_req的限制下,请求被nginx以固定的速率处理,这个符合漏桶算法,即流出的速率恒定。

 

Nginx limit_req 配置案例

参考一:

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    ......略....
    server{
    ......略....
        location / {
             limit_req zone=perip;
             limit_req_status 503;
             ......略....
        }
    ......略....
    }
}

说明:

  • 变量:$binary_remote_addr【这里是客户端的ip地址,在这里是做限制的标识,是基于ip地址来限制】
  • zone=perip:20m:  perip  【  perip是内存区域的名字,20m: 生成的内存区域的大小】
  • rate=1r/s 【允放相同标识(IP)的客户端的访问频次,1次/秒】
  • limit_req_status 【限流后快速返回状态码,默认503】

在上面这个例子中:就是同一个ip地址在每秒内只能访问1次

配置好以后重启nginx使用ab测试

ab -n 100 -c 10  http://127.0.0.1/

测试结果

测试结果:

  • 只有1个成功其他99个失败
  • 响应总时间0.011秒

参考二:增加 burst 配置

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    ......略....
    server{
    ......略....
        location / {
             limit_req zone=perip burst=5;
             limit_req_status 503;
             ......略....
        }
    ......略....
    }
}

burst :

有大量请求时,超过频次限制的请求,会允许5个访问

允许超过限制后添加到队列执行,队列执行速率按照zone配置的rate进行

 注意:burst指定的请求数量,不会马上进行处理,而是按照上面zone中rate指定的值,以固定的速率进行处理。

 

执行ab测试

ab -n 100 -c 10 http://127.0.0.1/

测试2

测试结果:

有6个请求成功(1+队列5个),符合预期

注意时间,花费了5.009s (队列中的请求按设定的速率1秒执行一个所以消耗5s+另外一个,总计大于5s),符合预期

 

参考三:nodelay

http {
    limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    ......略....
    server{
    ......略....
        location / {
             limit_req zone=perip burst=5 nodelay;
             limit_req_status 503;
             ......略....
        }
    ......略....
    }
}

nodelay参数说明:

  • burst的队列虽然可以处理用户的需求,但需要用户按照处理时间等待,对用户不够友好,
  • nodelay参数允许请求在排队的时候就立即被处理,

这里有一点要注意:因为nodelay允许立即处理,也就是有并发请求时,事实上已经超过了rate设置的处理速率了,所以要根据自己机器的实际情况设置这个值

注意nodelay+burts另外一个情况:

nodelay只是对放到burst队列中的请求立即处理,但处理完成后队列并不立即清空

队列清空的速度仍然按原来的速度每秒一个清空,所以当再有请求过来时,并不会马上又有两个burst请求被处理.

 

再次测试:

ab -n 100 -c 10 http://127.0.0.1/

测试3

这次请求完成时间为 0.009秒

 

rate 和 burst 设置多少

网站需要把动态生成的内容(java,php,python等程序生成)和静态内容分离到不同的虚拟主机

 因为静态内容不需要大量的计算,所以通常limit_req用于限制动态内容的访问频率

 

限流的目的不是让用户不能访问,而是为了保证用户能流畅的访问,所以需要根据页面的实际情况来限制。

 如果一个页面打开时同时发出的请求比较多,  (静态文件分离后要检查ajax请求数, 可以根据生产环境的日志进行检查) 则rate值不能低于并发的请求数.如果低于并发的情求数,会导致用户不能正常访问页面

 

以下配置仅供参考

     limit_req_zone $binary_remote_addr zone=reqperip:20m rate=20r/s;
     limit_req zone=reqperip burst=10 nodelay;

 

其他可配置参数

  • limit_req_status 用来指定请求时报错产生的状态码,默认503。可以指定为一个自定义的值,如:444(说明:444是nginx自定义的一个非标准状态码, 它会立即关闭连接,连响应头也不给客户端发,可以在受到恶意攻击时使用这个状态码)
  • limit_req_log_level   当报错时记录到日志的错误级别,默认值是error

 

使用nginx配置能减少部分cc攻击导致宕机情况增加基础安全,配合其他手段进行更全面的安全基础防护。

遇到恶意大量ddos攻击,还是只有花钱买专业服务。

 

地址:https://www.leftso.com/article/1702235681398460417.html

相关阅读

ddos攻击属于网络攻击的常见模式之一。这里写一个能简单防御的脚本ddos-deflate脚本的安装和卸载
Nginx 限流组件limit_req limit_req作用: 限制用户(同一个ip)在给定时间内HTTP请求的数量, 流量限制主要用作安全目的, 可以防止大量请求的...
漏洞概况Jenkins有一个内置的命令行界面(CLI),可从脚本或shell环境访问Jenkins。Jenkins漏洞修复方案讲解
把应用系统比作是保险柜,假如保险柜破了一个洞,这个洞只有少数人知道,没有传播开来,也暂时没有补救的措施,那这个洞就是0day漏洞。