Debian Apache 伺服器防禦攻擊

回覆文章
Brave Ye
系統管理員
文章: 5002
註冊時間: 2025-11-08, 13:32
聯繫:

Debian Apache 伺服器防禦攻擊

文章 Brave Ye »

Gemini
Debian Apache 伺服器防禦攻擊
https://gemini.google.com/share/1a45bb19891e
透過「3 Flash」建立 2026年7月4日 下午09:11
發布時間:2026年7月4日 下午10:02
Debian 13 沒有使用 cloudflare 會被阻斷apache2網站超過負載攻擊,可有方法?

在不安裝 Cloudflare 等 CDN 外部防禦的情況下,Debian 13 的 Apache2 面對「超過負載攻擊」(多為 HTTP Flood、Slowloris 慢速連線或惡意阻斷)時,完全可以透過地端(內建模組 + 防火牆)進行硬核防禦。

這類攻擊的本質是「耗盡 Apache 的連線執行緒(Threads/Processes)與記憶體」。請依照以下 4 個步驟循序漸進地優化與武裝你的 Debian 13 伺服器:

1. 切換至高性能 mpm_event 模式(最核心)
Debian 13 預設安裝 Apache 時有時會採用傳統的 prefork 模式,這種模式一個連線佔用一個獨立進程,很容易被幾百個惡意連線直接塞爆。
event 模式 則採用異步非阻塞(Asynchronous)處理,能用極少的記憶體和 CPU 撐住數萬個併發連線。

請在終端機執行以下指令切換:

Bash
# 關閉舊的 prefork
sudo a2dismod mpm_prefork

# 啟用 event 模式與 HTTP/2 支援
sudo a2enmod mpm_event http2

# 重啟 Apache
sudo systemctl restart apache2
2. 啟用並設定過載與慢速連線防禦(內建模組)
A. 防禦慢速攻擊(mod_reqtimeout)
攻擊者常用極慢的速度發送網頁檔頭(如 Slowloris 攻擊)來卡死網頁伺服器。Apache 內建的 reqtimeout 模組可以強制規定:如果在時間內沒傳完資料就直接斷線。

請檢查並修改設定檔 /etc/apache2/mods-available/reqtimeout.conf(如果沒有請啟用:sudo a2enmod reqtimeout):

Apache
<IfModule mod_reqtimeout.c>
# 規定客戶端必須在 10 秒內發送完 Header,且每秒傳輸速度不能低於 500 bytes
RequestReadTimeout header=10-20,MinRate=500 body=20,MinRate=500
</IfModule>
B. 安裝與啟用評分防禦模組(mod_evasive)
這個模組是地端防禦 HTTP Flood(同一個 IP 狂刷網頁)的利器。當單一 IP 請求頻率超過設定值,會直接回傳 403 Forbidden 並將其封鎖。

Bash
# 安裝模組
sudo apt install libapache2-mod-evasive -y
編輯設定檔 /etc/apache2/mods-available/evasive.conf,建議調整如下:

Apache
<IfModule mod_evasive24.c>
DOSHashTableSize 3097
DOSPageCount 2 # 同一頁面每秒最多允許 5 次請求 遭遇飽和攻擊設2
DOSSiteCount 50 # 同一網站每秒最多允許 50 次總請求
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60 # 觸發後封鎖該 IP 60 秒(期間再犯會自動延長)
DOSEmailNotify your@email.com # 遭受攻擊時發信通知
</IfModule>
sudo a2enmod evasive
sudo a2enmod reqtimeout
修改完成後記得重啟:sudo systemctl restart apache2

3. 部署動態防火牆 Fail2Ban + CrowdSec
光靠 Apache 拒絕連線,伺服器還是要消耗微量資源去回應 403。最理想的方法是直接在作業系統核心(iptables/nftables)層級把惡意 IP 的流量丟棄(DROP)。

A. 方案一:標準穩定的 Fail2Ban
Fail2Ban 會去監控 Apache 的 error.log,只要發現某個 IP 持續出現被 mod_evasive 拒絕或狂刷不存在頁面的紀錄,就直接透過防火牆封鎖。

