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