stevenkoh 发表于 2012-06-23 16:18

防止SSH/ftp暴力检测的脚本

本帖最后由 stevenkoh 于 2012-06-24 07:04 编辑

总是有一些非常讨厌的人扫描我的服务器 只能屏蔽了之。研究了下,虽然有fail2ban这个工具,但好像搞得太大了些。自己写了一个,给大家共享

原贴发于 http://blog.csdn.net/stevenkoh/article/details/7686155

如有疑问,请CSDN提问,这里不定期更新


1.IPMonitor.sh

这个东西,每隔10分钟跑一次,如果有人多次攻击,自动屏蔽。屏蔽的IP超过了15分钟自动解锁。#!/bin/bash
export PATH=$PATH:/sbin:/usr/sbin

curbanIP=/tmp/curBanInputIps.txt
curLog=/tmp/curlogIn20mins.txt

taillines=2000
expiredMins=15
#15Mins

MaxRetries=20

IDWORD="IPMT10"

#Check expired rules
iptables -L INPUT -n --line-number| grep $IDWORD | awk '{print $1,$5,substr($8,8)}' | tac > $curbanIP

num=`cat $curbanIP | wc -l`
if [ $num -gt 0 ] ;then
        #>0
        exipredTMSTAMP=`date -d "$expiredMins min ago" +%s`
       
        cat $curbanIP | while read idx IP TMSTMP
        do       
                if [ $TMSTMP -gt $exipredTMSTAMP ] ;then
                        iptables -D INPUT $idx
                        #removed
                fi
        done
fi


#check the attacking IP

min1=`date -d '10 mins ago' '+%b %e %T'|cut -c1-11`
min2=`date '+%b %e %T'|cut -c1-11`

cat /var/log/secure | egrep "$min1|$min2" |grep 'authentication failure' | awk -F'rhost=' '{print $2}' | cut -d' ' -f1 | sort | uniq -c | awk '{if (length($2)>0) print $1,$2}' > $curLog
num=`cat $curLog | wc -l`
if [ $num -gt 0 ] ;then
        #>0
       
        cat $curLog | while read failtimes IP
        do       
                if [ $failtimes -gt $MaxRetries ] ;then
                        if ! [[ $IP =~ '^{1,3}\.{1,3}\.{1,3}\.{1,3}]] ; then
                                tmpIP=`ping -c1 -W1 $IP | head -n1 | cut -d'(' -f2 | cut -d')' -f1`
                                IP=$tmpIP
                        fi
                       
                        if ! iptables -L INPUT -n|grep $IP ; then
                                tmpStr=`date '+%F %T'`
                                tmpStmp=`date +%s`
                                iptables -A INPUT -s $IP -j DROP-m comment --comment "tmstmp:$tmpStmp ,add at $tmpStr,baned by $IDWORD"
                        fi                       
                fi
        done
fi


rm -f $curbanIP $curLog2. IPMonitorDaily.sh

跑了几天,发现几个变态IP,每隔45分钟折腾一次,持续了好几天。算下来折腾了2000多次,简直就是神经病,偷窥狂。只能再折腾一次#!/bin/bash

export PATH=$PATH:/sbin:/usr/sbin

curbanIP=/tmp/curBanInputIps.txt
curLog=/tmp/curPermanentIPS.txt

attacktimes=20

IDWORD="IPMTPERMANENT"

#Check expired rules
iptables -L INPUT -n --line-number| grep $IDWORD | awk '{print $1,$5,substr($8,8)}' | tac > $curbanIP

num=`cat $curbanIP | wc -l`
if [ $num -gt 0 ] ;then
        #>0       
        cat $curbanIP | while read idx IP TMSTMP
        do       
                if ! grep $IP /var/log/secure > /dev/null ;then
                        iptables -D INPUT $idx
                        #removed
                fi
        done
fi


#check the attacking IP

cat /var/log/secure | grep 'authentication failure' | awk -F'rhost=' '{print $2}' | cut -d' ' -f1 | sort | uniq -c | awk '{if ($1>100) print $2}' > $curLog

num=`cat $curLog | wc -l`
if [ $num -gt 0 ] ;then
        #>0       
        cat $curLog | while read IP
        do
                attackdays=`cat /var/log/secure | grep $IP | cut -c1-6 | uniq -c | wc -l`
                if [ $attackdays -gt 1 ] ;then

                        if ! iptables -L INPUT -n|grep $IP > /dev/null ; then
                                tmpStr=`date '+%F %T'`
                                tmpStmp=`date +%s`
                                iptables -A INPUT -s $IP -j DROP-m comment --comment "tmstmp:$tmpStmp ,add at $tmpStr,baned by $IDWORD"
                        fi                       
                       
                fi
        done
fi

rm -f $curbanIP $curLog


把以上两个放到crontab 里面,效果很好,一个10分钟跑一次。一个每天23:30跑一次 。终于都杀掉了

平时可以看看 iptables -L INPUT -n 看看效果。讨厌的IP都在里面。

以上脚本在CentOS 5.x 通过,转发请注明出处



希望大家有用处

zhangjiang 发表于 2012-06-27 22:39

留做备用:mrgreen:

ulovko 发表于 2012-07-01 19:52

感谢分享 ! ^_^ :emn31:

mengchang 发表于 2012-08-17 11:03

你联系方式吗,以后常交流.问下$IDWORD的值,从哪里得到的

联合中 发表于 2012-08-20 16:03

页: [1]
查看完整版本: 防止SSH/ftp暴力检测的脚本