根据web日志或者或者网络链接数,监控当某个IP并发链接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP.nginx
固然各个公司的IP并发数各有不一样,上面只是举例说明。web
由于个人Nginx的WEB日志天天进行切割处理,否则全部web日志都堆在一块儿,查看麻烦。shell
系统状态:bash
1 [root@nginx shell]# cat /etc/redhat-release 2 CentOS release 6.7 (Final) 3 [root@nginx shell]# uname -r 4 2.6.32-573.el6.x86_64 5 [root@nginx shell]# /application/nginx/sbin/nginx -v 6 nginx version: nginx/1.10.3
一、web日志切割脚本服务器
脚本以下,各位网友能够根据本身的需求进行更改。网络
此脚本能够放在定时任务中执行,按照天数进行切割。并发
#!/bin/bash #-------------CopyRight------------- # Name:Cut Ningx logs # Version Number:1.1 # Type:sh # Language:bash shell # Date:2018-05-16 # Author:xubing # QQ:442656067 # Email:eeexu123@163.com # Blog:https://www.cnblogs.com/eeexu123/ #Nginx日志轮询切割备份 IP=$(ifconfig eth0 | awk -F "[ :]+" 'NR==2 {print $4}') #cut every day nginx log cut(){ [ -d "/application/nginx/logs" ]||{ echo "Nginx logs is not exist." exit 1 } cd /application/nginx/logs /bin/mv www_access.log www_access_$(date +%F).log /application/nginx/sbin/nginx -s reload } #tar nginx log file to /backup backup(){ [ -d "/backup/$IP" ]||{ mkdir -p /backup/$IP } tar -zcf /backup/$IP/www_access_$(date +%F).log.tar.gz www_access_$(date +%F).log #rysnc /backup file to backup server rsync -avz /backup/$IP rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password //推送到备份服务器上 } #del before 7 day nginx log del(){ find /application/nginx/logs -type f -name "*$(date +%F).log" -mtime +7 | xargs rm -f find /backup/$IP -type f -name "*.tar.gz" -mtime +7 | xargs rm -f } main(){ cut sleep 2 backup sleep 2 del } main
二、DOS攻击防御脚本app
根据上述web日志进行PV统计。此脚本能够放入定时任务中。也能够在main函数中进行while循环
函数
#!/bin/bash #-------------CopyRight------------- # Name:defined DoS # Version Number:1.1 # Type:sh # Language:bash shell # Date:2018-05-16 # Author:xubing # QQ:442656067 # Email:eeexu123@163.com # Blog:https://www.cnblogs.com/eeexu123/ ch_web_log(){ awk '{print $1}' /application/nginx/logs/www_access_$(date +%F).log|sort|uniq -c|sort -rn -k1>/tmp/ip.log //将统计的IP访问次数放到ip.log文件中 while read line do PV=`echo $line|awk '{print $1}'` //IP访问次数 IP=`echo $line|awk '{print $2}'` if [ $PV -ge 100 -a `iptables -nL|grep "$IP"|wc -l` -lt 1 ];then //将PV大于100的IP,而且防火墙上并无封堵此IP。否则防火墙会重复封堵IP iptables -I INPUT -s $IP -j DROP //防火墙封堵 echo "$IP" >>/tmp/`date +%F`_ip.log //将封堵的IP放到此文件中 echo "The DROP ip is $IP" fi done</tmp/ip.log }
#删除被防火墙封堵的IP del(){ exec </tmp/$(date +%F -d '1day ago')_ip.log while read line do iptables -D INPUT -s $line -j DROP done } main(){ ch_web_log sleep 2 del } main