CentOS 7 上的 Fail2ban 使用 Docker 驅動的 Traefik 禁令 OK,無需添加 iptables 規則
我使用“經典”配置設置了一個由 Docker 引擎在 Swarm 模式下執行的 Traefik 實例(見下文,為簡潔起見,我只把相關的
$$ to me $$部分。如果您需要,請隨時詢問更多詳細資訊)。 已安裝 Fail2Ban 以及 firewalld(CentOS 發行版)。到目前為止,我通過觀察 Traefik 訪問日誌進行了簡單的過濾器/監獄配置,主要用於阻止 DOS 和暴力破解。
我的問題:當我嘗試使用Nikto或Hydra時,我可以看到我嘗試使用的 IP 已被列入黑名單:
# fail2ban-client status symfony-auth Status for the jail: symfony-auth |- Filter | |- Currently failed: 3 | |- Total failed: 906 | `- File list: /var/log/traefik/access.log `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 37.19.218.169
但是 iptables 規則部分沒有任何變化,我可以看到給定的 IP 沒有被阻止。此外,如果我嘗試從被禁止的 IP 在網站上導航,即使它被禁止,我也可以做到。
我必須補充一點,我
00-firewalld.conf file
有關於此發行版操作的預設說明:# cat /etc/fail2ban/jail.d/00-firewalld.conf # This file is part of the fail2ban-firewalld package to configure the use of # the firewalld actions as the default actions. You can remove this package # (along with the empty fail2ban meta-package) if you do not use firewalld [DEFAULT] banaction = firewallcmd-rich-rules[actiontype=<multiport>] banaction_allports = firewallcmd-rich-rules[actiontype=<allports>] backend=systemd
最後,我沒有任何時差,比如這裡說的。
# tail /var/log/messages Jul 12 13:28:05 ....
# timedatectl Local time: Mon 2021-07-12 13:30:18 UTC Universal time: Mon 2021-07-12 13:30:18 UTC RTC time: Mon 2021-07-12 13:30:13 Time zone: UTC (UTC, +0000) System clock synchronized: yes NTP service: active RTC in local TZ: no
**那為什麼我的封禁IP還能訪問目標網站呢?**感謝您的線索和啟示。
片段
交通
docker-compose.yml
記錄部分
version: "3.3" services: reverse-proxy: image: "traefik:v2.4" command: # Log configuration #- "--log.level=DEBUG" - "--log.filepath=/var/log/traefik/traefik.log" - "--accesslog.filepath=/var/log/traefik/access.log"
卷部分:
# ... volumes: # To persist certificates - traefik-certificates:/letsencrypt - "/var/run/docker.sock:/var/run/docker.sock:ro" - /var/log/traefik:/var/log/traefik/ # ...
Fail2Ban
我的過濾器
/etc/fail2ban/filter.d/my_filter.conf
[Definition] failregex = ^<HOST>.*"(GET|POST|HEAD).*" (404|444|403|400|301) .*$ ignoreregex =
我的監獄
[my_jail] enabled = true port = http,https filter = my_filter logpath = /var/log/traefik/access.log maxretry = 10
客戶狀態
# fail2ban-client status Status |- Number of jail: 2 `- Jail list: sshd, my_jail
那為什麼我被封禁的IP還能到達目標網站呢?
可能有3個原因:
- 您的
firewalld
後端(iptables
?)不適合處理此問題,請參閱https://github.com/fail2ban/fail2ban/issues/1609#issuecomment-303085942(或https://github.com/firewalld/firewalld/issues/44#issuecomment -408211978)了解詳情。很快,firewalld 的新 nftables 後端可以正確處理這個問題,所以你可能需要切換到這個,或者……這也可能導致我們接下來的兩個原因(前者比後者更相關): 2. 如果您的網路子系統有一些白名單規則(我猜是這樣),例如 conntrack 規則在 fail2ban 鏈之前繞過已經建立的連接,然後將規則添加到 fail2ban 表,拒絕 IP,不會影響這個已建立的連接(例如,在保持活動的情況下),然後只有新連接將被拒絕……在這種情況下,要麼確保在身份驗證失敗後拒絕網路伺服器中的連接,要麼重新排序鏈(在白色之前的 fail2ban 鏈)列出規則),或使用額外命令終止連接
actionban
,例如ss -K dst "[<ip>]"
或conntrack -D -s <ip>
等。請參閱https://github.com/fail2ban/fail2ban/pull/3018/commits/8f6a8df3a45395620e434fd15b4ede694a1d00aa(或https://github.com/fail2ban/失敗2禁令/送出/bbfff1828061514e48395a5dbc5c1f9f81625e82) 對於 ufw 的類似問題; 3. 因為它是 dockerized,你可能必須定義chain = DOCKER-USER
或類似的,只是動作firewallcmd-rich-rules
不適合那個(根本沒有參數chain
)……使用另一個禁止動作(例如,像 iptables/ipset 或 nftables 這樣的原生網路過濾器)支持那。無論如何,考慮到 docker 和 firewalld 的所有預定義鏈/表,您必須檢查傳入流量(包括已建立的)如何到達 fail2ban 為禁止 IP 創建的結果鏈/表。
或者,簡單地對本地網路過濾器子系統(如 iptables+ipset 或 nftables)使用禁止操作(例如,為 fail2ban 鏈使用適當的目標表,例如,
DOCKER-USER
而不是INPUT
)。