1. #!/bin/bash
    2. ################################################################################
    3. ####
    4. #根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
    5. ################################################################################
    6. ####
    7. logfile=/data/log/access.log
    8. #显示一分钟前的小时和分钟
    9. d1=`date -d "-1 minute" +%H%M`
    10. d2=`date +%M`
    11. ipt=/sbin/iptables
    12. ips=/tmp/ips.txt
    13. block()
    14. {
    15. #将一分钟前的日志全部过滤出来并提取IP以及统计访问次数
    16. grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips
    17. #利用for循环将次数超过100的IP依次遍历出来并予以封禁
    18. for i in `awk '$1>100 {print $2}' $ips`
    19. do
    20. $ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT
    21. echo "`date +%F-%T` $i" >> /tmp/badip.log
    22. done
    23. }
    24. unblock()
    25. {
    26. #将封禁后所产生的pkts数量小于10的IP依次遍历予以解封
    27. for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print
    28. $1}'|sort -nr`
    29. do
    30. $ipt -D INPUT $a
    31. done
    32. $ipt -Z
    33. }
    34. #当时间在00分以及30分时执行解封函数
    35. if [ $d2 -eq "00" ] || [ $d2 -eq "30" ]
    36. then
    37. #要先解再封,因为刚刚封禁时产生的pkts数量很少
    38. unblock
    39. block
    40. else
    41. block
    42. fi