25 September 2014

nginx默认会记录客户端访问服务端的日志,默认的目录位于:/var/logs/access.log; 业务需求:每小时读取access.log内容,统计每个ipd访问系统次数,如果超过指定次数,则将该ip加入到防火墙中,以便禁止其继续访问(后续可以考虑不是禁止其访问服务,而是重定向到指定的页面)。这样避免别人恶意从自己网站上抓取数据

#-*-coding:utf8 -*-
import logging,datetime,os,sys,string,re
reload(sys)
sys.setdefaultencoding('utf8')
logging.basicConfig(level=logging.DEBUG, \
                    format='%(asctime)s %(levelname)s- %(message)s', \
            filename='/data/analyse.log', \
                    datefmt='%m-%d %H:%M', \
                    )
#单位时间内允许最大有效访问次数
maxallowednum=500
ipDic={}
pip = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
ptime = re.compile('[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}')
logfilepath = '/var/log/nginx/access.log'
#该文件记录上次访问到的日志行数
tmpfilepath ='/data/tmp'

linenum = string.atoi(open(tmpfilepath,'r').read())
#读取文件总行数,如果总行数小于tmp文件中记录的行数,说明该日志文件微新增的日志文件,则需要从第一行开始读取
loglinenum = len(open(logfilepath,'rU').readlines())
if(loglinenum=linenum):
        #print line
     mip = pip.search(line)
     #mtime = ptime.search(line)
     if mip:
         ip = mip.group()
             #将每个ip的有效请求存放在ipDic字典中
         if(line.find('/static/')==-1):
             if(ipDic.has_key(ip)):
                 ipDic[ip] = ipDic[ip]+1
                 else:
             ipDic[ip] = 1

         #times = mtime.group()
         #logging.debug('%s' %(ip))

    line=logfile.readline()
    index+=1

logging.debug('new line num:%i'%(index))
tmpfile.write(str(index))
tmpfile.close()
logfile.close()
#循环ip字典,将其中访问次数超过最大允许访问次数的ip加入到防火墙,禁止其继续访问
for k,v in ipDic.items():
    if(v>=maxallowednum):
        logging.debug('ip:%s visited %i times,add to iptables' %(k,v))
        os.system('iptables -I INPUT 1 -s '+k+' -j DROP')
    else:
    logging.debug('ip:%s visited %i times' %(k,v))

logging.debug('-------------------------over------------------------------');




Fork me on GitHub