服务器自动封禁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"