脚本内容


#!/bin/bash

# 日志文件路径
LOG_FILE="/var/log/nginx/access.log" # Fail2Ban 过滤器路径
FILTER_FILE="/etc/fail2ban/filter.d/nginx-http-auth.conf" # 记录黑名单的日志文件
BLACKLIST_LOG="./auto_defender_ban_ips.log" # 执行间隔
SLEEP_TIME=60 # 每分钟执行
while true; do
# 获取所有攻击 IP
ATTACK_IPS=$(fail2ban-regex "$LOG_FILE" "$FILTER_FILE" --print-all-missed | awk -F" " '{print $2}' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq)
echo $ATTACK_IPS for IP in $ATTACK_IPS; do
# 加入防火墙黑名单
firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$IP\" port port=\"443\" protocol=\"tcp\" reject"
# 检查是否成功添加规则
if [ $? -eq 0 ]; then
# 记录添加时间和 IP 到日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - Blocked IP: $IP" >> "$BLACKLIST_LOG"
else
echo "Failed to block IP: $IP" >> "$BLACKLIST_LOG"
fi
done # 重新加载防火墙规则
firewall-cmd --reload # 每次循环后等待 1 分钟
sleep $SLEEP_TIME
done

2025-06-05 升级版本

通过文件配置白名单:ip_white_list.txt,格式:每行一个ip地址。如果在白名单中有此ip, 自动移除规则,并跳过加入规则;

需要把以下两个脚本放到一个目录中,并运行 auto_defender.sh

manager_ip_white_list.sh

#!/bin/bash

IP_WHITE_LIST_FILE=ip_white_list.txt

