在 docker 容器中使用fail2ban 來阻止傳入連接

在 docker 容器中使用fail2ban 來阻止傳入連接

我正在嘗試在 docker-container 中使用fail2ban來阻止與我的nextcloud(也在docker容器中運行)的傳入連線。但是我只能讓fail2ban更改自己容器的iptables,而不是docker主機的iptables。


我目前的設定如下所示:

docker-compose

  app:
    image: nextcloud:latest
    container_name: nextcloud_app
    restart: always
    ports:
      - 7000:80
      - 7001:443
    ...

  fail2ban:
    image: lscr.io/linuxserver/fail2ban:latest
    container_name: nextcloud_fail2ban
    network_mode: host
    restart: always
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./data/fail2ban:/config
      - ./data/nextcloud/data:/var/log:ro # the directory of the nextcloud log
    cap_add:
      - NET_ADMIN
      - NET_RAW

jail.d/nextcloud.conf

[nextcloud]
enabled = true
port = 80,443,7000,7001
protocol = tcp
filter = nextcloud
Tlogpath = /var/log/nextcloud.log
maxretry = 3
bantime = 86400
findtime = 14400
# banaction = docker-action
# chain = DOCKER-USER
# action = iptables[actname=iptables-input,   name=HTTPS,                       port=https, protocol=tcp]
#          iptables[actname=iptables-forward, name=HTTPS-DOCKER, chain=FORWARD, port=443, protocol=tcp]

這會導致在fail2ban容器上正確設定iptables(例如ban 192.168.1.125):

root@grievous:/# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N f2b-nextcloud
-A INPUT -p tcp -m multiport --dports 80,443,7000,7001 -j f2b-nextcloud
-A f2b-nextcloud -s 192.168.1.125/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-nextcloud -j RETURN

但主機 iptables 保持不變。這對我很有幫助,因為我不想阻止到fail2ban容器的流量,而是阻止到nextcloud容器的流量(或一般來說從被禁止的IP位址到docker主機的所有傳入流量)。


我在網上尋找一些解決方案,但無法將拼圖組合在一起。我想我必須使用DOCKER-USER鏈條。然而,當使用它時,沒有建立 iptables。

有些人建議安裝fail2ban baremetal,我不要。

我還嘗試使用我發現的 docker-action.conf 但這也沒有幫助,因為它還在fail2ban容器上創建了 iptables

[Definition]
actionstart = iptables -N f2b-npm-docker
              iptables -A f2b-npm-docker -j RETURN
              iptables -I FORWARD -p tcp -m multiport --dports 0:65535 -j f2b-npm-docker
actionstop = iptables -D FORWARD -p tcp -m multiport --dports 0:65535 -j f2b-npm-docker
             iptables -F f2b-npm-docker
             iptables -X f2b-npm-docker
actioncheck = iptables -n -L FORWARD | grep -q 'f2b-npm-docker[ \t]'
actionban = iptables -I f2b-npm-docker -s DROP <ip >-j
actionunban = iptables -D f2b-npm-docker -s DROP <ip >-j

所以我想我的問題是如何告訴fail2ban在docker主機而不是它自己的容器上安裝iptables。也許我必須改變network_mode

正如這篇文章中所描述的https://serverfault.com/a/1032094/1005675fail2ban 應以附加 pod 運行,並需要寫入主機 iptables

非常感謝任何幫助 =)

答案1

我也在探索這個問題。你在這裡有進展嗎?根據我到目前為止的了解,將 fai2ban 整合到 Nextcloud 容器本身中可能會更容易。

這意味著建立在 Nextcloud 鏡像之上。作為範例,請參閱:

FROM nextcloud:25.0.4-apache

RUN apt-get update && apt-get install -y supervisor \
  && rm -rf /var/lib/apt/lists/* \
  && mkdir /var/log/supervisord /var/run/supervisord

COPY supervisord.conf /

ENV NEXTCLOUD_UPDATE=1

CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]

這裡的目的是添加supervisor到 Nextcloud 容器,以便cron無需另一個專門用於該容器的 Nextcloud 鏡像即可運行。

這個項目可能是另一個難題,因為它將fail2ban整合到Asterisk docker映像中。

相關內容