Centos

CentOS 7 上的 Fail2ban 使用 Docker 驅動的 Traefik 禁令 OK,無需添加 iptables 規則

  • July 12, 2021

我使用“經典”配置設置了一個由 Docker 引擎在 Swarm 模式下執行的 Traefik 實例(見下文,為簡潔起見,我只把相關的

$$ to me $$部分。如果您需要,請隨時詢問更多詳細資訊)。 已安裝 Fail2Ban 以及 firewalld(CentOS 發行版)。到目前為止,我通過觀察 Traefik 訪問日誌進行了簡單的過濾器/監獄配置,主要用於阻止 DOS 和暴力破解。

我的問題:當我嘗試使用NiktoHydra時,我可以看到我嘗試使用的 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個原因:

  1. 您的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)。

引用自:https://serverfault.com/questions/1069362