我们的服务器是标准的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