Fail2ban 防護 SSH 暴力破解攻擊
在 Linux 伺服器管理中,SSH 是最常暴露於公網的服務之一。由於 SSH 預設使用 22 埠,這使得它成為自動化腳本和惡意攻擊者進行暴力破解(Brute-force)的首選目標。即使您設定了強大的密碼,攻擊者仍可能透過每秒數千次的嘗試來耗盡伺服器資源或意外撞擊成功。
Fail2ban 是一款強大的入侵防禦軟體,它能即時監控日誌檔案,當偵測到異常登入嘗試時,自動更新防火牆規則(如 iptables 或 nftables)來封鎖來源 IP。對於使用 Ubuntu 22.04 或 Debian 12 的中階使用者來說,部署 Fail2ban 是提升伺服器安全性最簡單且高效的手段之一。
安裝與基本設定
首先,我們需要安裝 Fail2ban。在基於 Debian 的系統中,這非常直觀。請透過終端機執行以下指令:
sudo apt update
sudo apt install fail2ban -y
安裝完成後,Fail2ban 預設會啟動並監聽 sshd 的日誌。然而,為了確保服務在開機時自動運行,我們應確認其狀態:
sudo systemctl enable fail2ban
sudo systemctl status fail2ban
若狀態顯示為 active (running),則代表守護程序已正常運作。
客製化防護規則
Fail2ban 的核心配置文件位於 /etc/fail2ban/jail.local。系統預設提供 jail.conf,但官方建議不要直接修改該檔案,因為系統更新時會被覆蓋。我們應建立 jail.local 來覆蓋預設設定。
使用您偏好的編輯器打開文件:
sudo nano /etc/fail2ban/jail.local
在文件中,您可以針對 SSH 進行以下關鍵參數調整。以下是一個適合一般環境的基礎設定範例:
[DEFAULT]
# 忽略內部網路 IP,避免把自己鎖在外面
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
這裡的參數含義如下:
- ignoreip:指定不受防護的 IP 範圍,務必包含您的管理 IP,以免誤封鎖自己。
- maxretry:允許的最大失敗登入次數。設為 3 表示第 4 次失敗時觸發封鎖。
- bantime:封鎖時間,單位為秒。3600 代表封鎖 1 小時。
- findtime:在多少秒內累積達到
maxretry次數即觸發封鎖。600 代表 10 分鐘內。
設定完成後,儲存並離開編輯器。
重新載入與驗證
修改配置後,必須重新載入 Fail2ban 服務以套用新規則:
sudo systemctl restart fail2ban
接著,我們可以使用 fail2ban-client 指令來檢查 SSH 監聽器的狀態,確認規則是否已正確載入:
sudo fail2ban-client status sshd
輸出結果應類似於:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
若顯示 Currently banned: 0,表示目前沒有被封鎖的 IP,且過濾器正在運作。您可以嘗試使用錯誤密碼從外部連線,觀察日誌 /var/log/auth.log 以及 fail2ban 的日誌 /var/log/fail2ban.log,確認封鎖機制是否生效。
常見問題與解決方案
1. 封鎖後無法連線,如何解封?
若您不慎將自己的 IP 誤封鎖,或需要手動移除某個 IP,可使用以下指令查看當前被封鎖的 IP 清單:
sudo fail2ban-client status sshd
若要手動解封特定 IP(例如 192.0.2.1),請執行:
sudo fail2ban-client set sshd unbanip 192.0.2.1
若要永久移除某個 IP 的封鎖狀態並將其加入白名單,請編輯 jail.local 中的 ignoreip 參數,並重新啟動服務。
2. 防火牆規則未生效?
Fail2ban 預設使用 iptables 來執行封鎖。在較新的 Debian/Ubuntu 版本中,若系統使用 nftables 作為預設防火牆,Fail2ban 可能無法正確寫入規則。您可以檢查 Fail2ban 使用的動作:
sudo fail2ban-client get sshd action banip
若發現衝突,建議安裝 fail2ban-server 並確保 iptables 套件已安裝,或在 jail.local 中明確指定動作:
[sshd]
banaction = iptables-multiport
小結
透過部署 Fail2ban,您能自動抵禦大多數的 SSH 暴力破解攻擊,大幅降低伺服器被入侵的風險。雖然它不能取代強密碼或金鑰登入,但作為一道自動化的一道防線,其價值不容小覷。建議您定期檢視 fail2ban.log,並根據實際流量調整 maxretry 和 bantime 參數,以在安全性與便利性之間取得最佳平衡。