面對 CC 攻擊 (HTTP Flood)、惡意爬蟲刷新、API 濫用等應用層 DDoS 威脅,Apache 原生防護能力有限。mod_evasive 作為輕量級 Apache 模組,透過動態哈希表追蹤客戶端 IP 與請求 URI,能有效識別並阻斷異常存取行為。本文以 CentOS 7 + Apache 2.4 為例,詳述從原始碼編譯安裝、參數調優到防火牆聯動的完整實作流程。
模組維護內部哈希表,記錄每個 IP 對特定 URI 的請求頻率與並發數。當觸發以下任一條件,即回傳 403 Forbidden 並將 IP 加入黑名單:
DOSPageCount/DOSPageInterval)。註:mod_evasive 運作於使用者空間,受限於頻寬、CPU、記憶體與 Apache MPM 模型 (prefork/worker/event) 效能。大規模攻擊仍需前端防火牆/負載平衡器 (WAF、Rate Limiting、Anycast 清洗) 協同防禦。
# 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)
<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>
| 參數 | 預設值 | 調優方向 | 適用場景 |
|---|---|---|---|
| DOSHashTableSize | 3097 | 高併發站點調大 (質數: 65537、131071) | 大型電商、API 閘道 |
| DOSPageCount | 5 | 靜態資源多者適當放寬 (10-20);動態頁面嚴格 (3-5) | 視業務特性 |
| DOSSiteCount | 50 | 單頁應用 (SPA) 需調高 (100-200);傳統站點維持 | 前端架構差異 |
| DOSPageInterval / DOSSiteInterval | 2 秒 | 可微調 1-5 秒,平衡誤判與偵測靈敏度 | 一般情況 2 秒適中 |
| DOSBlockingPeriod | 10 秒 | 視攻擊持續性調整 (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)。
mod_remoteip 或 mod_rpaf 從 X-Forwarded-For 取得真實客戶端 IP,否則會誤封代理 IP 導致全站不可用。prefork 每進程一鎖,哈希表共享較好;worker/event 多執行緒需注意鎖競爭,高併發建議搭配 mod_evasive 2.0.1+ 版本改善的共享記憶體機制。logrotate 管理 DOSLogDir 避免磁碟佔滿。mod_evasive 以輕量、易部署、零成本特性,成為中小型站點與內部應用抵禦應用層洪水攻擊的首選利器。但請記住:它是「第二道防線」。生產環境務必配合邊緣清洗、WAF 規則、CDN 緩存與架構層面的彈性擴展,構建多層次、可觀測的 DDoS 防禦體系。