Chinaunix首页 | 论坛 | 博客
  • 博客访问: 693611
  • 博文数量: 98
  • 博客积分: 3145
  • 博客等级: 中校
  • 技术积分: 1902
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-15 12:52
文章分类
文章存档

2021年(1)

2020年(1)

2016年(8)

2015年(3)

2014年(1)

2013年(5)

2012年(4)

2011年(9)

2010年(12)

2009年(42)

2008年(12)

我的朋友

分类: LINUX

2016-08-18 12:08:40

  问题:
       最近发现很多大并发爬我们网站部分接口的爬虫,导致经常性带宽异常和服务异常,为了暂时性偷懒,写脚本自动封禁这些IP。
 思路和方法:
       经过日志排查,发现这些爬虫IP不多,但是并发很大,基本在10-20并发之间,正常的单IP请求几乎很少有10并发以上的,所以处理的思路就是
  使用iptables临时封禁这些异常IP,封禁规则每5分钟单IP请求量超过3000次,即5分钟内单IP并发超过10,封禁此IP,另外为了防止封错,脚本自动每    5分钟解禁5分钟前封禁的IP地址。
 实现:
       为了简单管理,使用shell+crontab实现脚本处理。
  脚本:
      
#!/bin/sh
##Author:bbzsxjj
##Email:bbzsxjj@163.com
##Usage:auto deny ip by iptables
##Ver:1.0
timenow=`date +'%H%M00'`
timelast=`date +'%H%M00' -d '-5min'`
lastnum=1000000  ##日志的行数,可以根据自己的业务频率选取
limitnum=3000      ##并发限制,300*10 
ipbin=/sbin/iptables
NeedDenyiplist=/opt/sbin/ipdeny.list
NeedPurgeiplist=/opt/sbin/ippurge.list
LogFile=/data/logs/haproxy.log
CreateList(){
  if [ -f ${LogFile} ] 
   then
     if [ -f ${NeedDenyiplist} ]
     then
       mv ${NeedDenyiplist} ${NeedPurgeiplist}
     fi
     tail -n${lastnum} ${LogFile}|awk '{gsub(/:/,"",$3);if($3>='${timelast}' && $3<='${timenow}'){a[$6]++}}END{for(i in a){if(a[i]>'${limitnum}'){print $6}}}' >>${NeedDenyiplist} ##这里需要根据日志的格式进行处理,具体的需要根据实际情况修改处理方法
   if [ `wc -l ${NeedDenyiplist}|awk '{print $1}'` -eq 0 ]
    then
      rm -rf ${NeedDenyiplist}
    fi 
   fi
  
}


DenyIP(){
 for Dip in `cat ${NeedDenyiplist}|grep -E -v '^$|#'`
     do
       ${ipbin} -I INPUT -s  ${Dip} -p tcp --dport 80 -j DROP
     done
}
PurgeIP(){
 for Dip in `cat ${NeedPurgeiplist}|grep -E -v '^$|#'`
     do
       ${ipbin} -D INPUT -s  ${Dip} -p tcp --dport 80 -j DROP
     done
}


main(){
  CreateList
  if [ -f ${NeedPurgeiplist} ]
  then
     PurgeIP
  fi
  if [ -f ${NeedDenyiplist} ]
  then
    DenyIP
  fi
}
main


之后添加crontab:
   ###denyip
    */5 * * * * /bin/sh /opt/sbin/denyip.sh >/dev/null 2>&1;


阅读(14085) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~