- 关于iptables定时策略、crontab设置请自行去了解,建议使用"nohup &"方式执行crontab任务;
- 对于nginx error日志可以做大小限制进行截断以减少脚本读取日志文件耗时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# !/bin/bash # 脚本用于Nginx错误日志检测,若30秒内来源IP地址超出6次错误视为攻击源并自动加入防火墙 # sh -x weblog_black.sh 进行跟踪调试 NGLOG2="/data/nginx/log/error.log" LOG1="/data/shell/$(date +%Y%m%d)_w$$.txt0" LOG2="/data/shell/$(date +%Y%m%d)_w$$.txt1" LOG3="/data/shell/$(date +%Y%m%d)_w$$.txt2" IPTAB="/data/shell/w$$_iptables" SHLOG="/data/shell/$(date +%Y%m%d)_w$$.run" find /data/shell/ -type f -name "*.*" -mmin +3 -exec rm -f {} \; grep 404.html $NGLOG2 | grep -av '/undefined' | cut -d',' -f2 | awk '{sum[$2]++} END {for (i in sum) {print sum[i],i | "sort -nr -k 1"}}' > $LOG1 sleep 30 grep 404.html $NGLOG2 | grep -av '/undefined' | cut -d',' -f2 | awk '{sum[$2]++} END {for (i in sum) {print sum[i],i | "sort -nr -k 1"}}' > $LOG2 # 定义函数: 统计一段时间内某个IP地址访问出错的次数 function errsum(){ ip=`echo $line | awk -F" " '{print $2}'` nume=`echo $line | awk -F" " '{print $1}'` #计时结束的访问出错次数 nums=`grep $ip $LOG1 | awk -F" " '{print $1}'` #计时开始的访问出错次数 numc=`expr $nume - $nums + 0` #计时时间段内的出错次数 echo $ip $nume $nums $numc >> $SHLOG } # 定义函数: 将访问出错次数过高的IP地址加入防火墙策略 function addrule(){ if [ "$numc" -gt $1 ]; then /sbin/iptables -nvL IN_NGBLACK if [ "$?" -eq 1 ]; then /sbin/iptables -N IN_NGBLACK /sbin/iptables -I INPUT -j IN_NGBLACK else chain_sum=`/sbin/iptables -nvL IN_NGBLACK | tail -n +3 | wc -l` if [ "$chain_sum" -gt 100 ]; then /sbin/iptables -D IN_NGBLACK $chain_sum fi fi /sbin/iptables -nvL IN_NGBLACK | grep $(echo $ip) | grep DROP if [ "$?" -eq 1 ]; then /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m time --timestart `date +%H:%M` --timestop `date -d '+10 min' +%H:%M` -j DROP else chain_num=`/sbin/iptables -nvL IN_NGBLACK --line-numbers | grep $(echo $ip) | grep DROP | cut -d' ' -f1` /sbin/iptables -D IN_NGBLACK $chain_num /sbin/iptables -I IN_NGBLACK 1 -s $ip -p tcp -m multiport --dports 80,443 -m time --timestart `date +%H:%M` --timestop `date -d '+15 min' +%H:%M` -j DROP fi /sbin/iptables-save > $IPTAB #当执行防火墙策略更改后,保存 iptables 列表 fi } #检索30秒钟内访问出错次数超过6次的IP地址加入防火墙策略 cat $LOG2 | while read line do errsum addrule 6 done sleep 30 grep 404.html $NGLOG2 | grep -av '/undefined' | cut -d',' -f2 | awk '{sum[$2]++} END {for (i in sum) {print sum[i],i | "sort -nr -k 1"}}' >$LOG3 #检索60秒钟内访问出错次数超过10次的IP地址加入防火墙策略 cat $LOG3 | while read line do errsum addrule 10 done |