rinald_未来往事

Nginx限制并发连接数和白名单配置-提升整体并发

安全

背景/需求:

恶意攻击、恶意采集、恶意刷页面
秒杀、抢购并发连接限制、队列缓冲
web下载带宽限制、web请求速率限制
CC攻击

Nginx连接数限制模块:

说明:Nginx有很多模块、模块下面又分很多指令,下面就说说limitconn_zone和limit_conn两指令

limit_conn_zone模块指令配置

Nginx http模块中添加
http{
……………………
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server{
……………………
}
}
PS:配置区域名称为perip、perserver,需要写在http里面;
对于关系:
key => $binary_remote_addr #二进制的IP地址
name => perip #随便取的一个名字,比如,你可以取成fity
size => 10m #空间大小,这里是10MB
一个二进制的ip地址在32位机器上占用32个字节,在64位机器上占用63个字节,那么10M可以存放多少呢,计算一下,10x1024x1024/32 = 327680,意思就是可以存放326780个ip地址(32位),64位可以存放163840个ip
1、key:键,可以说是一个规则,就是对客服端连接的一个标识,比如上面用的是IP地址
2、zone:共享内存空间,作用:保存每个key对应的连接数
3、size:共享内存空间大小,如1M、10M、100K
当共享内存空间被耗尽,服务器将会对后续所有的请求返回503 (Service Temporarily Unavailable) 错误。来源:未来往事 http://fity.cn


Nginx server主机模块中添加
server{
……………………
limit_conn perip 3; #调用nginx http区段中定义的perip,该指令需要写在server里面,限制除了白名单外的IP,每个IP最大并发为3个连接;
#limit_conn perserver 1000; #限制该主机最大并发连接数;
#PS:什么是并发呢?请求到达并已经读取了请求头信息到响应头信息发送完毕
#limit_rate 256k; #限制每个连接的带宽,可以单独定义这条指令,与连接数无关;
#limit_req zone=perreq nodelay #如果请求不需要被延迟,添加nodelay参数,服务器会立刻返回503状态码。
……………………
}
PS:参数补充说明:
$binary_remote_addr是限制同一客户端ip地址;
$server_name是限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度。来源:未来往事 http://fity.cn


你也可以使Nginx limit只针对执行PHP时有效:
location ~ .*.(php|php5)?$ {
limit_conn perip 3;
……………………
}

白名单功能配置:

nginx的限速白名单需要结合geo和map指令来实现,其中map指令使用ngx_http_map_module模块提供的。ngx_http_map_module模块可以创建变量,这些变量的值与另外的变量值相关联。允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被接受的时候执行视图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失。配置参考:
http{
……………………
geo $whiteiplist {
default 1; #如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。来源:未来往事http://fity.cn
127.0.0.1 0; #白名单: 127.0.0.1
172.16.0.0/16 0; #白名单 172.16.0.0 ~ 172.16.255.255
10.252.0.0/24 0; #白名单 10.252.0.0 ~ 10.252.0.255
}

map $whiteiplist $limit {
1 $binary_remote_addr;
0 “”;
}
……………………
}
PS:1)geo指令定义一个白名单$whiteiplist, 默认值为1, 所有都受限制。 如果客户端IP与白名单列出的IP相匹配,则$whiteiplist值为0也就是不受limit限制。通常白名单内的IP是你自己的IP、CND IP、负载均衡IP或反向代理IP地址等。
2)map指令是将$whiteiplist值为1的,也就是受限制的IP,映射为客户端IP。将$whiteiplist值为0的,也就是白名单IP,映射为空的字符串。
3)limit_conn_zone和limit_req_zone指令对于键为空值的将会被忽略,从而实现对于列出来的IP不做限制。
4)geo指令使用ngx_http_geo_module模块提供的。默认情况下,nginx有加载这个模块,除非人为的 —without-http_geo_module。ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址。geo指令主要是根据IP来对变量进行赋值的。因此geo块下只能定义IP或网络段,否则会报错。
5)map指令使用ngx_http_map_module模块提供的。默认情况下,nginx有加载这个模块,除非人为的 —without-http_map_module。


完整的配置示例

附:部分配置代码
http{
……………………
geo $whiteiplist {
default 1;
127.0.0.1 0; #白名单: 127.0.0.1
172.16.0.0/16 0; #白名单 172.16.0.0 ~ 172.16.255.255
10.252.0.0/24 0; #白名单 10.252.0.0 ~ 10.252.0.255
}

map $whiteiplist $limitlist {
1 $binary_remote_addr;
0 “”;
}

limit_conn_zone $limitlist zone=perip:10m;
limit_conn_zone $limitlist zone=perserver:10m;

server{
……………………
limit_conn perip 3; #调用nginx http区段中定义的perip,该指令需要写在server里面,限制除了白名单外的IP,每个IP最大并发为3个连接;
#limit_conn perserver 1000; #限制该主机最大并发连接数;
#PS:什么是并发呢?请求到达并已经读取了请求头信息到响应头信息发送完毕。来源:未来往事http://fity.cn
#limit_rate 256k; #限制每个连接的带宽,可以单独定义这条指令,与连接数无关;
……………………
}
}

ngx_http_limit_req_module模块

ngx_http_limit_req_module模块的使用和ngx_http_limit_conn_module模块差不多,不在赘述,可查看本文底部推荐的文章。

未来往事http://fity.cn编写本文的背景及初衷:解决网站遭受恶意攻击的过程及方法思路分享,希望对你有所帮助^
^
[root@web ~]#netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,”t”,state[key]}’
([root@web ~]#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’)
ESTABLISHED t 681
TIME_WAIT t 155
………………
[root@web ~]#netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
通过上述命令也可以查看有许多连接的ip,如:
1 61.190.80.226
1 68.180.228.183
2 36.5.133.7
2 36.6.64.229
3 218.75.39.58
3 223.247.41.168
4 112.238.71.202
4 112.65.135.38
5 10.165.13.170
5 103.40.223.63
6 117.69.251.81
………………
limit_zone处理前后服务器性能监控对比图:
点击在新窗口中浏览此图片

推荐阅读:
Tengine限制连接数和白名单功能
nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
Module ngx_http_limit_req_module
Nginx模块 ngx_http_limit_req_module限制请求速率
nginx 的限制连接模块limit_zone与limit_req_zone

直白的说就是降低单IP的并发连接数提升整体IP并发连接个数,在一定程度上可能会存在可用率的下降情况。如果上述方法在没能解决你的问题,建议你联系你的运营商提供安全增值服务或增加硬件安全设备进行解决问题,欢迎补充。

原文作者:rinald
原文地址:http://fity.cn/post/608.html
互联网技术更新较快,本站很多文章具有实效性,我会及时更新原文,但转载的文章无法通知更新。为了不给读者造成困惑或误导,请您在转载时保留此出处信息,尊重别人也是尊重自己。

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。