在維護 Home Lab 或雲端主機時,Nginx Proxy Manager (NPM) 是常見的網關選擇。然而,暴露在公網的服務難免遭遇暴力破解與惡意掃描。本文將分享如何在最新的 Ubuntu 24.04 環境下,透過 Fail2ban 為 Docker 容器建立一套堅固的自動防禦系統。
為什麼 Ubuntu 24.04 需要特殊處理?
-
Python 3.12 相容性:Ubuntu 24.04 預設的 Fail2ban 版本在處理新版 Python 的
asyncio時不穩定,手動安裝 1.1.0 是最佳解。 -
Docker 防火牆機制:Docker 會繞過傳統的
INPUT鏈。若不將規則寫入DOCKER-USER鏈,你的封鎖規則將對容器毫無作用。 -
Action 命名陷阱:若未在配置中明確指定
name,Fail2ban 會生成預設的f2b-default鏈,導致防火牆「跳轉規則」失效。
第一階段:準備工作與安裝
1. 安裝 Fail2ban 1.1.0
為了避開 Python 相容性問題,我們直接從官方 GitHub 下載最新的 .deb 套件。
Bash
# 清理舊版
sudo systemctl stop fail2ban
sudo apt remove --purge fail2ban -y
# 下載並安裝 1.1.0 版本
cd /tmp
wget -O fail2ban.deb https://github.com/fail2ban/fail2ban/releases/download/1.1.0/fail2ban_1.1.0-1.upstream1_all.deb
sudo dpkg -i fail2ban.deb
sudo apt -f install -y
# 啟動服務並檢查版本
sudo systemctl enable --now fail2ban
fail2ban-client --version # 應顯示 1.1.0
2. 配置 NPM 容器日誌掛載
修改 docker-compose.yml,確保容器內的 Access Log 能夠同步到主機,供 Fail2ban 讀取。
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
# ... 其他設定 ...
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
- /var/log/npm:/data/logs # 關鍵:將日誌映射到主機目錄
執行
sudo mkdir -p /var/log/npm
並重啟容器
cd/opt/nmp
sudo docker compose up -d
第二階段:防禦規則配置
1. 建立掃描過濾器 (Filter)
建立檔案 /etc/fail2ban/filter.d/npm-proxy.conf,鎖定常見的惡意狀態碼:
[Definition]
failregex = ^<HOST> -.*" (400|403|404|405|444) .*"$
ignoreregex =
2. 配置監控清單 (Jail)
建立 /etc/fail2ban/jail.local。請注意 chain=DOCKER-USER 的設定,這是確保封鎖生效的核心。
[DEFAULT]
# 排除內網與主機 IP,避免誤封自己
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 172.17.0.0/16 172.18.0.0/16
bantime = 3600
findtime = 600
maxretry = 5
# 關鍵:強制寫入 Docker 防火牆鏈
banaction = iptables-allports[name=default, chain=DOCKER-USER]
[npm-proxy]
enabled = true
port = 80,443
filter = npm-proxy
logpath = /var/log/npm/proxy-host-*_access.log
maxretry = 10
# 關鍵:明確指定 name=npm-proxy,確保建立對應的 f2b-npm-proxy 防火牆鏈
action = iptables-allports[name=npm-proxy, chain=DOCKER-USER]
重啟:
sudo systemctl restart fail2ban
第三階段:NPM 內部的 Real IP 設定
若不設定 Real IP,NPM 日誌只會顯示 Docker Gateway 的 IP(如 172.18.0.1),這會導致 Fail2ban 誤封整個內網。
-
進入 NPM 管理介面。
-
在 Proxy Host 的 Advanced 設定中加入:
set_real_ip_from 172.16.0.0/12; set_real_ip_from 172.17.0.0/12; set_real_ip_from 172.18.0.0/12; real_ip_header X-Forwarded-For;
第四階段:測試與驗證方法
1. 檢查規則是否掛載
執行以下指令,若能看到 f2b-npm-proxy 出現在 DOCKER-USER 鏈中,代表對接成功。
sudo iptables -L DOCKER-USER -n
2. 模擬攻擊測試
手動封鎖一個測試 IP,觀察防火牆反應:
# 手動封鎖
sudo fail2ban-client set npm-proxy banip 1.2.3.4
# 查看封鎖鏈中的 IP
sudo iptables -L f2b-npm-proxy -n
# 解除封鎖
sudo fail2ban-client set npm-proxy unbanip 1.2.3.4
3. 查看即時防禦狀態
sudo fail2ban-client status npm-proxy
維護與監控:
| 目的 | 指令 |
| 查看被鎖了多少人 | sudo fail2ban-client status npm-proxy |
| 查看 Fail2ban 即時動作 | sudo tail -f /var/log/fail2ban.log |
| 手動解封誤殺的 IP | sudo fail2ban-client set npm-proxy unbanip <IP> |
結語
透過以上步驟,你已經在 Ubuntu 24.04 上成功建立了一套針對 Docker 流量的自動監控系統。Fail2ban 會主動在網路層級阻斷威脅,大幅減輕應用程式的處理壓力。
小提醒:請務必將自己的公網 IP 加入
ignoreip列表,以免在開發調試時不慎被鎖。