用nginx封ip,通过shell脚本将恶意访问的ip封禁

最近服务器被恶意攻击,顾将这些访问次数达到一定数值的ip使用nginx做封禁ip的操作。本文将使用shell脚本分析nginx生成的日志,自动封单个ip访问量大于指定值。

因为需要分析nginx的日志,所以我们需要将nginx的日志进行分割处理,因为日志太大,消耗的系统资源也就越多。日志分割可以按天分割,也可以按小时分割。我们的access.log是按天进行分割的。

  1. 首先选择一个目录,新建一个blockip.conf配置文件,用于屏蔽ip的文件。
  2. blockip.conf里面的内容即我们要屏蔽的ip,之后屏蔽的ip可以直接修改这个文件。内容格式为:

  3. 在nginx的nginx.conf中http段或者server段中引入拒绝访问的IP列表

    include /etc/nginx/vhost/blockip.conf;
    

     

  4. 编写shell脚本

    #!/bin/bash
    log_nginx="/var/log/nginx"
    block_file="/etc/nginx/vhost"
    
    #取出日志中符合条件的ip写入一个文件中
    grep "api/v1" $log_nginx/access.log | awk '{print $1}' | sort -rn |uniq -c |awk '{print $2}' > $log_nginx/ip.txt
     
    for ip in `cat $log_nginx/ip.txt`
    do
        result=$(grep $ip $block_file/blockip.conf)
     
    #判断ip是否被屏蔽
        if [ -z "$result" ]; then
     
    #计算出每个ip请求的次数
        count=$(grep $ip $log_nginx/access.log|grep "api/v1"|wc -l)
     
    #请求次数大于等于100次就进行屏蔽
            if [ $count -ge 100 ]; then
                echo "deny $ip;" >> $block_file/blockip.conf
            fi
        fi
    done
    
    # 重新加载nginx
    service nginx reload
    
  5. 写一个定时任务,自动执行脚本

    # 设置5分钟执行一次
    */5 * * * *     /etc/nginx/vhost/untitled.sh
    
    #7天清空一次
    0 0 */7 * *     cat /data/null > /etc/nginx/vhost/blockip.conf
    
  6. ip被封禁之后,效果如下:

                  

 

附:

blockip.conf格式还有许多种,可以配置只允许的IP访问或者IP段访问:

#屏蔽单个IP
deny IP; 
#允许一个ip
allow IP; 
#屏蔽所有
deny all; 
#允许所有
allow all; 

屏蔽单个ip

deny 139.71.83.6

屏蔽整个ip段即从139.0.0.1到139.255.255.254

deny 139.0.0.0/8

屏蔽ip段即从139.71.0.1到139.71.255.254

deny 139.71.0.0/16

屏蔽ip段即从139.71.83.1到139.71.83.254

deny 139.71.83.0/24

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值