• CentOS7 自带防火墙+Nginx封堵高频访问的恶意IP


    1 调整时间格式

    首先:查看nginx的默认日志的时间格式

    时间格式是:[20/Oct/2022:10:06:45 +0800]

    这个格式在写shell脚本的时候,date命令无法识别,所以我们需要更改nginx默认的日期格式。

    开始调整nginx的日志时间格式,找到nginx的配置文件:

     

    需要修改日期格式,修改如下

    log_format json '{"@timestamp":"$time_iso8601",'
                        '"clientip":"$remote_addr",'
                        '"request":"$request",'
                        '"http_user_agent":"$http_user_agent",'
                        '"size":"$body_bytes_sent",'
                        '"responsetime":"$request_time",'
                        '"upstreamtime":"$upstream_response_time",'
                        '"upstreamhost":"$upstream_addr",'
                        '"http_host":"$host",'
                        '"url":"$uri",'
                        '"domain":"$host",'
                        '"referer":"$http_referer",'
                        '"status":"$status"}';
        access_log  /var/log/nginx/access.log  json;
        
       

    重新加载nginx的配置文件,使配置生效:

    先查找可执行文件nginx的位置:

    1. [root@VM-0-13-centos nginx]# whereis nginx
    2. nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz

    测试配置文件是否正确:

    1. [root@VM-0-13-centos nginx]# /usr/sbin/nginx -t
    2. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    3. nginx: configuration file /etc/nginx/nginx.conf test is successful

    is ok  就表示配置文件没有问题。

    重载使配置文件生效:

    [root@VM-0-13-centos nginx]# /usr/sbin/nginx -s reload

    再次查看nginx日志:

     

    编写封堵脚本

    1. #!/bin/bash
    2. #脚本详解:查询出nginx日志中访问量异常的ip进行封禁
    3. #方法有很多可以利用nginx的deny方法,也可以采用iptables
    4. #我这里采用centos7自带的firewalld
    5. #nginx日志位置
    6. nginx_access_log=/var/log/nginx/access.log
    7. ip=/var/log/nginx/ip.txt
    8. #一分钟内ip访问量统计排序
    9. cat /var/log/nginx/access.log | grep `date -d "1 minutes ago" +"%Y-%m-%d"T"%H:%M"`|awk -F '"' '{ print $8 }' |sort |uniq -c |sort -rn > ip.txt
    10. for i in `awk '{print $1}' ip.txt`
    11. do
    12. if [ $i -gt 300 ]; then #设置的阈值为一分钟300次,即平均每秒访问5次判定为黑客攻击,当然也可以按秒统计次数
    13. denyip=`grep $i ip.txt | awk '{print $2}'` # 找出IP
    14. #iptables -I INPUT -s $denyip -j DROP #利用iptables开始封堵
    15. firewall-cmd --permanent --add-rich-rule="rule family=ipv4 destination address=$denyip reject"
    16. #利用firewalld开始封堵
    17. firewall-cmd --reload #重新加载防火墙的热配置文件,使策略生效
    18. echo $denyip > denyip.txt #记录封堵结果
    19. fi
    20. done

    核心语句分析:

    1. cat /var/log/nginx/access.log | grep `date -d "1 minutes ago" +"%Y-%m-%d"T"%H:%M"`|awk -F '"' '{ print $8 }' |sort |uniq -c |sort -rn
    2. 1 150.223.27.195
    3. 1 114.118.7.124

    上面的执行结果分析:表示在执行脚本的前一分钟内,nginx日志的每个ip的访问次数,前面的数字就是访问次数,后面一列是访问的ip。

  • 相关阅读:
    python【模块】xml.etree.ElementTree 解析 xml
    数据结构复习
    凌恩生物文献分享 | 癌症领域新曙光——肿瘤内微生物
    SAP ABAP ALV+SMARTFORS 表分页 报表打印程序
    git_06_创建分支/查看分支
    拼多多第二季度表现亮眼,“贪便宜”的你贡献了多少?
    Python开发环境搭建
    【小实验1】比较ResNet、ViT、SwinTransformer的归纳偏置(然而并没有达到预期结果)
    “Method Not Allowed“,405问题分析及解决
    Git Bash/GUI Here “找不到应用程序问题
  • 原文地址:https://blog.csdn.net/eagle89/article/details/127422697