Bash
sudo apt install fail2ban -y
複製並建立專屬設定檔:sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
編輯 /etc/fail2ban/jail.local,搜尋並啟用 [apache-noscript]、[apache-overflows] 和 [apache-badbots],將 enabled = false 改為 enabled = true。

B. 方案二:現代聯防型 CrowdSec(強烈推薦)
如果你想要更聰明的防禦,可以在 Debian 13 上安裝 CrowdSec(它是現代化的 Fail2Ban 代替品)。它除了能分析在地日誌,還能自動下載全球惡意 IP 黑名單,在攻擊者還沒連到你的網站前就先將其封鎖。
請參考
viewtopic.php?t=4886
⚠️ 重要提醒:
如果攻擊者的流量是**「頻寬型阻斷(Volumetric Attack)」,例如高達數 Gbps 的 UDP 洪水、DNS 放大攻擊,導致你主機的網路線(頻寬)直接被塞滿**,那麼任何地端防禦軟體都會失效。因為流量還沒進到作業系統,網路孔就已經癱瘓了。此時唯一的解法是聯絡你的主機商(ISP),請他們在機房骨幹網路層進行流量清洗(Scrubbing)或黑洞路由(Null Routing)。

如果你想進一步設定,可以選擇以下方向:



我想看詳細的 Fail2Ban 監控 Apache 設定步驟

如何在 Debian 上詳細設定 Fail2Ban 來分析 Apache 日誌,並透過防火牆自動封鎖惡意刷流量的 IP?

在 Debian 13 上使用 Fail2Ban 來保護 Apache2 是一個非常精準且輕量的方法。我們會建立一個防禦機制:當 mod_evasive 或 Apache 日誌偵測到某個 IP 在「惡意刷流量」時,Fail2Ban 會在作業系統的防火牆(Debian 13 預設為 nftables)直接下達封鎖指令,連回應都不回應它,徹底節省伺服器資源。

以下是完整的實戰設定步驟:

步驟 1:安裝 Fail2Ban 與確認防火牆
首先,我們要在 Debian 上安裝 Fail2Ban。由於 Debian 13 預設的防火牆後端是 nftables,Fail2Ban 會自動與其連動。

Bash
sudo apt update
sudo apt install fail2ban -y
安裝完成後,可以使用以下指令確認 Fail2Ban 服務已經啟動:

Bash
sudo systemctl status fail2ban
步驟 2:建立本地設定檔(Jail)
Fail2Ban 的預設檔是 jail.conf,但我們不應該直接修改它(因為軟體更新時會被覆蓋)。我們要建立一個 .local 複製本來進行自訂設定。

Bash
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
接著,使用你習慣的文字編輯器(如 nano)打開它:

Bash
sudo nano /etc/fail2ban/jail.local
A. 設定全域預設懲罰參數
在檔案中找到 [DEFAULT] 區塊,修改或確認以下三個核心參數(可以根據你的嚴格程度調整):

Ini, TOML
[DEFAULT]
# banTime: 封鎖時間。這裡設定 1h 代表封鎖 1 小時 (也可設為 10m 或 1d)
bantime = 1h

# findtime: 統計的時間區間。在 5 分鐘內...
findtime = 5m

# maxretry: 觸發門檻。超過 5 次違規就封鎖
maxretry = 5

# backend: 建議改為 systemd(若日誌透過 journald 管理),但針對 Apache 通常用 auto 或 polling 即可
backend = auto
B. 啟用 Apache 專用的過濾監控(Jail)
在同一個檔案內往下捲動,找到 [apache-noscript] 等區塊。將你需要防禦的規則由 enabled = false 改為 enabled = true。

針對「惡意刷流量/尋找漏洞」,請務必啟用以下四個最有效的 Jail:

Ini, TOML
[apache-auth]
enabled = true
port = http,https
logpath = %(apache_error_log)s

[apache-badbots]
# 專門封鎖那些狂刷網頁的惡意爬蟲、掃描工具
enabled = true
port = http,https
logpath = %(apache_access_log)s

[apache-noscript]
# 封鎖試圖在網站上尋找並執行非法腳本(如 .php, .pl)試圖癱瘓網站的 IP
enabled = true
port = http,https
logpath = %(apache_error_log)s

