Fail2ban 推廣:保護 Linux 伺服器免受暴力破解

如果您的伺服器暴露在網際網路上(特別是開啟了 SSH 端口),您可能每分鐘都在遭受數以百計的「暴力破解」(Brute-force attacks)嘗試。駭客使用自動化腳本嘗試各種密碼組合,試圖闖入您的系統。

Fail2ban 正是為了對付這種情況而生的強大工具。

什麼是 Fail2ban?

Fail2ban 是一個日誌分析工具。它的工作原理非常簡單但有效:

  1. 監控日誌:它會持續掃描伺服器的日誌文件(如 /var/log/auth.log/var/log/secure)。
  2. 偵測攻擊:當它發現特定 IP 在短時間內出現過多「登入失敗」的記錄時。
  3. 執行封鎖:它會自動更新防火牆規則(如 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 = 10mmaxretry = 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)就立即將其拒之門外。

發佈留言

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

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