# 创建自定义防火墙链(如果不存在) iptables -L $CHAIN_NAME &> /dev/null if [[ $? -ne 0 ]]; then echo"创建自定义链: $CHAIN_NAME" iptables -N $CHAIN_NAME # 确保 INPUT 链引用自定义链 iptables -I INPUT -j $CHAIN_NAME fi
# 提取日志中的 IP 地址并统计 echo"解析日志文件:$LOG_FILE" declare -A ip_counts whileread -r line; do # 从日志中提取 IP ip=$(echo"$line" | grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b') if [[ -n "$ip" ]]; then ip_counts["$ip"]=$((ip_counts["$ip"] + 1)) fi done < "$LOG_FILE"
# 遍历统计结果,筛选频率超过 $THRESHOLD 的 IP echo"筛选频率超过 $THRESHOLD 的 IP" blacklist_ips=() for ip in"${!ip_counts[@]}"; do if [[ ${ip_counts["$ip"]} -gt $THRESHOLD ]]; then blacklist_ips+=("$ip") fi done
# 去重并添加到黑名单文件 echo"将 IP 添加到黑名单文件并去重" for ip in"${blacklist_ips[@]}"; do if ! grep -q "^$ip$""$BLACKLIST_FILE"; then echo"$ip" >> "$BLACKLIST_FILE" fi done
# 遍历黑名单 IP,添加到防火墙中 echo"更新防火墙黑名单规则" for ip in"${blacklist_ips[@]}"; do ifecho"$existing_ips" | grep -wq "^$ip$"; then echo"IP 已在防火墙中:$ip" else echo"添加黑名单规则:$ip" iptables -A $CHAIN_NAME -s "$ip" -j DROP fi done