|
本帖最后由 guan6 于 2013-10-23 17:07 编辑
最近总有无聊的人尝试用户的账户密码,日志里留下一大堆的穷举记录。都是访问一个文件。因为是软件,所以速度很快,会导致网站访问速度下降!
所以写了下面的shell,分析日志找住这些ip,自动封掉,一小时后再解封;
注:日志为LUM默认格式,各位的日志格式可能会不同,根据自己的格式修改代码;
需求:
通过计划任务,每隔1分钟读取日志的最后1000条记录,符合以下条件的ip会被封掉。默认封锁一小时;
1、IP不在白名单中;
2、此ip的记录中不包含指定的关键字;
3、1000条记录中,此ip的记录数大于 100;
注:条件可以根据自己的需求修改;
脚本内容:
- #!/bin/sh
- #name:虫子
- #qq:405171253
- #mail:405171253@qq.com
- ip_add_time=`date +%s` #当前时间(秒)
- ip_return_time=3600 #IP被封锁时间(秒)
- ip_last_time=$[$ip_add_time+$ip_return_time] #解封时间
- log_file='/var/log/feng_ip.log' #日志文件位置
- ip_blank='127.0.0.1,192.168.1.1' #白名单 多个用","隔开
- web_log_array=('/home/hosts_log/1_access.log' '/home/hosts_log/2_access.log') #日志数组 多个地址用空格隔开
- web_log_len=${#web_log_array[@]} #数组长度
- php_cli='/usr/local/php_fcgi/bin/php' #设置php执行文件路径
- send_mail='/home/feng_ip/send_mail.php' #设置邮件发送文件路径
- if [ ! -f "$log_file" ];then
- touch $log_file
- fi
- #分析日志 封锁IP
- #读取每个日志最后的1000条 如果单ip记录大于100 封锁ip 并记录到日志
- #排除包含 jpg|gif|png 的行 多个用 | 隔开
- for (( x=0;x<$web_log_len;x++ ))
- do
- for i in `tail ${web_log_array[$x]} -n 1000 | awk '$10 !~ /jpg|gif|png/ {print $1}' | sort | uniq -c | sort -rn | awk '{if ($1>100){print $2}}'`
- do
- if [ `echo $ip_blank|grep -c $i` == 0 -a `cat $log_file|grep -c $i` == 0 ];then
- /sbin/iptables -I INPUT -s $i -j DROP
- echo $i,$ip_add_time,$ip_last_time >> $log_file
- $php_cli $send_mail 0 $i
- fi
- done
- done
- #读取日志文件,解封过期的IP,并在日志中删除记录
- for i in `cat $log_file | awk -F "," '{if ($3<'$ip_add_time'){print $1}}'`
- do
- /sbin/iptables -D INPUT -s $i -j DROP
- sed -i '/'$i'/d' $log_file
- $php_cli $send_mail 1 $i
- done
复制代码
使用:
解压feng_ip.tar,到任意目录;编辑 feng_ip.sh、send_mail.php,根据注释修改配置文件;
包含文件:email.class.php (php邮件类)、feng_ip.sh(shell脚本)、send_mail.php(发送邮件php)
加入计划任务:
- crontab -e
- #加入如下代码(记得修改文件位置)
- */1 * * * * /home/feng_ip/feng_ip.sh
复制代码
下载:
feng_ip.tar
(13.5 KB, 下载次数: 3598)
|
|