【Fail2ban 進階實戰】設定 Recidive 累犯監獄,將惡意 IP 永久打入水桶!

如果您已經在伺服器上安裝了 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 的無情封鎖,您的伺服器現在擁有一套非常聰明的雙層防禦系統。前線給予犯錯的機會,後方則毫不留情地清理慣犯。享受這個清靜的伺服器環境吧!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料