服务器自动封禁ip脚本

作者: 搬砖日记
服务器自动封禁ip脚本
#!/bin/bash

LOG_PATH="/usr/local/nginx/logs/access.log"
BLACKLIST_FILE="/usr/local/nginx/conf/default.d/deny_nginx.conf"
TMP_IP_FILE="/root/all_suspicious_ips_1000.txt"
LINES=5000  # 检查的日志行数
THRESHOLD=10    # 攻击次数阈值

echo "[*] 正在分析最近 $LINES 行 Nginx 日志..."

# 1. 提取攻击关键词的 IP
tail -n $LINES "$LOG_PATH" | \
grep -Ei "wget|curl|base64|eval|union|select|insert|cmd=|/etc/passwd|../../|shell|php" | \
awk '{print $1}' | sort | uniq -c | sort -nr > "$TMP_IP_FILE"

if [ ! -s "$TMP_IP_FILE" ]; then
    echo "[+] 未发现可疑 IP,无需封禁。"
    exit 0
fi

# 2. 创建黑名单文件(如果没有)
if [ ! -f "$BLACKLIST_FILE" ]; then
    touch "$BLACKLIST_FILE"
fi

echo "[*] 满足封禁条件(次数 ≥ $THRESHOLD)的 IP:"

while read count ip; do
    if [ "$count" -ge "$THRESHOLD" ]; then
        if grep -q "deny $ip;" "$BLACKLIST_FILE"; then
            echo "[-] $ip 已在黑名单中($count 次),跳过。"
        else
            echo "[+] 封禁 $ip(攻击次数:$count)"
            echo "deny $ip;" >> "$BLACKLIST_FILE"
        fi
    fi
done < "$TMP_IP_FILE"

# 4. 检查并重载 Nginx
echo "[*] 检查 Nginx 配置..."
if /usr/local/nginx/sbin/nginx -t; then
    echo "[*] 配置无误,重新加载 Nginx..."
    /usr/local/nginx/sbin/nginx -s reload && echo "[+] Nginx 已重新加载。"
else
    echo "[!] Nginx 配置错误,请手动检查!"
fi

# 5. 清理
rm -f "$TMP_IP_FILE"