Fail2Ban 很適合當 VPS 的第一層自動化防護,但很多人裝完就不敢碰設定,或一改就把自己連線也 ban 掉。這篇會把最常用的 SSH 防護邏輯與操作講清楚,再教你擴展到其他服務。
你如果不想每次都只是照著別人的畫面一步一步跟著按,卻不知道自己到底改了什麼,這篇會比較適合你。重點不是讓你背流程,而是讓你下次遇到類似情況時,還知道該怎麼自己判斷。
你會學到什麼
- 知道 Fail2Ban 怎麼判斷攻擊與封鎖 IP。
- 能完成 SSH 基本防護設定。
- 遇到誤封時知道怎麼解。
- 學會為 Nginx 和其他服務設定防護。
- 理解進階 filter 與自訂規則。
什麼情況最適合先看這篇
- 第一次自己管理 Linux 主機,想把操作做穩而不是只會貼指令的人
- 你現在正要處理「Fail2Ban 防護」這類操作
- 你希望做完之後不只功能能用,連驗證與排錯也有概念
開始前先確認
- 先確認你有另一條可登入主機的路,例如 Console 或備用連線。
- 先把 SSH port 與目前登入方式記下來。
- 正式環境先做基本更新。
先提醒你一件事
VPS 最怕的不是不會下指令,而是你不知道指令會影響到哪個服務、哪個設定檔、哪個對外連線。
詳細教學與操作步驟
本文將教你如何在 VPS 上安裝與設定 Fail2Ban,這是一個能自動偵測並封鎖惡意 IP 的強大工具,有效防止駭客透過暴力破解 (Brute Force) 嘗試登入你的伺服器。
為什麼你的 VPS 需要 Fail2Ban?
一旦你的 VPS 擁有公網 IP,就會開始遭到全球各地的機器人掃描。如果你在 log 中發現大量的 Failed password 紀錄,那就是有人在嘗試暴力破解。Fail2Ban 會監視 log 檔案,當某個 IP 在短時間內登入失敗次數過多,就會自動將其 IP 加入防火牆黑名單中封鎖一段時間。
先看看你的主機有多少攻擊嘗試:
# 查看 SSH 失敗登入次數
grep "Failed password" /var/log/auth.log | wc -l
# 查看來源 IP 排名
grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
步驟一:安裝 Fail2Ban
在 Ubuntu 或 Debian 系統上執行以下指令進行安裝:
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
步驟二:建立自訂設定檔
預設設定檔位於 /etc/fail2ban/jail.conf,但不建議直接修改它(系統更新會覆蓋)。請建立 .local 檔案來覆蓋預設設定:
sudo nano /etc/fail2ban/jail.local
寫入以下內容(不要整個複製 jail.conf,只寫你要改的部分):
[DEFAULT]
# 封鎖時間(1 小時)
bantime = 1h
# 偵測時間窗口(10 分鐘內)
findtime = 10m
# 最多允許失敗次數
maxretry = 5
# 白名單(你自己的 IP)
ignoreip = 127.0.0.1/8 ::1
# 封鎖方式
banaction = iptables-multiport
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
步驟三:套用並檢查狀態
儲存設定檔後,重新啟動 Fail2Ban:
sudo systemctl restart fail2ban
你可以使用以下指令查看目前有哪些 IP 被封鎖:
# 查看所有啟用的 jail 狀態
sudo fail2ban-client status
# 查看 SSH jail 詳細狀態
sudo fail2ban-client status sshd
步驟四:將自己加入白名單
為了防止自己因為不小心輸入錯密碼而被封鎖,建議將你的固定 IP 加入白名單。在 jail.local 檔案中的 [DEFAULT] 區段:
ignoreip = 127.0.0.1/8 ::1 your_local_ip
如果你的 IP 會變動,也可以加入整個 IP 段:
ignoreip = 127.0.0.1/8 ::1 1.2.3.0/24
漸進式封鎖策略
對於重複犯規的 IP,可以設定遞增封鎖時間:
[DEFAULT]
# 啟用遞增封鎖
bantime.increment = true
# 封鎖時間倍率
bantime.factor = 2
# 第一次封 1 小時,第二次 2 小時,第三次 4 小時...
bantime = 1h
# 最長封鎖時間
bantime.maxtime = 1w
保護 Nginx 服務
除了 SSH,你也可以用 Fail2Ban 保護 Web 服務:
防止 HTTP 暴力掃描:
在 jail.local 加入:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
防止 WordPress 後台暴力破解:
先建立自訂 filter:
sudo nano /etc/fail2ban/filter.d/wordpress-login.conf
寫入:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
^<HOST> .* "POST /xmlrpc.php
ignoreregex =
然後在 jail.local 加入:
[wordpress-login]
enabled = true
port = http,https
filter = wordpress-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 5m
bantime = 1h
管理被封鎖的 IP
# 查看目前被封鎖的 IP
sudo fail2ban-client status sshd
# 手動解封某個 IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
# 手動封鎖某個 IP
sudo fail2ban-client set sshd banip 5.6.7.8
# 查看封鎖紀錄
sudo zgrep 'Ban' /var/log/fail2ban.log
Fail2Ban 日誌與監控
# 即時追蹤 Fail2Ban 日誌
sudo tail -f /var/log/fail2ban.log
# 統計今天被封鎖的次數
grep "$(date +%Y-%m-%d)" /var/log/fail2ban.log | grep "Ban" | wc -l
# 查看被封最多次的 IP
grep "Ban" /var/log/fail2ban.log | \
awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
與 UFW 防火牆搭配
如果你使用 UFW 防火牆,Fail2Ban 需要調整 banaction:
在 jail.local 的 [DEFAULT] 中:
banaction = ufw
這樣 Fail2Ban 封鎖 IP 時會使用 UFW 規則而不是直接操作 iptables。
效能調校
Fail2Ban 監控大量日誌時可能影響效能,以下是優化建議:
[DEFAULT]
# 使用 systemd journal(比讀檔案更有效率)
backend = systemd
# 如果 log 檔案很大,可以用 pyinotify 減少 CPU 使用
# backend = pyinotify
常見問題
Q:如果不小心被封鎖了怎麼辦?
你可以從其他受信任的 IP 登入(例如透過主機商提供的 VNC 主控台),並執行解封指令:sudo fail2ban-client set sshd unbanip YOUR_IP。如果你用的是侃瑞科技的 VPS,可以從客戶中心的 VNC Console 登入。
Q:Fail2Ban 會影響伺服器效能嗎? Fail2Ban 是輕量級的程式,對絕大多數 VPS 的效能影響微乎其微。相對於被暴力破解攻擊所產生的負擔,Fail2Ban 實際上是在幫你節省資源。在侃瑞科技,我們建議所有 VPS 用戶 都應部署基礎的安全防護工具。
Q:Fail2Ban 重啟後封鎖的 IP 會消失嗎?
預設情況下,Fail2Ban 重啟後封鎖清單會重置。如果你想持久化封鎖紀錄,可以使用 dbpurgeage 設定:
[DEFAULT]
# 在資料庫中保留封鎖紀錄(預設 86400 秒 = 1 天)
dbpurgeage = 7d
Q:怎麼測試我的 filter 規則有沒有生效?
# 測試 filter 是否能正確匹配 log
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# 測試自訂 filter
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress-login.conf
做完後怎麼確認自己真的有設對
- 用
sudo fail2ban-client status確認所有 jail 都是 active。 - 從另一台機器故意輸錯密碼幾次,確認會被 ban。
- 確認你的白名單 IP 不會被 ban。
- 檢查
/var/log/fail2ban.log確認日誌正常產出。 - 重啟 Fail2Ban 後確認 jail 還是啟用狀態。
這一題最常踩的坑
- 直接改
jail.conf而不是建jail.local,系統更新後設定被覆蓋。 - 只裝 Fail2Ban,不處理 SSH 密碼強度與金鑰。
- 沒有設白名單,結果自己被封掉。
- 看不到 log 就亂猜,調規則很容易越改越亂。
- 以為裝了 Fail2Ban 就萬事大吉,忽略了其他安全措施。
如果你要往下一步走
如果你在做 VPS 初始強化,也可以一起搭配 SSH 連線教學 設定金鑰登入。想了解更多系統管理指令,參考 Linux 基本系統管理指令教學。如果你準備開始自己架服務,可以直接對照侃瑞的 VPS 方案與價格 選環境。