Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 使用 Shell 腳本分析 Nginx 日誌抵禦小規模 DDoS 攻擊

編輯:關於 Linux

前言

Linux Shell 腳本功能強大,可自動化分析 Nginx 存取日誌,針對小規模 DDoS 攻擊(如大量 POST 請求消耗資源)進行即時封鎖。本文介紹一個實用的 Shell 腳本範例,透過分析日誌識別攻擊 IP 並自動加入 iptables 封鎖清單。

腳本防禦邏輯

  1. 攻擊特徵:大量不同 IP 針對首頁發送 POST 請求,導致資源耗盡。
  2. 分析 Nginx 存取日誌,篩選 POST 請求並統計客戶端 IP 連線數。
  3. 將連線數超過閾值(預設 50)的 IP 判定為攻擊者。
  4. 將攻擊 IP 寫入封鎖清單檔案,避免重複封鎖。
  5. 每次執行前比對現有封鎖清單,僅新增新發現的攻擊 IP。
  6. 定期(每小時第 30 分鐘)歸檔舊日誌並重啟 Nginx 以釋放檔案鎖定。

核心腳本範例

#!/bin/bash
WEBSITES=(example.com)
minute_now=$(date +%M)
max_connections=50
banips="/wwwdata/jobs/banips.txt"

for site in "${WEBSITES[@]}"; do
    access_log_file="/wwwdata/logs/${site}.access.log"
    if [ -f "${access_log_file}" ]; then
        cat ${access_log_file} | grep POST | awk '{print $1}' | sort | uniq -c | sort -nr > /wwwdata/jobs/ip_records.txt
        lines=$(wc -l /wwwdata/jobs/ip_records.txt | awk '{print $1}')
        i=1
        while [ ${i} -le ${lines} ]; do
            ip_record=$(head -${i} /wwwdata/jobs/ip_records.txt | tail -1 | sed 's/^[ \t]*//g')
            ip_count=$(echo ${ip_record} | awk '{print $1}')
            ip_address=$(echo ${ip_record} | awk '{print $2}')
            if [ ${ip_count} -gt ${max_connections} ]; then
                banned=$(cat ${banips} | grep ${ip_address} | wc -l)
                if [ ${banned} -lt 1 ]; then
                    iptables -A INPUT -s ${ip_address} -p tcp -m state --state NEW -m tcp --dport 80 -j DROP
                    echo ${ip_address} >> ${banips}
                fi
            fi
            i=$((i+1))
        done
        service iptables save
        service iptables restart
        if [ ${minute_now} -eq 30 ]; then
            cat ${access_log_file} >> /wwwdata/logs/olds/${site}.access.log
            cat /dev/null > ${access_log_file}
        fi
    fi
done

if [ ${minute_now} -eq 30 ]; then
    service nginx restart
fi

部署與維護建議

  • 將腳本存為 /usr/local/bin/anti_ddos.sh 並賦予執行權限 (chmod +x)。
  • 透過 crontab -e 設定每分鐘執行一次:* * * * * /usr/local/bin/anti_ddos.sh。
  • 定期檢查 /wwwdata/jobs/banips.txt 確認封鎖清單,誤封 IP 可手動移除並執行 iptables -D INPUT -s -j DROP 解封。
  • 大規模攻擊建議搭配雲端 WAF 或硬體防火牆,Shell 腳本僅適用於小規模緩解。

結語

透過 Shell 腳本自動分析 Nginx 日誌並動態更新 iptables 規則,可有效緩解小規模 DDoS 攻擊帶來的資源耗盡問題,為伺服器提供第一道自動化防線。

Copyright © Windows教程網 All Rights Reserved