在网上也看到过iptables黑白名单的脚本,拿下来都不符合,现在写了个自动黑白名单的脚本,已经在线上跑的了,有兴趣的朋友可以拿去试下。

脚本是相对简单的

1、因为crontab任务是按分来执行任务的,所以写一个每秒都执行任务的脚本,脚本如下,脚本名为“ipt.sh”

 

#!/bin/bash

SLEEPTIME=5

CONN=150

 

iptables_drop()

{

netstat -an| grep :80 | grep -v 127.0.0.1 |grep ESTABLISHED |awk '{ print $5 }' | sort|awk -F: '{print $1,$4}' | uniq -c | awk '$1>150 {print $1,$2}' > /root/black.txt

 

[ -z /root/black.txt ] && exit 0

 

for i in `awk '{print $2}' /root/black.txt`

do

    for lm in `grep "\<$i\>" /root/black.txt | awk '{print $1}'`

    do

    two=`grep "\<$i\>" /root/bak.txt` 

    if [ "$i" != "$two" ]; then

        [ $lm -gt $CONN ] && grep "\<$i\>" /root/work.txt > /dev/null

        if [ $? -ne 0 ]; then

            echo $i >> /root/bak.txt;

            /sbin/iptables -I INPUT -p tcp -s $i --dport 80 -j DROP; 

            echo "/sbin/iptables -D INPUT -p tcp -s $i --dport 80 -j DROP" | at `date -d '+20 minutes' +%H:%M`  && \

            echo "sed -i \"/\<$i\>/d\" /root/bak.txt" | at `date -d '+20 minutes' +%H:%M`

        fi

    fi

    done

    sleep 1

done

}

 

while true; do

    iptables_drop

    sleep $SLEEPTIME

done

 

详细:具体操作方法在/home/script下建立ipt.sh脚本,在/root目录下建个work.txt文件,里面写着白名单ip,这样这个白名单ip访问量再大也不会被X掉了,一般正常的访问量,单1秒的时间里同一个ip 过来的连接不会有超过150个的,所以判断1秒时间里web的连接数超过150个,直接用iptables拉黑,然后再用at任务在一定时间里将其还原,我这里设置为20分钟,基本上就是这样了......如那位朋友还有好的方案,可以拿出来一起分享,技术因为分享而快乐,呵呵