LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: wwy

[原创]利用ip_conntrack表实现封ip的shell脚本,并有简单的web发布

[复制链接]
 楼主| 发表于 2005-8-22 15:21:36 | 显示全部楼层
实在是不好意思~  以为这种垃圾脚本不会有人看....谢谢各位了,代码可能是有些问题吧
本人能力有限,代码可能有些幼稚,而不实用,没什么编码风格,但如果能给想我一样正在学习shell的人们一些参考,是我的荣幸!

重新写了一遍:

  1. #!/bin/bash
  2. #
  3. #---------------------------------------------------------------------------------------
  4. #Scrip name: killip, base on ip_conntrack, write by wwy, at 2005-08-22 14:58:29
  5. #---------------------------------------------------------------------------------------

  6. [ "`ps ax | grep -v grep | grep $0 | wc -l`" -gt "2" ] && echo "It is running, sorry" && exit 1
  7. [ "`lsmod | grep ip_conntrack`" ] || modprobe ip_conntrack
  8. #
  9. dir=/tmp/killip
  10. tmp331=$dir/black_list-1.txt
  11. tmp332=$dir/black_list-2.txt
  12. tmp333=$dir/black_list-3.txt
  13. tmp221=$dir/tmp22-1.txt
  14. tmp222=$dir/tmp22-2.txt
  15. tmp223=$dir/tmp22-3.txt
  16. tmp331clr=$dir/tmp33-1-clr.txt
  17. tmp332clr=$dir/tmp33-2-clr.txt
  18. tmp333clr=$dir/tmp33-3-clr.txt
  19. tmp111=$dir/tmp111.txt
  20. tmp11=$dir/tmp11.txt
  21. ips=/proc/net/ip_conntrack
  22. ipc=$dir/ip_conntrack.tmp
  23. log=$dir/log.txt
  24. webdir=/var/www/html/wwy
  25. cpu=`sar -u 1 1 | awk '{print $7}' | tail -2`
  26. #
  27. [ ! -e $dir ] && mkdir -p $dir
  28. if [ ! -e $webdir/index.html ];then
  29.        mkdir -p $webdir
  30.        mkdir -p $webdir/all
  31.        mkdir -p $webdir/drop
  32.        touch $webdir/index.html
  33. fi

  34. #################################################################
  35. ##---------------------- functions ----------------------------##
  36. #################################################################

  37. function make_clr {
  38.         while read clr33;do
  39.                 cat $tmp111 | grep $clr33 >> $tmp333clr
  40.         done < $tmp333
  41.         while read clr22;do
  42.                 cat $tmp111 | grep $clr22 >> $tmp332clr
  43.         done < $tmp332
  44.         while read clr11;do
  45.                 cat $tmp111 | grep $clr11 >> $tmp331clr
  46.         done < $tmp331
  47. }
  48. function clr_conns {
  49.         S_IP=$1
  50.         D_IP=$2
  51.         S_PORT=$3
  52.         D_PORT=$4
  53.         hping2 $D_IP -R -s $S_PORT -p $D_PORT -a $S_IP -k -c > /dev/null 2>&1 &
  54. }
  55. function kill {
  56.         SLEEP_TIME=$1
  57.         CLR_LIST=$2
  58.         BLACK_LIST=$3
  59.         while read blackip;do
  60.                 iptables -I FORWARD -s $blackip/32 -j DROP
  61.         done < $BLACK_LIST
  62.         sleep $SLEEP_TIME
  63.         #-----------------------------------#
  64.         while read clr3;do
  65.                 clr_conns $clr3
  66.         done < $CLR_LIST
  67.         #-----------------------------------#
  68.         while read reblackip;do
  69.                 iptables -D FORWARD -s $reblackip/32 -j DROP
  70.         done < $BLACK_LIST

  71. }
  72. #################################################################
  73. ##--------------- To make a "black list" ----------------------##
  74. #################################################################


  75. > $tmp11
  76. > $tmp111
  77. > $ipc
  78. > $tmp333clr
  79. > $tmp332clr
  80. > $tmp331clr
  81. > $tmp223
  82. > $tmp222
  83. > $tmp221
  84. > $tmp333
  85. > $tmp332
  86. > $tmp331

  87. #----------------------------------------------------------------------------#
  88. cat $ips > $ipc
  89. sleep 1
  90. #----------------------------------------------------------------------------#
  91. wc=`cat $ipc|grep ESTABLISHED|awk -F= '{print $2,$3,$4,$5}'|grep ^172. |sort|awk '{print $1,$3,$5,$7}'|tee $tmp111|awk '{print $1}'|uniq -c|tee $tmp11|wc -l`
  92. date=`date '+%m/%d %H:%M'`
  93. cpu2=`sar -u 1 1 | awk '{print $7}' | tail -2`
  94. date2=`date '+%H'`
  95. #----------------------------------------------------------------------------#
  96. sleep 1
  97. #----------------------------------------------------------------------------#
  98. #if [ "$wc" -gt 2500 ] && [ "$date2" -gt 10 ]
  99. if [ "$wc" -gt 0 ];then
  100. #------------------------------
  101.         awk '{$1}{if ($1>30 && $1<50) print $2}' $tmp11 > $tmp221
  102.         awk '{$1}{if ($1>=50 && $1<100) print $2}' $tmp11 > $tmp222
  103.         awk '{$1}{if ($1>=100) print $2}' $tmp11 > $tmp223
  104.         cut -c1-15 $tmp221 > $tmp331
  105.         cut -c1-15 $tmp222 > $tmp332
  106.         cut -c1-15 $tmp223 > $tmp333
  107.         wcblackip1=`cat $tmp331 | wc -l`
  108.         wcblackip2=`cat $tmp332 | wc -l`
  109.         wcblackip3=`cat $tmp333 | wc -l`

  110. #################################################################
  111. ##---------------- To make a index.html -----------------------##
  112. #################################################################

  113. ### drop web ###
  114. cat > "$webdir/drop/index.html" << END
  115.         <b>If the total IPs >2500 <font color="#ff0000">(total $wc at $date)</font> AND if:</b>
  116.         <p>you connect <b>">100"</b>, you ip will be killed in <b>30min</b>.</p>
  117.         <p>you connect <b>"50-100"</b>, you ip will be killed in <b>15min</b>.</p>
  118.         <p>you connect <b>"30-50"</b>, you ip will be killed in <b>10min</b>.</p>
  119.         <hr color="#ff8000">
  120.         <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>
  121. END
  122. awk '{$1}{if ($1>=100) print $1, $2}' $tmp11|sort -nr|awk '{print "<p>""<font color="#ff0000">"$1"</font>""\t","<b>"$2"</b>""\t""kill 30min""</p>"}' >> $webdir/drop/index.html
  123. awk '{$1}{if ($1>=50 && $1<100) print $1, $2}' $tmp11|sort -nr|awk '{print "<p>"$1"\t","<b>"$2"</b>""\t""kill 15min""</p>"}' >> $webdir/drop/index.html
  124. awk '{$1}{if ($1>30 && $1<50) print $1, $2}' $tmp11|sort -nr|awk '{print "<p>"$1"\t","<b>"$2"</b>""\t""kill 10min""</p>"}' >> $webdir/drop/index.html

  125. ### all web ###
  126. cat > "$webdir/all/index.html" << END
  127.         <p><b>You can "ctrl + F" to find your ip's connects.(total $wc IPs at $date)</b></p>
  128.         <p><a href=../drop> <-- back </a></p>
  129. END
  130. cat $tmp11 | sort -nr | awk '{print "<p>"$1"\t",$2"\t""</p>"}' >> $webdir/all/index.html

  131. ################################################################
  132. ##----------------- Use iptables to DROP ---------------------##
  133. ################################################################

  134.         make_clr
  135.         [ -s $tmp333 ] && kill 30m $tmp333clr $tmp333 &
  136.         [ -s $tmp332 ] && kill 15m $tmp332clr $tmp332 &
  137.         [ -s $tmp331 ] && kill 10m $tmp331clr $tmp331 &

  138. #-------------------------------
  139. elif [ "$date2" -lt 5 ] && [ "$date2" -gt 3 ]
  140. then
  141.         while read clrall;do
  142.                 clr_conns $clrall
  143.         done < $tmp111
  144.         echo "clr at $date " >> /$logdir/$log
  145. fi

  146. ################################################################
  147. ##------------------- make system log ------------------------##
  148. ################################################################

  149. [ -e $log ] || touch $log
  150. echo "$wc $date $cpu $cpu2 $wcblackip3 + $wcblackip2 + $wcblackip1" >> $log
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表