[apache-overflows]
# 專門封鎖試圖用超長網址、惡意參數來撐爆 Apache 緩衝區的過載攻擊
enabled = true
port = http,https
logpath = %(apache_error_log)s
編輯完成後,按下 Ctrl + O 儲存,Ctrl + X 離開。

步驟 3:進階!配合 mod_evasive 達成自動精準封鎖
如果你在上一題中已經安裝了 Apache 的 mod_evasive(專門抓 CC 攻擊/狂重新整理的模組),它觸發時會在 Apache 的 error log 留下紀錄。我們可以寫一個自訂規則,讓 Fail2Ban 只要看到 mod_evasive 的警告,就「立刻」叫防火牆把對方 IP 封鎖。

1. 建立 Fail2Ban 過濾器規則
建立一個新檔案:

Bash
sudo nano /etc/fail2ban/filter.d/apache-evasive.conf
將以下正則表達式貼進去,這會去抓取 mod_evasive 產生的 Blacklisting address 字眼:

代碼: 選擇全部

[Definition]
failregex = ^<HOST> .* \[.*\] ".*" (403|429) .* mod_evasive
ignoreregex =
儲存並退出。

2. 在 jail.local 中啟用它
重新打開 /etc/fail2ban/jail.local:

Bash

代碼: 選擇全部

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 123.240.180.243/26

findtime = 5m
maxretry = 5
bantime = 1h
backend = systemd

[sshd]
enabled = false

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log


[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log



[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache2/error.log


[apache-overflows]
enabled = true
port    = http,https
filter  = apache-overflows
logpath = /var/log/apache2/error.log

[apache-nohome]
enabled = true
port    = http,https
logpath = /var/log/apache2/error.log

[apache-evasive]
enabled  = true
port     = http,https
filter   = apache-evasive
logpath  = /var/log/apache2/error.log
findtime = 1m
maxretry = 2
bantime  = 2h
儲存並退出。

步驟 4:套用設定與日常管理
萬事俱備,現在重啟 Fail2Ban 服務來套用所有新規則:

Bash
sudo systemctl restart fail2ban
如何查看防禦狀態?
你可以用 fail2ban-client 指令來查看目前有哪些監控正在執行:

Bash
sudo fail2ban-client status
它會列出所有已啟動的 Jail。如果想看特定某個規則(例如剛剛設定的 apache-evasive)目前封鎖了哪些惡意 IP,可以輸入:

Bash
sudo fail2ban-client status apache-evasive
萬一不小心封鎖到自己人,如何解鎖(Unban)?
如果測試時不小心把自己或客人的 IP 給封鎖了,可以用這行指令手動釋放:

Bash
sudo fail2ban-client set apache-evasive unbanip 123.45.67.89
(將 apache-evasive 改為對應的 Jail 名稱,123.45.67.89 改為要解鎖的 IP)

💡 測試小技巧:
設定完成後,你可以嘗試用手機網路(非伺服器同區網的 IP),故意在網站上狂按 F5 重新整理,或者故意用瀏覽器輸入不存在的網址(如 你的網站/wp-admin.php 等好幾次)。幾秒鐘後,你會發現手機突然完全連不上該網站(連 403 畫面都沒有,直接顯示連線逾時),這就代表 Fail2Ban 已經完美與作業系統防火牆連動成功了!
# 安裝核心 proxy 模組及 HTTP 支援
sudo a2enmod proxy
sudo a2enmod proxy_http
# 如需負載平衡可啟用
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests

systemctl restart apache2

🎯 如何驗證防禦效果?
此時當你從外部瀏覽器重新造訪你的網站(Port 80),網站應該能正常顯示。

你可以下載輕量級壓力測試工具(如 apachebench 簡稱 ab)從另一台電腦進行測試:

Bash
# 類比一個 IP 同時發送 100 個連線,每次併發 10 個
ab -n 100 -c 10 http://你的網站IP/


Google 隱私權政策在新視窗中開啟
Google 服務條款在新視窗中開啟
個人隱私權與 Gemini 應用程式在新視窗中開啟
Gemini 可能會提供不準確的資訊 (包括人物資訊),因此請查證回覆內容。
回覆文章

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 3 位訪客