關閉

Ubuntu 22.04 Fail2ban 教學|防止 SSH 暴力破解 + 完整設定與自動封鎖指南

Ubuntu 22.04 為什麼需要安裝 Fail2ban? 只要 Ubuntu Server 的 SSH 服務對外開放,就幾乎一定會遇到暴力破解掃描。這些攻擊通常來自自動化機器人、殭屍網路或惡意掃描程式,它們會不斷嘗試 root、admin、test、user 等常見帳號與弱密碼。

Ubuntu 22.04 為什麼需要安裝 Fail2ban?

只要 Ubuntu Server 的 SSH 服務對外開放,就幾乎一定會遇到暴力破解掃描。這些攻擊通常來自自動化機器人、殭屍網路或惡意掃描程式,它們會不斷嘗試 root、admin、test、user 等常見帳號與弱密碼。

Fail2ban 是 Linux 伺服器常用的自動封鎖工具,它會監控系統日誌,當偵測到短時間內多次登入失敗時,就會自動呼叫防火牆封鎖來源 IP。對於公開 SSH、Web、Mail 或管理後台的伺服器來說,Fail2ban 是非常實用的第一層防護。

本文會完成哪些內容?

Fail2ban 的運作原理

Fail2ban 的核心邏輯很簡單:監控 log、比對規則、封鎖 IP。以 SSH 為例,它會讀取 /var/log/auth.log,當發現同一個來源 IP 在指定時間內多次登入失敗,就會把該 IP 加入防火牆封鎖規則。

Fail2ban 本身不是防火牆,而是防火牆規則的自動化管理工具。它會依照 jail 設定,自動透過 iptables、nftables 或 UFW backend 對攻擊來源進行封鎖。

安裝前準備

開始之前,請先確認你的 Ubuntu 22.04 Server 可以正常使用 apt 安裝套件,並且目前帳號具有 sudo 權限。如果這台主機是雲端 VPS,也請確認你有其他安全登入方式,避免測試 Fail2ban 時把自己鎖在外面。

Step 1:更新 Ubuntu 22.04 系統套件

安裝 Fail2ban 前,建議先更新套件索引與系統套件,避免套件來源過舊或相依性錯誤。

sudo apt update
sudo apt upgrade -y

Step 2:安裝 Fail2ban

Ubuntu 22.04 官方套件庫已包含 Fail2ban,可以直接使用 apt 安裝。

sudo apt install fail2ban -y

安裝完成後,可以檢查 Fail2ban 版本。

fail2ban-client -V

Step 3:建立 jail.local 設定檔

Fail2ban 預設設定檔是 /etc/fail2ban/jail.conf,但不建議直接修改 jail.conf,因為套件更新時可能會被覆蓋。正確做法是複製一份 jail.local,將自訂規則寫在 jail.local 裡。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

接著編輯 jail.local。

sudo nano /etc/fail2ban/jail.local

Step 4:設定 SSH 防暴力破解規則

找到 [sshd] 區塊,或在 jail.local 中加入以下設定。這是 Fail2ban 保護 SSH 的核心設定。

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 600
bantime  = 3600

這個設定的意思是:同一個 IP 在 600 秒內登入 SSH 失敗 5 次,就封鎖 3600 秒,也就是 1 小時。

Fail2ban 重要參數說明

Step 5:啟動 Fail2ban 服務

設定完成後,啟動 Fail2ban 並設定開機自動啟動。

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

查看服務狀態。

sudo systemctl status fail2ban

Fail2ban 服務啟動、停止、重啟與查詢指令

日常維運時,最常用的是 systemctl 與 fail2ban-client。systemctl 負責服務啟停,fail2ban-client 負責查詢 jail 狀態與封鎖清單。

sudo systemctl start fail2ban
sudo systemctl stop fail2ban
sudo systemctl restart fail2ban
sudo systemctl reload fail2ban
sudo systemctl status fail2ban

Step 6:查看 Fail2ban 整體狀態

啟動後,可以使用 fail2ban-client 查看目前有哪些 jail 正在運作。

sudo fail2ban-client status

如果 SSH jail 有啟用,會看到類似 sshd 的 jail 名稱。

Status
|- Number of jail:      1
`- Jail list:           sshd

Step 7:查看 SSH 封鎖狀態

若要查看 SSH 防護狀態,可以查詢 sshd jail。

sudo fail2ban-client status sshd

輸出結果會顯示目前失敗次數、已封鎖數量與被封鎖 IP 清單。

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     15
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     3
   `- Banned IP list:   45.133.1.22

Step 8:測試 Fail2ban 是否真的封鎖 IP

你可以使用另一台測試主機嘗試 SSH 登入,故意輸入錯誤帳號或密碼,連續超過 maxretry 次數後,來源 IP 應該會被 Fail2ban 封鎖。

不要直接用自己唯一的管理 IP 測試,除非你已經把自己的 IP 加入 ignoreip 白名單,否則可能會把自己鎖在伺服器外面。

