在下学习shell时间不长, 在此版中收益非潜, 增加了偶的学习积极性和学习效率
知道版主鼓励原创, 故在下发此贴支持版主工作
初来乍到, 还望各位高人指点. :thank
===============================================
基本原理:
通过过滤ip_conntrack表得到ESTABLISHED状态过多的ip, 然后用iptabels封掉一段时间,同时用hping工具将这些ip从表中清理掉,最后将被封的ip和一些其他信息写到一个html页中,做简单的发布
关于hping:
下载: http://www.hping.org/download.html
安装: ./configure;make;make install
相关联接: http://chinaunix.net/jh/4/367999.html
默认功能:
1, 当一个ip在ip_conntrack表中的ESTABLISHED状态在30-50之间时, 此ip被封10分钟,同时在ip_conntrack表中的记录被清除;50-100之间封15分钟,同时清表;100以上封30分钟,同时清表,
2, 然后生成web页
/var/www/html/wwy/drop/index.html --- 显示被封的ip, 和cpu状态等信息
/var/www/html/wwy/all/index.html --- 每一个ip的连接情况
3, 生成简单的日志
/tmp/killip/tmp.log.txt
使用方法:
1, 需要安装hping
2, 建议将脚本放到计划任务中
3, 建议安装并开启apache, 为支持简单的web发布,
默认为 http://127.0.0.1/l/wwy/drop/index.htm
4, 如果表的大小大于20mb请慎用
====================================================
- #!/bin/bash
- #
- #---------------------------------------------------------------------------------------
- #Scrip name: killip, base on ip_conntrack, write by wwy.
- #---------------------------------------------------------------------------------------
- cpu=`sar -u 1 1 | awk '{print $7}' | tail -1`%
- #
- while [ "`pidof sleep`" ];do
- echo "she is running, sorry"
- exit 1
- done
- if [ ! "`lsmod | grep ip_conntrack`" ]; then
- modprobe ip_conntrack
- fi
- ####################################
- ##---------------------- functions -----------------------------##
- ####################################
- function make_clr {
- while read clr33;do
- cat /tmp/tmp111.txt | grep $clr33 >> /tmp/tmp33-3-clr.txt
- done < /tmp/tmp33-3.txt
- while read clr22;do
- cat /tmp/tmp111.txt | grep $clr22 >> /tmp/tmp33-2-clr.txt
- done < /tmp/tmp33-2.txt
- while read clr11;do
- cat /tmp/tmp111.txt | grep $clr11 >> /tmp/tmp33-1-clr.txt
- done < /tmp/tmp33-1.txt
- }
- function clr_conns {
- S_IP=$1
- D_IP=$2
- S_PORT=$3
- D_PORT=$4
- hping2 $D_IP -R -s $S_PORT -p $D_PORT -a $S_IP -k -c 1 >/dev/null 2>/dev/null &
- }
- function kill() {
- SLEEP_TIME=$1
- CLR_LIST=$2
- BLACK_LIST=$3
- while read blackip;do
- iptables -I FORWARD 2 -i eth0 -s $blackip/32 -j DROP
- done < $BLACK_LIST
- sleep $SLEEP_TIME
- #-----------------------------------#
- while read clr3;do
- clr_conns $clr3
- done < $CLR_LIST
- #-----------------------------------#
- sleep 1
- while read reblackip;do
- iptables -D FORWARD -i eth0 -s $reblackip/32 -j DROP
- done < $BLACK_LIST
- }
- #####################################
- ##--------------- To make a "black list" ----------------------##
- #####################################
- echo > /tmp/tmp11.txt
- echo > /tmp/tmp111.txt
- echo > /tmp/ip_conntrack.tmp
- echo > /tmp/tmp33-3-clr.txt
- echo > /tmp/tmp33-2-clr.txt
- echo > /tmp/tmp33-1-clr.txt
- echo > /tmp/tmp22-3.txt
- echo > /tmp/tmp22-2.txt
- echo > /tmp/tmp22-1.txt
- echo > /tmp/tmp33-3.txt
- echo > /tmp/tmp33-2.txt
- echo > /tmp/tmp33-1.txt
- if [ ! -e /var/www/html/wwy/index.html ];then
- mkdir /var/www/html/wwy/
- mkdir /var/www/html/wwy/all
- mkdir /var/www/html/wwy/drop
- 5B
- touch /var/www/html/wwy/index.html
- fi
- #----------------------------------------------------------------------------#
- echo -e "cp /proc/net/ip_conntrack /tmp/ip_conntrack.tmp ......\c"
- cp /proc/net/ip_conntrack /tmp/ip_conntrack.tmp
- echo -e "done!\n"
- sleep 1
- #----------------------------------------------------------------------------#
- wc=`cat /tmp/ip_conntrack.tmp|grep ESTABLISHED|awk -F= '{print $2,$3,$4,$5}'|grep ^172. |sort|awk '{print $1,$3,$5,$7}'|tee /tmp/tmp111.txt|awk '{print $1}'|uniq -c|tee /tmp/tmp11.txt|wc -l`
- date=`date '+%m/%d %H:%M'`
- cpu2=`sar -u 1 1 | awk '{print $7}' | tail -1`%
- date2=`date '+%H'`
- #----------------------------------------------------------------------------#
- sleep 1
- #----------------------------------------------------------------------------#
- #if [ "$wc" -gt 2500 ] && [ "$date2" -gt 10 ]
- if [ "$wc" -ge 0 ]
- then
- #------------------------------
- awk '{$1}{if ($1>30 && $1<50) print $2}' /tmp/tmp11.txt > /tmp/tmp22-1.txt
- awk '{$1}{if ($1>=50 && $1<100) print $2}' /tmp/tmp11.txt > /tmp/tmp22-2.txt
- awk '{$1}{if ($1>=100) print $2}' /tmp/tmp11.txt > /tmp/tmp22-3.txt
- cut -c1-15 /tmp/tmp22-1.txt > /tmp/tmp33-1.txt
- cut -c1-15 /tmp/tmp22-2.txt > /tmp/tmp33-2.txt
- cut -c1-15 /tmp/tmp22-3.txt > /tmp/tmp33-3.txt
- wcblackip1=`cat /tmp/tmp33-1.txt | wc -l`
- wcblackip2=`cat /tmp/tmp33-2.txt | wc -l`
- wcblackip3=`cat /tmp/tmp33-3.txt | wc -l`
- ######################################
- ##---------------- To make a index.html -----------------------##
- ######################################
- echo "<b>If the total IPs >2500 <font color="#ff0000">(total $wc at $date)</font> AND if:</b>" > /var/www/html/wwy/drop/index.html
- echo "<p>you connect <b>">100"</b>, you ip will be killed in <b>30min</b>.</p>" >>/var/www/html/wwy/drop/index.html
- echo "<p>you connect <b>"50-100"</b>, you ip will be killed in <b>15min</b>.</p>" >>/var/www/html/wwy/drop/index.html
- echo "<p>you connect <b>"30-50"</b>, you ip will be killed in <b>10min</b>.</p>" >>/var/www/html/wwy/drop/index.html
- echo "<hr color="#ff8000">" >> /var/www/html/wwy/drop/index.html
- echo "<p><b><font color="#ff0000">These IPs (total $wcblackip3 + $wcblackip2 + $wcblackip1) were killed, at <font size=5>$date</font></font> <a href=../all>(look-up all IPs)</a></b></p>" >> /var/www/html/wwy/drop/index.html
- awk '{$1}{if ($1>=100) print $1, $2}' /tmp/tmp11.txt|sort -nr|awk '{print "<p>""<font color="#ff0000">"$1"</font>""\t","<b>"$2"</b>""\t""kill 30min""</p>"}' >> /var/www/html/wwy/drop/index.html
- awk '{$1}{if ($1>=50 && $1<100) print $1, $2}' /tmp/tmp11.txt|sort -nr|awk '{print "<p>"$1"\t","<b>"$2"</b>""\t""kill 15min""</p>"}' >> /var/www/html/wwy/drop/index.html
- awk '{$1}{if ($1>30 && $1<50) print $1, $2}' /tmp/tmp11.txt|sort -nr|awk '{print "<p>"$1"\t","<b>"$2"</b>""\t""kill 10min""</p>"}' >> /var/www/html/wwy/drop/index.html
- echo "<p><b>You can "ctrl + F" to find your ip's connects.(total $wc IPs at $date)</b></p>" > /var/www/html/wwy/all/index.html
- echo "<p><a href=../drop> <-- back </a></p>" >> /var/www/html/wwy/all/index.html
- cat /tmp/tmp11.txt | sort -nr | awk '{print "<p>"$1"\t",$2"\t""</p>"}' >> /var/www/html/wwy/all/index.html
- #####################################
- ##----------------- Use iptables to DROP ---------------------##
- #####################################
- make_clr
- if [ -s /tmp/tmp33-3.txt ];then
- kill 30m /tmp/tmp33-3-clr.txt /tmp/tmp33-3.txt &
- sleep 1s
- fi
- if [ -s /tmp/tmp33-2.txt ];then
- kill 15m /tmp/tmp33-2-clr.txt /tmp/tmp33-2.txt &
- sleep 1s
- fi
- if [ -s /tmp/tmp33-1.txt ];then
- kill 10m /tmp/tmp33-1-clr.txt /tmp/tmp33-1.txt &
- sleep 1s
- fi
- #-------------------------------
- elif [ "$date2" -lt 5 ] && [ "$date2" -gt 3 ]
- then
- while read clrall;do
- clr_conns $clrall
- done < /tmp/tmp111.txt
- echo "clr at $date " >> /tmp/killip/tmp.log.txt
- fi
- #####################################
- ##------------------- make system log ------------------------##
- #####################################
- if [ ! -e /tmp/killip/tmp.log.txt ]; then
- mkdir /tmp/killip
- touch /tmp/killip/tmp.log.txt
- fi
- echo "$wc $date $cpu $cpu2 $wcblackip3 + $wcblackip2 + $wcblackip1" >> /tmp/killip/tmp.log.txt
复制代码 |