主要通过两方案来做防护,一是nginx自带模块限制请求连接数和并发数;二是筛选IP加入黑名单;
1、并发数和连接数控制的配置
nginx http配置:
#请求数量控制,每秒20个
limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
#并发限制30个
limit_conn_zone $binary_remote_addr zone=addr:10m;
server块配置
limit_req zone=one burst=5;
limit_conn addr 30;
2、根据nginx 访问日志记录发现可疑的或者不正常的访问记录记录然后自动添加到nginx的黑名单
起到阻止的作用 可以作为防范少量的ddos攻击
策略:根据nginx日志,最近5W条同一IP访问记录超过5000的加入黑名单禁止访问,每两小时执行一次
示例脚本:
#!/bin/bash
acc_log=/usr/local/nginx/logs/uatpc.access.log
blockip=/usr/local/nginx/conf/vhost/blockip.conf
#最近50000条日志,同一IP超过5000的加入黑名单
tail -n50000 ${acc_log} | awk '{print $1,$7,$9}'|grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou|360|bing|soso|403|api"|awk '{print $1}'|sort|uniq -c|sort -rn | awk '{if($1>5000)print "deny "$2";"}' >> ${blockip}
#排除公司IP
sed -i '/116.228.62.38/d' ${blockip}
/usr/local/nginx/sbin/nginx -s reload