标签:nginx 限制
如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。
cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。
HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令
这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制
HttpLimitReqModul 限制某一段时间内同一ip访问数实例
http {
.....
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为1个,
#1M能存储16000个状态,rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成60r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;
#limit_conn_zone $binary_remote_addr zone=one:10m;
## Log Format ###
log_format main ‘$remote_addr $host $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"‘;
server {
listen 80;
server_name ckl.zab.com;
location / {
root /opt/wwwroot/zabbix;
index index.html index.php index.htm test.php;
}
location ~ \.php$ {
root /opt/wwwroot/zabbix;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。
limit_req zone=allips burst=5 nodelay;
}
}
测试:
/opt/abtmp/usr/bin/ab -n 10 -c 10 http://127.0.0.1/test.php
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:10:29 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
每秒限制一个,超过503
HttpLimitZoneModule 限制并发连接数实例
limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域
http {
.....
#定义一个名为one的limit_zone,大小10M内存来存储session,
#以$binary_remote_addr 为key
#nginx 1.18以后用limit_conn_zone替换了limit_conn
#且只能放在http作用域
limit_conn_zone $binary_remote_addr zone=one:10m;
## Log Format ###
log_format main ‘$remote_addr $host $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" "$http_user_agent" "$gzip_ratio"‘;
server {
listen 80;
server_name ckl.zab.com;
location / {
root /opt/wwwroot/zabbix;
index index.html index.php index.htm test.php;
}
location ~ \.php$ {
root /opt/wwwroot/zabbix;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
#连接限制为5
limit_conn one 5;
#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
limit_rate 300k;
}
}
}
测试:
/opt/abtmp/usr/bin/ab -n 10 -c 10 http://127.0.0.1/test.php
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 200 11 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
127.0.0.1 - - [27/Dec/2014:23:08:05 +0800] "GET /test.php HTTP/1.0" 503 206 "-" "ApacheBench/2.3"
每秒的限制为5,超过503
本文出自 “运维菜鸟” 博客,请务必保留此出处http://ckl893.blog.51cto.com/8827818/1682248
标签:nginx 限制
原文地址:http://ckl893.blog.51cto.com/8827818/1682248