淫荡的一天又开始了!!!

一个让银蛋疼的博客



linux上用iptables自动封ip的bash脚本 分享道

这个还是有一定效果的

先装iptables

下面的脚本保存为drop_ips.sh

  1. #! /bin/bash                                                                                                                                                   
  2.  
  3. ###########################################                                                                                                                    
  4. # 封锁ip 用iptables                                                                                                                                            
  5. # usage:                                                                                                                                                       
  6. #                                                                                                                                                              
  7. # create date 2010-11-11                                                                                                                                       
  8. # update date 2010-11-12                                                                                                                                       
  9. ###########################################                                                                                                                    
  10.  
  11.  
  12. # 定义端口                                                                                                                                                     
  13. CHK_PORT="80 25" 
  14.  
  15. # 定义输出文件                                                                                                                                                 
  16. IPTABLE_OUTPUT=/tmp/ip_drop_tables  
  17. # 定义输出文件备份  
  18. IPTABLE_OUTPUT_BAK=/tmp/ip_drop_tables.bak  
  19.  
  20. # 扫描ip的 间隔时间  
  21. SCAN_HTTP_IP_TIMEOUT=20  
  22.  
  23. # 处理ip的间隔时间  
  24. HANDLE_IP_TIMEOUT=120  
  25.  
  26. # 连接数量最大限制  
  27. MAX_CONNECT_IP_NUM=100  
  28.  
  29. # 排除在外的ip  
  30. ACCEPT_IP="203.95.110.2" 
  31.  
  32. # 已经封锁的ip   
  33. DROP_IP_RECORD_FILE=/tmp/drop_ip_record  
  34.  
  35. #################################################################  
  36. #定义方法  
  37. #################################################################  
  38. # 输出ip到文件  
  39. output_ip_table()  
  40. {  
  41.         # 拿到端口号  
  42.         port_num=$1  
  43.         # 查此端口上的连接ip 输出到指定的目录  
  44.         #echo "start scan ......"  
  45.         netstat -na --tcp| grep ESTABLISHED | awk '{ if ( index($4,":"'"$port_num"'"") ) print $5}' | awk -F ':' '{print $1}' | sort  >> $IPTABLE_OUTPUT  
  46.         #echo "scan end ......"  
  47. }  
  48.  
  49.  
  50. # 把需要观测端口列出                                                                                                                                                            
  51. check_port()  
  52. {  
  53.         for port_td in $CHK_PORT  
  54.         do 
  55.         # echo "port : "$port_td  
  56.             # 扫描此端口  
  57.         output_ip_table $port_td  
  58.     done  
  59. }  
  60.  
  61.  
  62. # 封杀ip  
  63. drop_ip_from_table()  
  64. {  
  65.     iptables -I INPUT -s "$1" -j DROP  
  66. }  
  67.  
  68. # 排除ip  
  69. accept_ip()  
  70. {  
  71.     for access_ip in $ACCEPT_IP  
  72.     do 
  73.         iptables -I INPUT -s "$access_ip" -j ACCEPT  
  74.     done  
  75. }  
  76.  
  77. # 提取需要的ip  
  78. get_iptable()  
  79. {  
  80.     # 如果已经存在就删除  
  81.     if [ -e $IPTABLE_OUTPUT_BAK ] ; then  
  82.         rm -rf $IPTABLE_OUTPUT_BAK  
  83.     fi  
  84.     # copy 一份出去   
  85.     cp $IPTABLE_OUTPUT $IPTABLE_OUTPUT_BAK  
  86.     # 排序 数组  
  87.     declare -a ip_array_org=($(cat ${IPTABLE_OUTPUT_BAK} | sort))  
  88.     # 循环  
  89.     # 比对用的ip 初始化  
  90.     tmp_ip=0.0.0.0  
  91.     let "tmp_ip_count=1" 
  92.     for tmp_element in "${ip_array_org[@]}" 
  93.     do            
  94.         # 初始化 没有特殊设置为排除ip  
  95.         is_not_set_accept="true" 
  96.         # 初始化 是否已封杀了  
  97.         is_not_drop="true" 
  98.         # 如果相等  
  99.         if [ "$tmp_ip" = "$tmp_element" ] ; then   
  100.             let "tmp_ip_count+=1" 
  101.         else              
  102.             # 打印  
  103.             echo "ip: $tmp_ip count: $tmp_ip_count"   
  104.             # 如果大于某个数字 就封杀  
  105.             if (( $tmp_ip_count >= $MAX_CONNECT_IP_NUM )) ; then  
  106.                 # 如果没有记录就封杀  
  107.                 if  cat /tmp/drop_ip_record | grep "$tmp_ip" > /dev/null   ; then  
  108.                     echo "this ip $tmp_ip has been mask !" 
  109.                     is_not_drop="false" 
  110.                 else      
  111.                     # 循环 需要排除ip  
  112.                         for tmp_access_ip in $ACCEPT_IP  
  113.                     do 
  114.                         # 如果排除ip里有 就去封锁此ip  
  115.                         if [ "$tmp_access_ip" = "$tmp_ip" ] ; then   
  116.                             echo "this ip $tmp_ip was mark to accept !" 
  117.                             is_not_set_accept="false" 
  118.                         fi  
  119.                     done   
  120.                 fi  
  121.                 if [ $is_not_set_accept = "true" ] && [ $is_not_drop = "true"] ; then  
  122.                     echo "add a new ip to drop : $tmp_ip" 
  123.                     drop_ip_from_table $tmp_ip  
  124.                     # 记录ip  
  125.                     echo "$tmp_ip" >> $DROP_IP_RECORD_FILE  
  126.                 fi  
  127.             fi  
  128.             # 归零  
  129.             let "tmp_ip_count=1" 
  130.             tmp_ip=$tmp_element  
  131.         fi  
  132.     done  
  133.     # 全部处理完了 删除原件  
  134.     rm -rf $IPTABLE_OUTPUT  
  135.     # 排除ip  
  136.     # accept_ip  
  137.       
  138. }  
  139.  
  140. # 扫描ip  
  141. scan_http_access_ip()  
  142. {  
  143.     # 获取当前时间作为开始时间  
  144.     start_time=`date +%s`  
  145.         # 循环开始    
  146.     while true 
  147.     do 
  148.         # 开始检查 扫描ip  
  149.         check_port  
  150.         # 线程停止  
  151.         sleep $SCAN_HTTP_IP_TIMEOUT  
  152.         # 获取当前时间  
  153.         cur_time=`date +%s`  
  154.         # 时间差  
  155.         let "time_out=$cur_time-$start_time" 
  156.         echo "time_out : "$time_out  
  157.         # 超过2分钟  
  158.         if (( $time_out >= $HANDLE_IP_TIMEOUT )) ; then  
  159.             # 整理一次ip表  
  160.             echo " times up"              
  161.             get_iptable           
  162.             # 重置开始时间  
  163.             start_time=`date +%s`  
  164.         fi  
  165.     done      
  166. }  
  167.  
  168. # 程序执行入口  
  169. main_app()  
  170. {  
  171.     # 定时扫描ip  
  172.     scan_http_access_ip  
  173. }  
  174.  
  175. main_app 

 

然后执行下面的脚本,让其自动在后台运行

 

  1. sh ~/scripts/drop_ips.sh &  

 


  2011, December 30, 6:39 PM [0] 评论 (10964 views)

上一篇 | 下一篇
发表评论

评论内容 (必填):


浏览本博请不要用淫荡的眼神和思想,谢谢合作
Browse this blog, please do not use the lustful eyes and thought, thank you

  


搜索文章

高级搜索

实用链接

站长工具

规则转换

在线翻译 云输入法 IP归属在线查询 --在线偷窥-- 云网盘