根据nginx错误日志,封恶意IP。
作者:andy.zhang | 分类:编程脚本 | 浏览:1964 | 日期:2016年08月29日需要两个脚本,一个是用来切割nginx日志,每小时生成一个新日志
另一个是生成deny ip的python脚本。要生效,python脚本后还需加
os.system('/etc/init.d/nginx reload')
第一个脚本代码:
#!/bin/bash
NGX_PID=//var/run/nginx.pid
NGINX_CMD=/usr/sbin/nginx
LOGS_DIR=/var/log/nginx
LOG_NAME=error.log
BLOCK_IP_FILE=/etc/nginx/conf.d/blockip.conf
cd $LOGS_DIR &&
#echo `date +%F-%H -d "last hour"`
mv $LOG_NAME $LOG_NAME-`date +%F%H -d "last hour"` &&
/bin/kill -USR1 $(cat $NGX_PID)
>$BLOCK_IP_FILE &&
$($NGINX_CMD -s reload)
#路径根据自己实际情况修改
第二个脚本代码:
#!/usr/bin/env python
import os
log_file=open('/var/log/nginx/error.log','r')
bket_file=open('/tmp/blocked-ip.txt','r')
bk_file=open('/tmp/block-ip.txt','w')
bk_file1=open('/tmp/block1-ip.txt','w')
line=log_file.readline()
while True:
if line == '':
bk_file.flush()
bk_file.close()
bk_file1.flush()
bk_file1.close()
log_file.close()
break
if 'client:' in line:
ip=''
for i in range(len(line)):
if line[i:i+7] == 'client:':
line1=line[i+7:]
#print line1,
for j in range(len(line1)):
if line1[j:j+1] == ',':
ip=line[i+7:i+j+7]
bk_file.write(ip+"\n")
bk_file1.write(ip+"\n")
break
if ip != '':
break
line=log_file.readline()
bk_file=open('/tmp/block-ip.txt','r')
#den=open('/etc/nginx/conf.d/blockip.conf','a')
line=bk_file.readline().lstrip().rstrip()
while True:
i=0
if line == '':
break
bk_file1=open('/tmp/block1-ip.txt','r')
line1=bk_file1.readline().lstrip().rstrip()
while True:
if line1 == '':
break
if line==line1:
i+=1
if i > 20:
den=open('/etc/nginx/conf.d/blockip.conf','r')
den_line=den.readline().lstrip().rstrip()
infile=1
while True:
if den_line == '':
break
if line in den_line:
infile=0
break
den_line=den.readline().lstrip().rstrip()
den.close()
if infile == 1:
den=open('/etc/nginx/conf.d/blockip.conf','a')
den.write("deny "+line.rstrip()+" ;\n")
den.flush()
den.close
break
line1=bk_file1.readline().lstrip().rstrip()
bk_file1.close()
line=bk_file.readline().lstrip().rstrip()
bk_file.close()
os.system('/etc/init.d/nginx reload')
在crontab里,把第一个脚本按每小时执行一次
第二个脚本每10分钟一次。另第二个脚本有一个
if i>20,里的20可以根据需要改大小。
这里代表,一小时内,如果一个IP出现20次错误,则
视同恶意IP,需要deny处理。