fail2ban 入侵防護設定 文章首圖

fail2ban 入侵防護設定

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

讓我們深入解析這些選項的意義:

  1. enabled = true:啟用此監獄。
  2. maxretry = 3:允許的最大失敗嘗試次數。超過此次數後,Fail2ban 將觸發動作。
  3. bantime = 3600:封鎖時間,單位為秒。此處設定為 1 小時(3600 秒)。
  4. findtime = 600:時間窗口。Fail2ban 會在這個時間範圍內計算失敗次數。如果使用者在 600 秒內失敗超過 3 次,就會被封鎖。
  5. 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 的過程中,使用者常會遇到以下兩個問題:

  1. 設定後無效,IP 仍未被封鎖? 這通常是因為日誌路徑錯誤或過濾器未正確載入。首先確認 logpath 指向的檔案確實存在且 Fail2ban 有讀取權限。其次,檢查 /var/log/fail2ban.log/var/log/syslog 中的錯誤訊息。你可以手動測試過濾器是否運作正常:

    sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

    若輸出顯示 "0" 匹配結果,代表過濾器無法識別日誌中的錯誤訊息,可能需要調整正則表達式或確認日誌格式。

  2. 如何排除特定 IP 被封鎖? 除了使用 ignoreip 外,若你希望某個 IP 永遠不會被任何監獄封鎖,可以將其加入 jail.localignoreip 參數中,並確保該 IP 不在任何 banip 動作中。另外,若你使用的是 Cloudflare 等 CDN 服務,務必將 CDN 的 IP 範圍加入 ignoreip,否則你的網站將無法被存取。

小結

Fail2ban 是 Linux 伺服器安全的守門員,透過自動化監控與即時封鎖,能有效降低暴力破解的風險。本文介紹了其安裝、核心設定參數的意義,以及如何透過指令監控與管理封鎖狀態。記住,Fail2ban 只是防禦體系的一部分,搭配防火牆、SSH 金鑰登入以及定期更新系統,才能構建堅固的安全防護網。建議定期檢視 fail2ban.log,了解攻擊來源與頻率,以便及時調整 bantimemaxretry 等參數,達到最佳的安全與可用性平衡。