⚠️🚧 Work in Progress 🚧⚠️
🛠️ This article is currently under construction.
📅 Some sections may still be incomplete or subject to revision.
🔄 Please check back later for updates!
💡 Feel free to follow along, but note that some information might change as the article is updated.
這兩天去高雄拍音樂祭,今天預計來做 Fail2ban 但是車上網路實在太爛沒辦法實驗,只能先貼預計的做法
DOCKER-USER
鏈和自定義的 f2b-docker
鏈,讓 Fail2ban 修改特定的 iptables
鏈,從而封鎖惡意 IP。創建 f2b-docker
鏈
在宿主機終端執行以下命令:
sudo iptables -N f2b-docker
將 f2b-docker
鏈插入到 DOCKER-USER
鏈
sudo iptables -I DOCKER-USER -j f2b-docker
說明:
DOCKER-USER
鏈是在 Docker 啟動時自動創建的,用於允許用戶在 Docker 處理其自身的規則之前插入自定義規則。f2b-docker
鏈插入到 DOCKER-USER
鏈,我們可以確保所有進入 Docker 的流量都先經過 f2b-docker
鏈。創建過濾器文件
在項目目錄下創建 fail2ban/filter.d
目錄(如果尚未存在),並在其中創建一個名為 odoo.conf
的過濾器文件。
文件路徑:./fail2ban/filter.d/odoo.conf
內容:
[Definition]
failregex = ^ .*INFO .* odoo.addons.base.res.res_users: Login failed for db:\S+ login:\S+ from <HOST>
ignoreregex =
說明:
failregex
定義了匹配 Odoo 登入失敗日誌的正則表達式。<HOST>
是 Fail2ban 用於捕獲 IP 地址的佔位符。確保正則表達式正確
請確認您的 Odoo 日誌格式與上述正則表達式匹配,必要時進行調整。
創建 Jail 配置文件
在項目目錄下創建或更新 fail2ban/jail.local
文件。
文件路徑:./fail2ban/jail.local
內容:
[odoo]
enabled = true
filter = odoo
logpath = /var/log/odoo/odoo-server.log # 根據實際日誌路徑調整
maxretry = 5
bantime = 3600
findtime = 600
action = iptables[name=odoo, port=all, protocol=all, chain=f2b-docker]
說明:
filter = odoo
:使用我們在前一步創建的過濾器。logpath
:指定 Odoo 日誌文件的路徑。action
:指定使用 iptables
動作,並將規則添加到我們的 f2b-docker
鏈中。更新 docker-compose.yml
添加或修改 Fail2ban 服務的配置:
services:
fail2ban:
image: fail2ban/fail2ban:latest
container_name: fail2ban
volumes:
- ./fail2ban/jail.local:/etc/fail2ban/jail.local
- ./fail2ban/filter.d:/etc/fail2ban/filter.d
- ./odoo/log:/var/log/odoo # 掛載 Odoo 日誌
cap_add:
- NET_ADMIN
- NET_RAW
network_mode: "host"
說明:
cap_add
:授予容器網絡管理和原始套接字的權限,允許修改 iptables
。network_mode: "host"
:讓容器與宿主機共享網絡命名空間。確保其他服務配置正確
檢查 Odoo、Nginx、PostgreSQL 等服務的配置,確保它們正常運行。
檢查 iptables.conf
在 Fail2ban 容器內的 /etc/fail2ban/action.d/iptables.conf
文件中,確保它支持指定自定義的 chain
。通常默認的配置已經支持,但為了確保,我們可以在 Definition
部分添加或確認以下內容:
[Definition]
actionstart = iptables -N f2b-<name>
iptables -A f2b-<name> -j RETURN
iptables -I <chain> -p <protocol> --dport <port> -j f2b-<name>
actionstop = iptables -D <chain> -p <protocol> --dport <port> -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck =
actionban = iptables -I f2b-<name> 1 -s <ip> -j DROP
actionunban = iptables -D f2b-<name> -s <ip> -j DROP
說明:
<chain>
會被替換為我們在 Jail 中指定的 chain
,即 f2b-docker
。iptables
規則。啟動容器
docker-compose up -d
測試封鎖機制
模擬失敗登入:從同一個 IP 多次嘗試錯誤的登入,超過 maxretry
(此例為 5 次)。
檢查 iptables
規則:
sudo iptables -L f2b-docker -n
您應該看到被封鎖的 IP 地址列在規則中。
驗證封鎖效果
iptables
規則的持久性安裝 iptables-persistent
(可選)
在宿主機上執行:
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
說明:
iptables
規則。時區同步:確保 Fail2ban 容器的時區與宿主機一致,以避免因時間差異導致的問題。
防火牆工具:如果宿主機使用了其他防火牆管理工具(如 ufw
、firewalld
),需要確保它們與 iptables
規則協同工作,避免規則被覆蓋。
安全性:雖然我們授予了容器修改網絡規則的權限,但通過限制其修改的鏈,我們將風險降至最低。仍然建議定期更新容器映像,並監控容器的安全狀態。