萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 病毒防護

Apache 防禦惡意刷新與 DDoS 實戰:mod_evasive 部署與調優完整指南

面對 CC 攻擊 (HTTP Flood)、惡意爬蟲刷新、API 濫用等應用層 DDoS 威脅,Apache 原生防護能力有限。mod_evasive 作為輕量級 Apache 模組,透過動態哈希表追蹤客戶端 IP 與請求 URI,能有效識別並阻斷異常存取行為。本文以 CentOS 7 + Apache 2.4 為例,詳述從原始碼編譯安裝、參數調優到防火牆聯動的完整實作流程。

mod_evasive 核心偵測邏輯

模組維護內部哈希表,記錄每個 IP 對特定 URI 的請求頻率與並發數。當觸發以下任一條件,即回傳 403 Forbidden 並將 IP 加入黑名單:

  1. 同一頁面單位時間請求數超過閾值 (DOSPageCount/DOSPageInterval)。
  2. 同一子進程處理的並發請求超過 50 次 (硬編碼閾值)。
  3. 已被列入黑名單的 IP 持續發送請求。

註:mod_evasive 運作於使用者空間,受限於頻寬、CPU、記憶體與 Apache MPM 模型 (prefork/worker/event) 效能。大規模攻擊仍需前端防火牆/負載平衡器 (WAF、Rate Limiting、Anycast 清洗) 協同防禦。

原始碼編譯安裝步驟 (CentOS 7 / Apache 2.4)

# 1. 安裝編譯工具鏈與 Apache 開發套件
yum install -y gcc httpd-devel make wget

# 2. 取得最新原始碼 (官方 GitHub 或作者網站)
cd /usr/local/src
wget https://github.com/jzdziarski/mod_evasive/archive/refs/tags/1.10.1.tar.gz -O mod_evasive_1.10.1.tar.gz
tar -zxvf mod_evasive_1.10.1.tar.gz
cd mod_evasive-1.10.1

# 3. 使用 apxs 動態編譯安裝 (Apache 2.4 使用 mod_evasive24.c)
/usr/bin/apxs -i -a -c mod_evasive24.c

# 4. 驗證模組載入
httpd -M | grep evasive
# 應顯示 evasive24_module (shared)

建議生產環境配置範例 (/etc/httpd/conf.d/mod_evasive.conf)

<IfModule mod_evasive24.c>
    # 哈希表大小 (質數較佳),高流量站點可調大至 65537
    DOSHashTableSize    3097

    # 同一頁面允許請求次數 / 間隔秒數
    DOSPageCount        5
    DOSPageInterval     2

    # 同一站點總請求數 / 間隔秒數
    DOSSiteCount        50
    DOSSiteInterval     2

    # 黑名單封鎖秒數 (期間內回傳 403)
    DOSBlockingPeriod   10

    # 選用:攻擊通知郵件 (需系統支援 mailx/sendmail)
    DOSEmailNotify      security@yourdomain.com

    # 選用:觸發系統指令 (如呼叫防火牆 API 永久封鎖)
    # DOSSystemCommand   "/usr/local/bin/block_ip.sh %s"

    # 選用:攻擊日誌目錄 (需 Apache 寫入權限)
    DOSLogDir           "/var/log/mod_evasive"
</IfModule>

參數調優建議

參數預設值調優方向適用場景
DOSHashTableSize3097高併發站點調大 (質數: 65537、131071)大型電商、API 閘道
DOSPageCount5靜態資源多者適當放寬 (10-20);動態頁面嚴格 (3-5)視業務特性
DOSSiteCount50單頁應用 (SPA) 需調高 (100-200);傳統站點維持前端架構差異
DOSPageInterval / DOSSiteInterval2 秒可微調 1-5 秒,平衡誤判與偵測靈敏度一般情況 2 秒適中
DOSBlockingPeriod10 秒視攻擊持續性調整 (30-300 秒);過長影響正常用戶配合前端 WAF 封鎖

壓力測試驗證效果

# 安裝 ab (ApacheBench) 或使用 wrk、hey 等現代工具
yum install -y httpd-tools

# 模擬單 IP 高頻請求同一頁面
ab -n 100 -c 10 https://your-server/test.html

# 觀察回應碼:前幾十次 200 OK,後續應轉為 403 Forbidden
# 檢查錯誤日誌 /var/log/httpd/error_log 應見 "client denied by mod_evasive"

進階:與防火牆聯動實現永久封鎖

DOSSystemCommand 可呼叫腳本將攻擊 IP 寫入 iptables/firewalld/ipset 或呼叫雲端防火牆 API (AWS Security Group、Cloudflare Firewall Rules),實現邊緣永久封鎖,減輕 Apache 負載。腳本範例:

#!/bin/bash
# /usr/local/bin/block_ip.sh
ATTACKER_IP=$1
# 避免重複封鎖
if ! iptables -C INPUT -s $ATTACKER_IP -j DROP 2>/dev/null; then
    iptables -I INPUT -s $ATTACKER_IP -j DROP
    logger -t mod_evasive "Permanently blocked $ATTACKER_IP via DOSSystemCommand"
fi

記得設定腳本執行權限 chmod +x,並確保 Apache 執行用戶 (通常是 apache) 有 sudo 權限執行 iptables (透過 /etc/sudoers.d/mod_evasive 配置 apache ALL=(root) NOPASSWD: /usr/sbin/iptables)。

常見問題與注意事項

  • 反向代理/負載平衡器後方:Apache 看到的來源 IP 為代理 IP,需配合 mod_remoteip 或 mod_rpaf 從 X-Forwarded-For 取得真實客戶端 IP,否則會誤封代理 IP 導致全站不可用。
  • MPM 模型影響:prefork 每進程一鎖,哈希表共享較好;worker/event 多執行緒需注意鎖競爭,高併發建議搭配 mod_evasive 2.0.1+ 版本改善的共享記憶體機制。
  • 白名單機制:模組原生不支援白名單,需自行修改原始碼或前端 WAF/防火牆層面實施豁免 (如監控系統、搜尋引擎爬蟲 IP)。
  • 日誌輪轉:配置 logrotate 管理 DOSLogDir 避免磁碟佔滿。

mod_evasive 以輕量、易部署、零成本特性,成為中小型站點與內部應用抵禦應用層洪水攻擊的首選利器。但請記住:它是「第二道防線」。生產環境務必配合邊緣清洗、WAF 規則、CDN 緩存與架構層面的彈性擴展,構建多層次、可觀測的 DDoS 防禦體系。

copyright © 萬盛學電腦網 all rights reserved