fail2ban 入侵防護設定
在伺服器安全管理中,暴力破解(Brute-force)是最常見且令人頭痛的攻击手段之一。無論是用於 SSH 登入、Web 伺服器登入,甚至是資料庫連線,攻擊者會不斷嘗試各種密碼組合,試圖猜測出正確的憑證。雖然強密碼和多因素驗證(MFA)是基礎,但自動化的阻擋機制同樣不可或缺。Fail2ban 正是為此而生的經典工具,它能監控系統日誌,當發現異常的重複失敗嘗試時,自動透過防火牆規則(如 iptables 或 nftables)暫時或永久封鎖來源 IP。
本文将深入解析如何在 Ubuntu 22.04 或 Debian 12 上設定 Fail2ban,並提供具體的指令範例與常見問題解決方案。
安裝與基礎設定
Fail2ban 預設已收錄在 Ubuntu 和 Debian 的官方軟體庫中,安裝過程極為簡便。首先,請更新套件清單並安裝 Fail2ban:
sudo apt update
sudo apt install fail2ban -y
安裝完成後,Fail2ban 通常會自動啟動。你可以透過以下指令檢查服務狀態,確保其正在運行:
sudo systemctl status fail2ban
若輸出結果中包含 active (running),則代表服務正常。然而,為了讓 Fail2ban 發揮最大效用,我們需要針對特定服務進行客製化設定。Fail2ban 的設定檔位於 /etc/fail2ban/ 目錄下。建議不要直接修改預設的 jail.conf,而是複製一份 jail.local 進行設定,這樣在軟體更新時不會覆蓋你的自訂配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
核心機制與 jail.local 設定解析
Fail2ban 的核心邏輯建立在「過濾器(filter)」與「動作(action)」之上。過濾器負責從日誌中比對符合條件的錯誤訊息,而動作則定義了當比對成功時要執行什麼操作(例如封鎖 IP)。
在 jail.local 中,我們可以針對不同的服務建立不同的「監獄(jail)」。以下是一個針對 SSH 服務的基礎設定範例:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
讓我們深入解析這些選項的意義:
enabled = true:啟用此監獄。maxretry = 3:允許的最大失敗嘗試次數。超過此次數後,Fail2ban 將觸發動作。bantime = 3600:封鎖時間,單位為秒。此處設定為 1 小時(3600 秒)。findtime = 600:時間窗口。Fail2ban 會在這個時間範圍內計算失敗次數。如果使用者在 600 秒內失敗超過 3 次,就會被封鎖。ignoreip:忽略的 IP 清單。這些 IP 無論嘗試多少次都不會被封鎖,通常包含本機回環地址(127.0.0.1)以及你信任的內部網路 IP,避免自己把自己鎖在外面。
設定完成後,必須重新啟動服務以套用變更:
sudo systemctl restart fail2ban
監控與指令操作
Fail2ban 提供了一組強大的指令列工具 fail2ban-client,讓我們能即時監控狀態並手動管理封鎖清單。
若要查看當前有哪些 IP 被 SSH 監獄封鎖,可以使用以下指令:
sudo fail2ban-client status sshd
預期輸出範例:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 42
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 2
`- Banned IP list: 203.0.113.5
從輸出中可以看到,IP 203.0.113.5 目前處於被封鎖狀態。如果你想手動解除該 IP 的封鎖,可以執行:
sudo fail2ban-client set sshd unbanip 203.0.113.5
反之,若想手動封鎖某個惡意 IP,可以使用:
sudo fail2ban-client set sshd banip 198.51.100.10
此外,Fail2ban 還支援更細粒度的封鎖策略,例如「漸進式封鎖」。你可以在 jail.local 的 [DEFAULT] 區塊中設定 bantime.increment = true,讓每次被再次封鎖的時間呈指數增長,這對於抵擋持續性的掃描攻擊非常有效。
常見問題與排解
在使用 Fail2ban 的過程中,使用者常會遇到以下兩個問題:
-
設定後無效,IP 仍未被封鎖? 這通常是因為日誌路徑錯誤或過濾器未正確載入。首先確認
logpath指向的檔案確實存在且 Fail2ban 有讀取權限。其次,檢查/var/log/fail2ban.log或/var/log/syslog中的錯誤訊息。你可以手動測試過濾器是否運作正常:sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf若輸出顯示 "0" 匹配結果,代表過濾器無法識別日誌中的錯誤訊息,可能需要調整正則表達式或確認日誌格式。
-
如何排除特定 IP 被封鎖? 除了使用
ignoreip外,若你希望某個 IP 永遠不會被任何監獄封鎖,可以將其加入jail.local的ignoreip參數中,並確保該 IP 不在任何banip動作中。另外,若你使用的是 Cloudflare 等 CDN 服務,務必將 CDN 的 IP 範圍加入ignoreip,否則你的網站將無法被存取。
小結
Fail2ban 是 Linux 伺服器安全的守門員,透過自動化監控與即時封鎖,能有效降低暴力破解的風險。本文介紹了其安裝、核心設定參數的意義,以及如何透過指令監控與管理封鎖狀態。記住,Fail2ban 只是防禦體系的一部分,搭配防火牆、SSH 金鑰登入以及定期更新系統,才能構建堅固的安全防護網。建議定期檢視 fail2ban.log,了解攻擊來源與頻率,以便及時調整 bantime 與 maxretry 等參數,達到最佳的安全與可用性平衡。