用shell暂时缓解ddos和cc大流量访问的情况
发布时间:2020-12-15 23:23:35 所属栏目:安全 来源:网络整理
导读:在日常运维中,难免碰到大流量,造成网站无法访问或者影响缓慢的情况; 如果没有购买高防产品,则可以通过shell暂时缓解; #!/bin/bash###############################################Author: Liuzhengwei - [email?protected]#WeiXin:1135960569#Last mod
在日常运维中,难免碰到大流量,造成网站无法访问或者影响缓慢的情况;
如果没有购买高防产品,则可以通过shell暂时缓解; #!/bin/bash ############################################## #Author: Liuzhengwei - [email?protected] #WeiXin:1135960569 #Last modified: 2018-10-09 14:31 #Filename: blockip.sh #Description: 检测每分钟的访问IP,每分钟访问超过100次则进行封禁 # 每30分钟再检测一次,如果被封禁的IP访问量很小时,则解封 ############################################## source /etc/profile #定义时间,用于过滤出每分钟的日志 time=`date -d "-1 min" +%Y:%H:%M` log_dir=/usr/local/nginx/logs/access.log #定义阻塞IP的函数 block_ip(){ #拉取上一分钟所有的日志,放到指定文件中 egrep "$time:[0-5]+" $log_dir > /tmp/last_min.log #将访问超过100的IP记录下,加入iptables进行阻塞 awk ‘{print $1}‘ /tmp/last_min.log | sort -n | uniq -c| sort -n | awk ‘$1>100 {print $2}‘ > /tmp/bad_ip.list #计算IP的数量 number=`wc -l /tmp/bad_ip.list | awk ‘{print $1}‘` #当ip数大于0时,使用iptables封禁 if [ $number -gt 0 ];then for ip in `cat /tmp/bad_ip.list`;do iptables -I INPUT -s $ip -j REJECT done #记录被封禁的IP echo "`date +%F-%T` 封掉的IP有:" >> /tmp/block_ip.log cat /tmp/bad_ip.list >> /tmp/block_ip.log fi } #定义解封IP的函数 unblock_ip(){ #将包个数小于5的ip记录到文件中,标记为白名单 iptables -nvL INPUT | sed ‘1d‘ | awk ‘$1<5{print $8}‘ > /tmp/good_ip.list #统计白名单IP个数 number=`wc -l /tmp/good_ip.list | awk ‘{print $1}‘` if [ $number -gt 0 ];then for ip in `cat /tmp/good_ip.list`;do iptables -D INPUT -s $ip -j REJECT done #记录被解封的IP echo "`date +%F-%T` 解封的IP有:" >> /tmp/unblock_ip.log cat /tmp/good_ip.list >> /tmp/unblock_ip.log fi #清空计数器 iptables -Z } #取出当前时间 now=`date +%M` #每隔30分钟解封符合解封条件的IP,其余时间封禁IP if [ $now == "00" ] || [ $now == "30" ];then unblock_ip block_ip else block_ip fi 加上任务计划,每分钟执行一次即可~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |