chatgpe脚本系列 - 分析nginx攻击日志,并自动加入防火墙黑名单

脚本内容


#!/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
        all_firewall_rules=`firewall-cmd --list-all`
        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 echo $all_firewall_rules | 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

auto_defender.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

添加白名单脚本:add_white_ip.sh

#!/bin/bash
IP=$1

function Usage()
{
    echo -e "Usage:$0 [ip]"
    exit 0
}

if [[ $IP == "" ]];then
    Usage
fi

if ! [[ "$IP" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
    echo -e "Error! $IP 格式不正确,请检查 IP 格式(只支持ipv4)"
    exit 0
fi

file=ip_white_list.txt

if [[ -f "$file" ]];then
    if grep -qFx "$IP" "$file"; then
        echo -e  "IP $IP 已在白名单 ($file) 中,无需重复添加"
        
        echo -e "\n------ $file ------"
        cat $file
        exit 0
    fi
fi


echo $IP >> $file

echo "add success"

echo -e "\n------ $file ------"
cat $file
posted @ 2025-06-05 17:09  BrianSun  阅读(116)  评论(0)    收藏  举报