球球看世界

根据nginx错误日志,封恶意IP。

andy.zhang 2016年08月29日 编程脚本 693 评论关闭

需要两个脚本,一个是用来切割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处理。









已有1位网友发表了看法:

1#拎壶冲冲冲  2018-08-21 14:52:08 回复该评论
http://blog.51cto.com/13120271/p1?s=4

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

球球看世界

我的微信号:zxq138888888 (左侧二维码扫一扫)欢迎添加!

基于HP Gen8 搭建NAS,私云,BT下载