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 為例:
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。
改完後先檢查設定檔語法,再重新載入:
常用指令
# 列出目前啟用的 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.local設enabled = 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 的指令與觀念仍然適用,但新版套件的預設值(例如日誌後端、防火牆動作)可能與影片略有差異,遇到不同時以本頁與官方文件為準。