Использование fail2ban в контейнере Docker для блокировки входящих соединений

Использование fail2ban в контейнере Docker для блокировки входящих соединений

Я пытаюсь использовать fail2ban в docker-контейнере для блокировки входящих подключений к моему nextcloud (также запущенному в docker-контейнере). Однако я могу заставить fail2ban изменить iptables только своего собственного контейнера, а не хоста docker.


Моя текущая установка выглядит так:

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]

В результате iptables будет правильно настроен на контейнере fail2ban (например, 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, который нашел, но это тоже не помогло, так как он также создает iptables в контейнере fail2ban

[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 установить iptables на хосте docker вместо его собственного контейнера. Может быть, мне придется изменить network_mode?

Как описано в этом постеhttps://serverfault.com/a/1032094/1005675fail2ban должен работать как дополнительный модуль и должен записывать данные в 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.

Связанный контент