标签:文件中 NPU inpu tables tab 条件 标记 author bash
在日常运维中,难免碰到大流量,造成网站无法访问或者影响缓慢的情况;#!/bin/bash
##############################################
#Author: Liuzhengwei - 1135960569@qq.com
#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
加上任务计划,每分钟执行一次即可~
标签:文件中 NPU inpu tables tab 条件 标记 author bash
原文地址:http://blog.51cto.com/liuzhengwei521/2296272