Fail2Ban 如何有效運營:基於實戰案例的安全優化指南

1. 引言

在運營 Linux 伺服器的過程中,僅僅開放 SSH 端口,就會經歷很多次登錄嘗試。為了防止這種情況,許多人使用的工具就是 Fail2Ban。然而,僅僅安裝和設置是遠遠不夠的。因為在長期運營中,禁用列表可能會累積到數百、數千個,反而會影響伺服器性能

本文將基於實際伺服器運營經驗,分享如何 更有效、更高效 運用 Fail2Ban 的方法。

如果您對 Fail2Ban 的安裝方法及基本設置有興趣,請參考之前的文章! 守護 Linux 伺服器的守護者,Fail2Ban


2. 實戰經驗:3 週內封禁 1,113 個 IP

在我運營的測試 Linux 伺服器上,設置 fail2ban 大約 3 週後,有一天我執行了以下命令:

sudo fail2ban-client status sshd

結果如下:

當前失敗:1
總失敗:5330
當前禁止:1110
總禁止:1113

3 週內封禁了 1,113 個 IP,其中 1,110 個仍在禁止中。這是因為我設置了 bantime = -1,使其永久禁止。

開始時,我以為“只要試過一次的就不會被饒恕!”的心態進行設置,但當數千個被禁止的 IP 累積到 iptables 中後,我開始擔心系統資源的消耗和管理效率。

最終,我開始思考可持續和有策略的 Fail2Ban 運營方式


Tux 正在保護 recidive jail

3. Fail2Ban 設定改善策略

✅ 動態調整 bantime

  • 與其永久封禁,不如根據時間進行封禁來得現實。
  • 示例:
  • bantime = 86400        # 封禁 1 天
    findtime = 600         # 10 分鐘內
    maxretry = 3           # 失敗 3 次

Fail2Ban 封禁流程圖

✅ 利用 recidive jail

🔎 什麼是 recidive jail?

fail2ban 監控 fail2ban.log 文件,當某個 IP 在多個 jail 中反復被禁止時,對該 IP 進行 長期再次封禁 的高級功能。簡單來說,就是對 犯罪者施加更重的懲罰的“累犯監測系統”

一般來說,sshdnginxftp 等各個 jail 只是短暫封禁,但 recidive jail 會選擇這些 有“累積犯罪記錄”的 IP,使其長期被封禁。

  • 對於反復被封禁的 IP 僅適用長期封禁
  • 一般的攻擊者一兩天就會消失,但重復嘗試的攻擊者可以過濾出去
  • 示例設置:
  • [recidive]
    enabled = true
    logpath = /var/log/fail2ban.log
    bantime = 604800        # 封禁 1 周
    findtime = 86400
    maxretry = 5

✅ 日誌管理自動化

  • /var/log/fail2ban.log 變大之前,通過 logrotate 設置進行自動清理
  • 使用 cron 或 systemd timer 總結 fail2ban-client status 的結果並發送郵件

4. 參考腳本示例

#!/bin/bash
fail2ban-client status sshd > /tmp/sshd-status.log
echo "當前禁止數量: $(grep 'Currently banned' /tmp/sshd-status.log)" | mail -s "Fail2Ban SSHD 狀態" your@email.com

5. 結語:Fail2Ban 不是武器,而是工具

Fail2Ban 是阻止隨機攻擊的非常有用的工具,但如果使用過度,封鎖的目的不再是保護伺服器,而可能成為伺服器過載的原因

如果與現實的封禁政策和自動化管理工具結合,Fail2Ban 將不再是爭鬧的問題,而是 堅實的安全夥伴


預告下一篇文章

我將探討如何設置 logrotate 防止 Fail2Ban 的日誌檔案 /var/log/fail2ban.log 變大。有興趣的朋友請訂閱!