这个十一过的真不消停,太多的cc攻击,一直在暴力破解我们的一个接口,攻击ip好几千个,而且经过了几层代理。第三方没有nginx的日志格式最前面设置了http_x_forwarded_for和remote_addr两个字段,访问日志出现了一堆代理IP,如下图:
因为用了第三方web防火墙,所以remote_addr获取的最后一个IP地址是第三方的,前面所有的IP都是经过的代理层,而且是伪造的。跟第三方技术人员沟通后,倒数第二个IP地址应该是攻击源IP。还不能用deny去拒绝,因为deny默认用的remote_addr变量。也不能一个一个用if判断去写。
经过查询资料nginx的map应该能解决我这个问题。
1、编写map.conf文件,内容如下:
map $http_x_forwarded_for $access {
default false;
include /etc/nginx/conf.d/ip.list;
}
2、写个脚本统计出攻击ip,我取出的是ip前三段,可以根据具体需求进行修改
#!/bin/bash
cat /var/log/nginx/access.log | awk -F'-' '{print $1}' | awk '{if ($3!="") print}' | awk '{$NF="";print}' | awk '{print $NF}' | sort | uniq -c | sort -nr | awk '{print $2}' | awk -F'.' {'prin
t $1"."$2"."$3'} | sort | uniq -c | sort -nr | awk '{print $2}' | sed 's/^/~/' | sed 's/$/ true;/' > /etc/nginx/conf.d/ip.list
执行完脚本取出的攻击ip如下
3、在你的站点文件里面加入如下内容:
if ($access = true) {
return 303;
}
4、重启nginx服务即可!
nginx -s reload
验证如下: