Linux运维之路


tomcat自动封IP与解封脚本

admin 2019-06-23 459浏览 0条评论
首页/正文
分享到: / / / /

研究半天,记录一下

检查log文件格式:

-rw-r----- 1 root root  1583309 Jun 22 23:58 tomcat_access_log.2019-06-22.log
-rw-r----- 1 root root   391877 Jun 23 07:46 tomcat_access_log.2019-06-23.log

找到access访问日志,里面记录了访问IP 通过命令去除重复,取出当天日志一段时间内访问次数过多的IP 写入文件,通过iptables结合 丢弃指定 访问者的请求,达到禁止访问目的 脚本参考部分大神思路

取日志ip:

#将指定时间内日志写入到文件
ls $log | egrep  "$shijian" >/tmp/tmp_last_min.log  


#tmp_last_min.log 日志样式:

{"clientip":"115.193.170.253","ClientUser":"-","authenticated":" -","AccessTime":"[01/May/2019:00:00:59 +0800]","method":"GET /article/18.html?t=1556629891152 HTTP/1.1","status":"200","SendBytes":" 38756","Query?string":"?t=1556629891152","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}


#awk取出IP
awk '{print $1}'  /tmp/tmp_last_min.log |awk -F '[:"]' '{print $6}'




#!/bin/bash
#用途:防止DDos攻击,将访问量超过70的IP地址禁掉
#作者:陈雷雷
#日期:2019年06月21日

t1=$(date +%F -d "-1day")


log='/application/tomcat/logs/tomcat_access_log.*.log'
shijian=$(date +%d\/\%b\/%Y)

block_ip()
{
    ls $log | egrep  "$shijian" >/tmp/tmp_last_min.log
    egrep  $shijian $log >/tmp/tmp_last_min.log

    #把一分钟内访问量高于100的ip地址记录到一个临时文件中。
    #awk '{print $1}'  /tmp/tmp_last_min.log |awk -F '[:"]' '{print $6}'| sort -n | uniq -c | awk '$1>70 {print $2}' >/tmp/bad_ip.list
    awk '{print $1}'  /tmp/tmp_last_min.log |awk -F '[:"]' '{print $6}'| sort -n | uniq -c | awk '$1>20 {print $2}' >/tmp/bad_ip.list

    #计算ip的数量
    n=`wc -l /tmp/bad_ip.list | awk '{print $1}'`

    #当ip数大于0时,才会用iptables封掉。
    if [ $n -ne 0 ]
    then
        for ip in `cat /tmp/bad_ip.list`
        do
           iptables -I INPUT -s $ip -j REJECT
        done

       #将这些被封的ip记录到日志里
       echo "`date` 封掉的ip有: "  >> /tmp/black_ip.log
       echo /tmp/bad_ip.list  >> /tmp/black_ip.log
   fi
 }

unblock_ip ()
{
    #首先将包括个数小于5的ip记录到一个临时文件里,把它们标记为白名单IP

    iptables -nvL INPUT | sed '1d' | awk '$1<5 {print $8}' > /tmp/good_ip.list
   n=`wc -l  /tmp/good_ip.list | awk '{print $1}'`
    if [ $n -ne 0 ]
    then
        for ip in `cat  /tmp/good_ip.list`
        do
            iptables -D INPUT -s $ip -j REJECT
        done
        echo "`date` 解封的ip有:"  >>  /tmp/unblock_ip.log
        cat   /tmp/good_ip.list  >> /tmp/unblock_ip.log
    fi
    #当解封完白名单ip后,将计数清零,进入下一个计数周期
    iptables  -Z
}

#取当前时间的分钟数

t=`date  +%M`
#当分钟数内为00或者30时(即每隔30分钟),执行解封ip的函数,其他时间执行解封ip的函数。

if [  $t  == "00" ] || [ $t == "30" ]
then
      unblock_ip
      block_ip
else
      block_ip

fi
                                  
最后修改:2019-06-23 07:46:00 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

评论列表

还没有人评论哦~赶快抢占沙发吧~