【Homelab 筆記】Ubuntu 24.04 + NPM 安裝 Fail2ban

在維護 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 誤封整個內網。

  1. 進入 NPM 管理介面。

  2. Proxy HostAdvanced 設定中加入:

    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 列表,以免在開發調試時不慎被鎖。

發佈留言

+ 20 = 25
Powered by MathCaptcha

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