利用Web日志分析脚本找出恶意IP,并用iptables封杀该IP的方法

我们的服务器是标准的LAMP(CentOS + Apache + MySQL + PHP),平时经常接触Web日志,但是苦于Web日志量大,要是让我们人工看log文件一个一个的去找到恶意攻击IP貌似工作量太大,不太现实,那么我们就想到用shell脚本来做吧。下面就是用shell脚本分析Web日志,找出最近时间段的访问页面和IP排序,数据一目了然。

一、 Web日志分析脚本

#!/bin/bash
##web日志分析脚本

##华丽的分割线
split_line="--------------------------------------------------"
clear

##开始分析
echo -e "正在分析,请稍等..."

##设置时间分隔点
time_mark=$(awk '{print $4}' "/home/logs/xieyincai/access_`date '+%F'`.log" | cut -c 2-16 | sort | uniq | tail -n 3)

##日志分析
for mark in ${time_mark}
do
	time_format=$(echo $mark|awk 'BEGIN {FS="[/|:]"} {print $3"/"$2"/"$1"\t"$4":00-"$4":59"}')
	net_size=$(grep $mark "/home/logs/xieyincai/access_`date '+%F'`.log" | awk '{if($10 ~ /[0-9]/) sum += $10} END {printf("%0.2f\n",sum/1024/1024)}')
	top_ip=$(grep $mark "/home/logs/xieyincai/access_`date '+%F'`.log" | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 5)
	top_page=$(grep $mark "/home/logs/xieyincai/access_`date '+%F'`.log" | awk '{if($10>0 )print $7}' | sort | uniq -c | sort -rn | head -n 10)
	echo -e "${split_line}\n${time_format}   本时段流量:${net_size} MB"
	echo -e "   次数 访问者IP"
	echo -e "${top_ip}"
	echo -e "   次数 访问资源"
	echo -e "${top_page}"
done

如果只是统计最近的IP访问量排序,可以用以下脚本:(最近一万个访问IP排序,显示排名靠前的20个)

#!/bin/bash

top_ip=$(tail -n 10000 "/home/logs/xieyincai/access_`date '+%F'`.log" | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 20)
echo -e "${top_ip}"

二、 iptables封杀和解封IP

利用上面的Web日志分析脚本找出恶意IP,那就让我们用iptables来封杀它吧。在CentOS下,使用ipteables来维护IP规则表。要封停或者是解封IP,其实就是在IP规则表中对入站部分的规则进行添加操作。

要封停一个IP,使用下面这条命令:

[root@localhost workspace]# iptables -I INPUT -s 8.8.8.8 -j DROP

要解封一个IP,使用下面这条命令:

[root@localhost workspace]# iptables -D INPUT -s 8.8.8.8 -j DROP

参数-I是表示Insert(添加),-D表示Delete(删除)。后面跟的是规则,INPUT表示入站,8.8.8.8表示要封停的IP,DROP表示放弃连接。

此外,还可以使用下面的命令来查看当前的IP规则表:

[root@localhost workspace]# iptables --list

比如现在要将8.8.8.8这个IP封杀,就输入:

[root@localhost workspace]# iptables -I INPUT -s 8.8.8.8 -j DROP

要解封则将-I换成-D即可,前提是iptables已经有这条记录。

[root@localhost workspace]# iptables -D INPUT -s 8.8.8.8 -j DROP

如果要想清空封掉的IP地址,可以输入:

[root@localhost workspace]# iptables --flush

或者用以下命令(推荐):

[root@localhost workspace]# service iptables restart

要添加IP段到封停列表中,使用下面的命令:

[root@localhost workspace]# iptables -I INPUT -s 121.0.0.0/8 -j DROP

Leave a Reply

Your email address will not be published. Required fields are marked *