如果您已經在伺服器上安裝了 Fail2ban,您可能已經成功擋下了許多 SSH 或網頁的暴力破解攻擊。但您有沒有發現一個問題?
很多聰明的駭客會採用「慢速攻擊」。假設您的 SSH 監獄設定是「錯 5 次鎖 1 小時」,駭客被鎖之後,他會乖乖等 1 小時,解鎖後再來試 5 次。日復一日,無窮無盡。
對於這種死纏爛打的惡意 IP,我們需要祭出 Fail2ban 的終極武器:Recidive(累犯監獄)。
這篇文章將教您如何設定一套完美的防禦邏輯:「只要一個月內被 Fail2ban 封鎖超過 3 次,就將該 IP 永久封鎖(All Ports),徹底打入水桶!」
⚠️ 關鍵陷阱:為什麼只改 Fail2ban 設定沒用?
在開始設定 Fail2ban 之前,必須先解決一個 99% 的新手都會踩到的坑:Linux 的日誌輪替機制 (Logrotate)。
Recidive 監獄的運作原理,是去翻閱 Fail2ban 自己的日誌 (/var/log/fail2ban.log),看看這個 IP 過去有沒有被封鎖的「前科」。
但是!多數 Linux 系統(如 Ubuntu/Debian)預設每週就會把這個日誌檔切換打包一次。這意味著 Fail2ban 的「記憶力」只有 7 天。如果您直接在 Fail2ban 裡設定「追溯 30 天 (30d)」,實際上根本起不了作用,因為 7 天前的日誌早就被系統收走了。
所以,第一步,我們要先幫 Fail2ban 擴充記憶體。
步驟一:修改 Logrotate 延長日誌壽命
打開 Fail2ban 的日誌輪替設定檔:
sudo nano /etc/logrotate.d/fail2ban
找到裡面的 weekly,將其修改為 monthly。並將 rotate 改為 2(保留兩個月的備份即可,節省硬碟空間)。
修改後的內容應該像這樣:
/var/log/fail2ban.log {
monthly # 原本是 weekly,改為每個月切換一次日誌
rotate 2 # 保留兩個月的備份
compress
delaycompress
missingok
postrotate
fail2ban-client flushlogs 1>/dev/null
endscript
}
儲存並退出 (Ctrl+O -> Enter -> Ctrl+X)。
現在,您的 Fail2ban 擁有了整整一個月的完整記憶,我們的水桶計畫就可以正式啟動了!
🛠 步驟二:設定 Recidive 累犯監獄
接下來,我們要告訴 Fail2ban 如何懲罰這些累犯。
打開 Fail2ban 的本機設定檔:
sudo nano /etc/fail2ban/jail.local
在檔案的下方(可以加在 整個設定檔的最後面),加入以下完整的 [recidive] 設定:
[recidive]
enabled = true
# 監控目標:Fail2ban 自己的日誌檔
logpath = /var/log/fail2ban.log
# 封鎖動作:封鎖所有端口 (All Ports),不只是 SSH
banaction = %(banaction_allports)s
# 追溯期:30 天 (Fail2ban 會往前翻 30 天的帳)
findtime = 30d
# 容忍次數:3 次 (在 30 天內,只要被任何普通監獄封鎖過 3 次就觸發)
maxretry = 3
# 封鎖時間:永久 (-1 代表永久封鎖)
bantime = -1
儲存檔案並退出。
🚀 步驟三:重啟與驗證
設定完成後,重新啟動 Fail2ban 讓新規則生效:
sudo systemctl restart fail2ban
您可以輸入以下指令,查看 Recidive 監獄是否已經順利啟動:
sudo fail2ban-client status recidive
如果您看到狀態顯示為 Status for the jail: recidive,恭喜您,水桶已經準備就緒!
結語 透過結合 Logrotate 的延長記憶與 Recidive 的無情封鎖,您的伺服器現在擁有一套非常聰明的雙層防禦系統。前線給予犯錯的機會,後方則毫不留情地清理慣犯。享受這個清靜的伺服器環境吧!