跳轉至

建立 2026-09-19 更新 2026-09-19

fail2ban

fail2ban 是一套用 Python 撰寫的入侵防護工具:它持續讀取系統與服務的日誌(log),發現同一個 IP 在短時間內反覆登入失敗,就自動呼叫防火牆把該 IP 封鎖一段時間。最典型的用途是保護 SSH,擋掉網路上自動化程式的暴力破解(brute force,逐一嘗試大量帳密的攻擊)。

什麼情況才需要

fail2ban 是裝在你自己管理的 Linux 主機上的工具,適合租用 VPS 或自架伺服器的情境。若專案佈署在 Vercel、Netlify、Cloudflare Pages、GitHub Pages 這類託管平台,主機由平台維護,不需要也無法安裝 fail2ban。

運作原理

fail2ban 的核心概念是三個名詞:

名詞 說明
filter 用正規表示式描述「什麼樣的日誌行代表一次失敗」,例如 SSH 的 Failed password for ...
action 達到條件後要做什麼,預設是新增一條防火牆規則封鎖該 IP。
jail 把某個服務的日誌、filter、action 與門檻組合成一個防護單位,例如 sshd jail 專門保護 SSH。

判斷邏輯由三個參數決定:

參數 意義 預設值
maxretry 允許失敗幾次 5 次
findtime 在多長的時間窗內計算失敗次數 10 分鐘
bantime 封鎖多久 10 分鐘

也就是說,預設是「10 分鐘內失敗 5 次,就封鎖 10 分鐘」。

安裝與啟用

以 Ubuntu/Debian 為例:

sudo apt update
sudo apt install fail2ban
sudo systemctl enable --now fail2ban

enable --now 會同時設定開機自動啟動並立即啟動服務。Debian/Ubuntu 的套件預設就會啟用 sshd jail,所以裝完即有基本的 SSH 防護。

設定 jail.local

設定檔在 /etc/fail2ban/不要直接改 jail.conf,套件升級時它會被覆蓋;自訂設定請寫在 jail.local,fail2ban 會優先採用其中的值:

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.10

[sshd]
enabled = true
port    = ssh
  • ignoreip 是白名單,列入你自己的固定 IP,避免手滑輸錯密碼把自己封鎖。(範例的 203.0.113.10 是文件用的示範 IP,請換成你自己的。)
  • 若 SSH 改用非標準埠(例如 2222),port 也要跟著改。
  • 若系統沒有 /var/log/auth.log(只用 journald 記錄日誌),在 [sshd] 加上 backend = systemd

改完後先檢查設定檔語法,再重新載入:

sudo fail2ban-client -t
sudo systemctl restart fail2ban

常用指令

# 列出目前啟用的 jail
sudo fail2ban-client status

# 查看 sshd jail:失敗次數、目前被封鎖的 IP
sudo fail2ban-client status sshd

# 手動解除封鎖某個 IP
sudo fail2ban-client set sshd unbanip 198.51.100.7

# 即時觀察 fail2ban 的封鎖紀錄
sudo tail -f /var/log/fail2ban.log

進階設定

  • 封鎖時間遞增:在 [DEFAULT] 加上 bantime.increment = true,同一個 IP 再犯時封鎖時間會逐次加長,並可用 bantime.maxtime 設定上限,對付長期反覆嘗試的來源很有效。
  • 保護其他服務:fail2ban 內建多種 filter,例如 Nginx 的 nginx-http-auth,在 jail.localenabled = true 即可啟用。
  • 累犯 jail(recidive):專門偵測「被 fail2ban 封鎖過多次」的 IP,給予更長的封鎖時間。

注意事項

不要把自己鎖在外面

調整 SSH 相關設定時,先保留一個已登入的 SSH 連線視窗,確認新設定可以正常連線後再關閉;並把自己的固定 IP 加進 ignoreip

使用 CDN 或反向代理時

若網站前面有 Cloudflare 等代理,Nginx 日誌記錄到的來源 IP 會是代理伺服器的 IP,直接套用 fail2ban 可能誤封代理而導致所有訪客被擋。這種情況要先設定 Nginx 還原真實訪客 IP,再啟用對應的 jail。

fail2ban 是補強,不是唯一防線

最有效的 SSH 防護是改用金鑰登入並在 sshd_config 設定 PasswordAuthentication no 關閉密碼登入;再搭配防火牆(例如 UFW)只開放必要的埠。fail2ban 的角色是減少雜訊與降低被猜中的風險,並不能取代這些基本設定。

官方學習資源

官方文件

fail2ban 沒有原廠維護的教學影片或認證課程,權威資料以官方專案為主:GitHub 專案與 Wiki 說明各項設定,jail.conf(5) 手冊 則完整列出所有參數。

精選 YouTube 教學

HackerSploit 製作的入門教學(2019 年,與 Linode 合作系列)。從安裝 fail2ban 開始,示範設定自訂 jail、實際測試防護是否生效,並說明如何解除被封鎖的 IP,很適合當作第一支影片跟著操作。

與 Linode 文件同名的教學影片(2020 年),說明 fail2ban 如何監看日誌、在偵測到攻擊時新增防火牆規則封鎖來源 IP,並示範安裝與基本設定,可與上方的文字說明對照。

影片版本提醒

這兩支影片發布於數年前,fail2ban 的指令與觀念仍然適用,但新版套件的預設值(例如日誌後端、防火牆動作)可能與影片略有差異,遇到不同時以本頁與官方文件為準。

相關資料