导读 | 分布式拒绝服务攻击(英文意思是Distributed Denial of Service,简称DDoS)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击,其中的攻击者可以有多个。NGINX: 限制连接的实践 (Defense DDOS) |
关于限制用户连接,Nginx 提供的模块: [ ngx_http_limit_req_module ] [ ngx_http_limit_conn_module ] , 还有 stream 模块也包含类似的功能, 本文只说明 ngx_http_limit_req_module 的使用.
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...
server {
...
limit_req zone=one burst=5;
location /search/ {
limit_req zone=one burst=5;
}
...
}
参数说明
$binary_remote_addr
: 二进制远程地址
zone=one:10m
: 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话
rate=10r/s
: 限制频率为每秒10个请求
burst=5
: 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
拟定这样一个场景:
一次正常请求返回 50 个 HTML 页面,总共用时10s。 如果在一个500人的场所中,单个客户端 IP 发出的最大请求数会是: 500/10 * 500 = 2500.
所以,为了不影响正常用户的访问,我似乎只能做如下设置: rate=2500r/s. 显然,这样的设置是不合理的。
如何解决这个问题 ?
如果不是以 IP 作为记录的标准,而是请求的 URI, 那么问题就可以解决!
在 limite_req_zone key zone=name:size rate=rate
中的 key 设定为: $remote_addr$uri
, 如下:
limit_req_zone "$remote_addr$uri" zone=one:10m rate=1r/s;
ab测试
ab -n 1000 -c 100 http://xx.xx.xx.xx/uri
ps: 这个解决方式是一个萌萌哒的同事想出来的.
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/124722.html