ssh wronguser@your-server-ip

測試後回到伺服器查詢 sshd jail。

sudo fail2ban-client status sshd

Step 9:查看 Fail2ban 封鎖紀錄

Fail2ban 的封鎖與解除封鎖紀錄通常可以在 /var/log/fail2ban.log 中查看。這是確認 Fail2ban 是否真的有工作的關鍵。

sudo tail -f /var/log/fail2ban.log

你可能會看到類似以下紀錄。

fail2ban.actions        [1234]: NOTICE  [sshd] Ban 45.133.1.22
fail2ban.actions        [1234]: NOTICE  [sshd] Unban 45.133.1.22

Step 10:查看 auth.log 中的 SSH 攻擊紀錄

SSH 暴力破解通常會出現在 /var/log/auth.log。若伺服器對外開放 SSH,很常看到 invalid user、Failed password、root login 等紀錄。

sudo grep "Failed password" /var/log/auth.log | tail -n 20

常見攻擊紀錄如下。

Failed password for invalid user admin from 185.143.223.15 port 44512 ssh2
Failed password for root from 45.133.1.22 port 51234 ssh2
Failed password for invalid user test from 91.200.12.33 port 49321 ssh2

Step 11:手動封鎖與解除封鎖 IP

除了自動封鎖外,也可以使用 fail2ban-client 手動封鎖或解除封鎖指定 IP。

sudo fail2ban-client set sshd banip 1.2.3.4
sudo fail2ban-client set sshd unbanip 1.2.3.4

若測試時不小心封鎖到自己的 IP,可以登入主控台或使用其他管理通道解除封鎖。

Step 12:設定 ignoreip 白名單避免鎖到自己

正式啟用 Fail2ban 前,建議將自己的固定管理 IP 加入 ignoreip,避免因為輸入錯密碼或測試時被封鎖。

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 YOUR_PUBLIC_IP

修改後重新啟動 Fail2ban。

sudo systemctl restart fail2ban

Fail2ban 與 UFW、iptables 的關係

Fail2ban 不是用來取代 UFW 或 iptables,而是用來動態管理封鎖規則。UFW 與 iptables 通常是靜態規則,例如允許 22、80、443 Port;Fail2ban 則是根據 log 動態封鎖攻擊來源。

在 Ubuntu 22.04 上,如果你使用 UFW 管理防火牆,Fail2ban 仍然可以搭配使用。你也可以檢查 iptables 規則,確認 Fail2ban 是否建立了 f2b-sshd chain。

sudo iptables -L -n

你可能會看到類似以下規則。

Chain f2b-sshd
DROP       all  --  45.133.1.22      0.0.0.0/0
RETURN     all  --  0.0.0.0/0        0.0.0.0/0

進階設定:更嚴格的 SSH 防護規則

如果你的 SSH 是公開服務,建議把規則調得比預設更嚴格。例如 5 分鐘內錯 3 次就封鎖 1 天。

