一 实验环境
鄙人使用的是centos 6.8操作系统 需要安装iptables(常见的linux系统貌似都会自动安装iptables)这条可以忽略 awk也需要安装没有的话就用yum装下吧
当然最重要的是web服务 我这里使用的是apache 对日志进行分析 当然你也可以分析其他的日志嘛 只是拿web服务来当例子而已
二 脚本介绍
使用的机制主要是对日志进行切片 对日志段进行分析 并写进防火墙规则中
为什么使用awk awk对文本处理速度比较快 而且语法相对简单
#!/bin/bash (1)
while true (2)
do
echo “`awk -v dateTime=”$datetimes” ‘{if($1==dateTime){i=1}if(i==1){dateArry[$1]++}} \
END{for(j in dateArry){printf “%s %s\n”,j,dateArry[j]}}’ /var/log/httpd/access_log`” \
| awk ‘{if($2>=20){system(“iptables -A INPUT -j REJECT -p tcp –dport 80 -s “$1)}}’
datetimes=`date +%y-%m-%d-%H-%M-%s` (3)
echo “$datetimes” >> /var/log/httpd/access_log (4)
sleep 30 (5)
done
(1)声明使用bash
(2)使用while循环
(3)datetimes=`date +%y-%m-%d-%H-%M-%s` 生成时间1.便于查看是什么时候产生的攻击2.相当于随机数避免产生重复
(4)将产生伪随机数写入到web服务的日志中
(5)这里可以自定义时间当然你也可以写到计划里边当然这一行也可以注释掉 (当然while循环也得注释掉如果你使用计划任务)当然我这里的30有点小你可以自己定制一下我主要是进行快速的测试
下面对awk部分进行分段分析
echo “`awk -v dateTime=”$datetimes
“‘{if($1==dateTime){i=1}if(i==1){dateArry[$1]++}} \ awk对日志文件进行分析 “↓” 对就是对小箭头指的这个文件如果第一个字段等于dateTime则开始计数 并赋予i一个值1 如果i=1 则对数组下标为dateArry[$1]的值进行+1
END{for(j in dateArry){printf “%s %s\n”,j,dateArry[j]}}’ /var/log/httpd/access_log`” \
END看到没有就在上边 等awk处理结束后 对处理的字段进行输出操作 遍历dateArry数组 输出IP地址(j 的值)和IP出现的次数( dateArry[j] 的值)
| awk ‘{if($2>=20){system(“iptables -A INPUT -j REJECT -p tcp –dport 80 -s “$1)}}’
看到最上边的echo没有 使用echo输出awk的值传递给另一个awk进行iptables的写规则操作
当然我这里是测试20这个值也是太小了 你可以根据实际环境进行修改 如果 IP出现的次数( dateArry[j] 的值)这个值大于20就讲这个所对应的ip写入到防火墙的规则里 使用system()函数” iptables -A INPUT -j REJECT -p tcp –dport 80 -s “$1 最后的 $1 输出IP地址(j 的值)就是将这个ip添加到拒绝的规则中
三 测试
运行脚本
疯狂刷新页面
查看日志
我刚开始故意等了一个疗程的
后边是几百条的日志信息
然后后查看防火墙规则
当我打开浏览器的时候他就这样了
原创文章,作者:wode,如若转载,请注明出处:http://www.178linux.com/74076