如果您的伺服器暴露在網際網路上(特別是開啟了 SSH 端口),您可能每分鐘都在遭受數以百計的「暴力破解」(Brute-force attacks)嘗試。駭客使用自動化腳本嘗試各種密碼組合,試圖闖入您的系統。
Fail2ban 正是為了對付這種情況而生的強大工具。
什麼是 Fail2ban?
Fail2ban 是一個日誌分析工具。它的工作原理非常簡單但有效:
- 監控日誌:它會持續掃描伺服器的日誌文件(如
/var/log/auth.log或/var/log/secure)。 - 偵測攻擊:當它發現特定 IP 在短時間內出現過多「登入失敗」的記錄時。
- 執行封鎖:它會自動更新防火牆規則(如 iptables, nftables 或 firewalld),將該惡意 IP 封鎖一段時間。
第一步:安裝 Fail2ban
安裝過程取決於您的 Linux 發行版。
Ubuntu / Debian
sudo apt update
sudo apt install fail2ban -y
安裝完成後,啟動服務並設定開機自啟:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
第二步:設定 Fail2ban(關鍵步驟)
⚠️ 重要觀念: 永遠不要直接編輯
/etc/fail2ban/jail.conf文件! 因為當軟體更新時,這個文件會被覆蓋。我們應該創建一個副本叫做jail.local來進行自定義設定。
1. 建立配置文件
複製默認配置到本地配置文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2. 編輯 jail.local
使用您喜歡的編輯器(如 nano 或 vim)打開或新創文件:
sudo nano /etc/fail2ban/jail.local
3. 設定全局參數 (Default Section)
找到或新增[DEFAULT] 區塊,這裡的設定會應用到所有受監控的服務。以下是幾個最關鍵的參數:
ignoreip(白名單): 非常重要! 將您自己的 IP 地址加入這裡,以免不小心把自己鎖在門外。- 範例:
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 123.45.67.89(用空格隔開)
- 範例:
bantime(封鎖時間): IP 被封鎖的持續時間。可以使用秒數,或m(分),h(時),d(天)。- 建議:
bantime = 1h(或者更長,如1d)
- 建議:
findtime(搜尋時間視窗): 在此時間範圍內累積失敗次數。- 建議:
findtime = 10m
- 建議:
maxretry(最大嘗試次數): 在findtime期間,允許失敗幾次後就進行封鎖。- 建議:
maxretry = 5
- 建議:
白話文解釋:
如果設定
findtime = 10m和maxretry = 5,意思就是:「如果在 10分鐘內 登入失敗達到 5次,就啟動封鎖。」
第三步:啟用 SSH 保護 (Jail)
確保 jail.local 裡面有設定如下:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
如果你只設定
[sshd]
enabled = true
其實也可以,因為fail2ban會先去讀取jail.conf 裡面的設定,而這裡通常都已經幫你設定好port、filter等等的資訊了。由於.local檔案內的設定優先權高於.conf。所以如果.local檔案裡有enabled = true的設定,就會覆蓋掉.conf檔案裡 enabled = false的設定。
編輯完成後,儲存並退出 (Ctrl+O, Enter, Ctrl+X)。
最後,重啟 Fail2ban 讓設定生效:
sudo systemctl restart fail2ban
第四步:常用管理指令
學會如何查看狀態和解鎖 IP 是日常運維必備的技能。
1. 查看 Fail2ban 運作狀態
這會列出目前開啟了哪些監控監獄 (Jails):
sudo fail2ban-client status
2. 查看特定服務的詳細資訊
查看 SSH 的封鎖狀況(目前封鎖了多少 IP、具體是哪些 IP):
sudo fail2ban-client status sshd
您會看到類似這樣的輸出:
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 205
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 5
|- Total banned: 12
`- Banned IP list: 103.xxx.xxx.xxx 185.xxx.xxx.xxx ...
3. 解鎖 (Unban) 一個 IP
如果您或是同事不小心被封鎖了,使用此指令解鎖:
# 語法:fail2ban-client set <監獄名稱> unbanip <IP地址>
sudo fail2ban-client set sshd unbanip 192.168.1.50
進階提示
檢查日誌:如果 Fail2ban 沒有按預期工作,請檢查它的日誌文件:
tail -f /var/log/fail2ban.log
保護其他服務:Fail2ban 不只能保護 SSH,還內建了 Nginx, Apache, WordPress, MySQL 等多種過濾器。只需在 jail.local 中找到(或建立)相應區塊並加上 enabled = true 即可。通常在jail.conf
總結
安裝 Fail2ban 是強化 Linux 伺服器安全最快、最有效的方法之一。它就像一個不知疲倦的保全,24 小時盯著監視器(日誌),一旦發現可疑人物(惡意 IP)就立即將其拒之門外。