[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime  = 86400

這種設定適合公開 VPS、企業主機或經常被掃描的伺服器。不過如果使用者很多,或經常有人輸錯密碼,規則太嚴格可能會造成誤封。

進階設定:永久封鎖重複攻擊 IP

如果你希望攻擊 IP 一旦被封鎖就不自動解除,可以將 bantime 設為 -1。不過正式環境要謹慎使用,避免誤封正常使用者。

bantime = -1

進階設定:修改 SSH Port

修改 SSH 預設 Port 不能取代安全設定,但可以降低大量自動掃描與低階暴力破解嘗試。修改前請先確認防火牆有開放新 Port,避免無法登入。

sudo nano /etc/ssh/sshd_config
Port 2222

修改後重新啟動 SSH 服務。

sudo systemctl restart ssh

進階設定:關閉 SSH 密碼登入

Fail2ban 可以降低暴力破解風險,但更好的做法是使用 SSH Key 登入,並關閉密碼登入。這樣即使攻擊者不斷嘗試密碼,也無法透過密碼登入。

sudo nano /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no

修改前請確認 SSH Key 已可正常登入,否則可能會把自己鎖在伺服器外面。

sudo systemctl restart ssh

自動化安裝 Fail2ban 腳本

如果你需要快速部署多台 Ubuntu 22.04 Server,可以使用以下簡易腳本自動安裝 Fail2ban 並套用基本 SSH 防護規則。正式使用前請把 YOUR_PUBLIC_IP 改成你的管理 IP。

#!/bin/bash
set -e

echo "[+] Update package index"
apt update

echo "[+] Install Fail2ban"
apt install fail2ban -y

echo "[+] Create jail.local"
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 YOUR_PUBLIC_IP
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
EOF

echo "[+] Enable and restart Fail2ban"
systemctl enable fail2ban
systemctl restart fail2ban

echo "[+] Fail2ban status"
fail2ban-client status

echo "[+] Done"

常見故障排除

問題 1:fail2ban-client status 看不到 sshd

如果看不到 sshd jail,通常是 jail.local 沒有正確啟用 [sshd],或設定檔語法有錯。請先檢查服務狀態與 log。

sudo systemctl status fail2ban
sudo journalctl -xeu fail2ban

問題 2:Fail2ban 沒有封鎖攻擊 IP

常見原因是 logpath 設錯、filter 沒有匹配到 auth.log 格式,或攻擊次數尚未超過 maxretry。

sudo fail2ban-client status sshd
sudo tail -n 50 /var/log/auth.log
sudo tail -n 50 /var/log/fail2ban.log

問題 3:自己被 Fail2ban 鎖住

如果你把自己鎖住,需要透過雲端主控台、VNC、實體主機 console 或另一個未被封鎖的 IP 登入,然後解除封鎖。

sudo fail2ban-client set sshd unbanip YOUR_IP

問題 4:修改 jail.local 後設定沒有生效

修改 jail.local 後需要 reload 或 restart Fail2ban。若仍沒有生效,請檢查是否有其他 jail.d 設定覆蓋。

sudo systemctl restart fail2ban
sudo fail2ban-client reload
sudo fail2ban-client status sshd

問題 5:iptables 看不到 f2b-sshd

如果目前尚未有 IP 被封鎖,可能暫時看不到明顯的 DROP 規則。也可能是系統使用 nftables backend。此時應優先以 fail2ban-client status sshd 判斷 jail 是否正常。

sudo fail2ban-client status sshd
sudo iptables -L -n
sudo nft list ruleset

Fail2ban 安全強化建議

進階架構:Fail2ban 搭配 GateKeeper

Fail2ban 適合作為第一層 IP 封鎖機制,專門處理暴力破解、短時間大量登入失敗與明顯惡意來源。若你的網站還有 GateKeeper 或 Bot 分析系統,可以再做第二層行為分析。

理想架構是:Fail2ban 先擋掉明顯攻擊 IP,GateKeeper 再分析剩下的低頻異常流量、Bot 行為、Geo 來源、User-Agent 與請求路徑。這樣可以從單純防暴力破解,升級成更完整的網站安全防護。

Internet
   ↓
Fail2ban:封鎖 SSH 暴力破解與高風險 IP
   ↓
UFW / iptables:執行防火牆規則
   ↓
GateKeeper:分析 Bot、Geo、User-Agent、請求行為
   ↓
Web / CMS / API 系統

Q&A 常見問題

Q1:Fail2ban 可以防止所有攻擊嗎?

不行。Fail2ban 主要用來防止暴力破解與重複失敗登入,不能防止所有漏洞攻擊、0day、SQL Injection 或應用程式漏洞。它應該搭配防火牆、SSH Key、系統更新與網站安全設計一起使用。

Q2:Fail2ban 和 UFW 有什麼不同?

UFW 是防火牆管理工具,主要用來設定允許或拒絕哪些 Port。Fail2ban 則是根據 log 動態封鎖 IP。簡單說,UFW 管靜態規則,Fail2ban 管動態攻擊來源。

Q3:Fail2ban 會影響伺服器效能嗎?

一般情況下影響很低。Fail2ban 主要是監控 log 並在符合條件時更新防火牆規則,對大多數 VPS、雲端主機與實體伺服器都很適合。

Q4:bantime 設多久比較好?

測試環境可以使用 3600 秒,也就是 1 小時。正式公開伺服器可以考慮 86400 秒,也就是 1 天。如果攻擊很頻繁,也可以針對重複攻擊來源做更長時間封鎖。

Q5:我需要修改 SSH Port 嗎?

修改 SSH Port 可以減少大量低階掃描,但不能取代真正的安全設定。更重要的是使用 SSH Key、關閉 root 登入、關閉密碼登入,並搭配 Fail2ban。

Q6:Fail2ban 封鎖 IP 後會自動解除嗎?

會,解除時間取決於 bantime 設定。例如 bantime = 3600 表示封鎖 1 小時後自動解除。如果 bantime = -1,則代表永久封鎖,需手動解除。

延伸閱讀與內鏈建議

總結

Ubuntu 22.04 Server 只要開放 SSH 到公網,就應該安裝 Fail2ban。它可以自動偵測登入失敗、封鎖惡意 IP,降低 SSH 暴力破解風險,是 Linux 伺服器非常實用的基礎防護工具。

不過 Fail2ban 不是萬能安全工具。比較完整的做法是搭配 SSH Key、關閉 root 登入、關閉密碼登入、UFW 或 iptables 防火牆、定期更新系統,以及 GateKeeper 這類行為分析系統,建立多層防禦。

如果你的 we-blog CMS 要做 AI SEO,這篇文章的結構已經包含安裝、設定、測試、服務管理、log 分析、故障排除、Q&A 與進階安全建議,適合拆成 post_blocks 儲存,也適合後續產生 FAQ Schema、HowTo Schema、Related Posts 與 AI 搜尋摘要。