function remove_white_ip()
{
if [[ ! -f "$IP_WHITE_LIST_FILE" ]];then
echo "ip白名单文件不存在: $IP_WHITE_LIST_FILE, 创建空文件"
touch $IP_WHITE_LIST_FILE
else
while IFS= read -r IP;do
if [[ -z "$IP" || "$IP" =~ ^# ]]; then
echo "$IP is empty or commented, skip.."
continue
fi
if ! [[ "$IP" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
echo "$IP format error, skip.."
continue
fi
echo "check IP:$IP firewall status"
if firewall-cmd --list-all | grep -q "$IP"; then
echo "发现 IP $IP 在防火墙规则中,正在移除规则..."
firewall-cmd --permanent --remove-rich-rule="rule family=\"ipv4\" source address=\"$IP\" port port=\"443\" protocol=\"tcp\" reject"
firewall-cmd --permanent --remove-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"80\" protocol=\"tcp\" reject"
fi
done < "$IP_WHITE_LIST_FILE"
firewall-cmd --reload
fi
} remove_white_ip

manager_ip_white_list.sh

#!/bin/bash

# 日志文件路径
LOG_FILE="/var/log/nginx/access.log" # Fail2Ban 过滤器路径
FILTER_FILE="/etc/fail2ban/filter.d/nginx-http-auth.conf" # 记录黑名单的日志文件
BLACKLIST_LOG="./auto_defender_ban_ips.log" # 执行间隔
SLEEP_TIME=60 IP_WHITE_LIST_FILE=ip_white_list.txt # 每分钟执行
while true; do # 自动删除白名单ip中的所有ip规则
bash manager_ip_white_list.sh # 获取所有攻击 IP
ATTACK_IPS=$(fail2ban-regex "$LOG_FILE" "$FILTER_FILE" --print-all-missed | awk -F" " '{print $2}' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq)
echo $ATTACK_IPS for IP in $ATTACK_IPS; do
if [[ -f "$IP_WHITE_LIST_FILE" ]];then
if grep -qFx "$IP" "$IP_WHITE_LIST_FILE"; then
echo "IP $IP 在白名单 ($IP_WHITE_LIST_FILE) 中,禁止将 IP 添加到防火墙!"
continue
fi
fi # 加入防火墙黑名单
firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$IP\" port port=\"443\" protocol=\"tcp\" reject"
firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$IP\" port port=\"80\" protocol=\"tcp\" reject"
# 检查是否成功添加规则
if [ $? -eq 0 ]; then
# 记录添加时间和 IP 到日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - Blocked IP: $IP" >> "$BLACKLIST_LOG"
else
echo "Failed to block IP: $IP" >> "$BLACKLIST_LOG"
fi
done # 重新加载防火墙规则
firewall-cmd --reload # 每次循环后等待 1 分钟
sleep $SLEEP_TIME
done

chatgpe脚本系列 - 分析nginx攻击日志,并自动加入防火墙黑名单的更多相关文章

  1. elk收集分析nginx access日志

    elk收集分析nginx access日志 首先elk的搭建按照这篇文章使用elk+redis搭建nginx日志分析平台说的,使用redis的push和pop做队列,然后有个logstash_inde ...

  2. 采集并分析Nginx访问日志

    日志服务支持通过数据接入向导配置采集Nginx日志,并自动创建索引和Nginx日志仪表盘,帮助您快速采集并分析Nginx日志. 许多个人站长选取了Nginx作为服务器搭建网站,在对网站访问情况进行分析 ...

  3. 使用hive分析nginx访问日志方法

    以下案例是使用hive分析nginx的访问日志案例,其中字段分隔通过正则表达式匹配,具体步骤如下: 日志格式: 192.168.5.139 - - [08/Jun/2017:17:09:12 +080 ...

  4. python脚本分析nginx访问日志

    日志格式如下: 223.74.135.248 [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" ...

  5. 利用GoAccess分析Nginx访问日志

    原文链接:https://blog.csdn.net/yown/article/details/56027112 需求:及时得到线上用户访问日志分析统计结果,以便给开发.测试.运维.运营人员提供决策! ...

  6. GoAccess安装及分析nginx实时日志

    GoAccess是一个基于终端的快速日志分析器.其核心思想是实时快速分析和查看Web服务器统计信息,而无需使用您的浏览器(如果您希望通过SSH快速分析访问日志,或者只是喜欢在终端中工作),终端输出是默 ...

  7. ELK7.4.0分析nginx json日志

    ELK7.4.0单节点部署 环境准备 安装系统,数据盘设置为/srv 内核优化参考 我们需要创建elk专用的账号,并创建所需要的目录并授权 useradd elk; mkdir /srv/{app,d ...

  8. 命令分析nginx访问日志的用法

    awk分析日志常用高级使用命令方法 分析访问日志(Nginx为例) 日志格式: '$remote_addr - $remote_user [$time_local] "$request&qu ...

  9. 使用 loki grafana 分析nginx 请求日志

    loki 是类似prometheus 的log 可视化展示.收集系统,已经集成在grafana 6.0 版本中了 说明: 测试环境使用了docker-compose 运行 环境准备 docker-co ...

  10. logstash 分析nginx 错误日志

    [root@dr-mysql01 frontend-error]# cat logstash_error.conf input { file { type => "zj_fronten ...

随机推荐

  1. Web前端入门第 10 问:HTML 段落标签( <p> )嵌套段落标签( <p> )的渲染结果会怎样?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 曾经有一个神奇的 bug 摆在我面前,为什么套娃一样的 HTML 语法,在段落标签 <p> 身上不生 ...

  2. 修改npm下载地址为淘宝镜像

    修改 npm 下载地址 修改为国内淘宝镜像 # 修改为新淘宝镜像(推荐) npm config set registry https://registry.npmmirror.com/ # 旧 npm ...

  3. 快速排序(NB)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ def partition(li, left, right): tmp = li ...

  4. ArrayList的常用成员方法

    1.ArrayList常用成员方法 可以大致分为4种,增 删 改 查 1.增 1.public boolean add(E e) 将括号里的元素直接添加到集合中,添加的元素按照顺序依次排列. 其中,E ...

  5. 【SpringCloud】微服务架构编码构建

    微服务架构编码构建 约定>配置>编码 Mysql的主从 slave会从master读取binlog来进行数据同步 三步骤+原理图 MySQL复制过程分成三步: master将改变记录到二进 ...

  6. Alpine

    ... 参考 Alpine包管理工具apk使用介绍 Alpine - Docker 从入门到实战

  7. 学习Linux只要学会这个命令就够了!

    大家好,我是良许. 这段时间又是搬家,又是找新办公室,现在终于安顿下来了,有时间给大家分享干货了. 今天给大家介绍一个 Linux 超级实用命令,有了这个命令,你就可以愉快使用 Linux 上几乎所有 ...

  8. shell子字符串截取

    http://c.biancheng.net/view/1120.html Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取. 从指定位置开始截取 这种方式需要 ...

  9. mybatis的模糊查询的实现方式

    一.比较灵活 1:xml的配置 <select id="selectUserByUsername1" parameterType="string" res ...

  10. Java并发并发编程实战-并发容器和同步工具类

    并发容器 ConcurrentHashMap 设计原理 分段锁(JDK 7) :将数据分成多个段(Segment),每个段独立加锁,不同段的操作可并行执行. CAS + synchronized(JD ...