--- title: NGINX mit Fail2Ban Docker Compose-Anleitung description: published: true date: 2024-02-10T21:39:54.067Z tags: editor: markdown dateCreated: 2024-02-10T21:39:54.067Z --- # NGINX mit Fail2Ban Docker Compose-Anleitung Diese Anleitung führt dich durch den Prozess der Erstellung einer Docker-Compose-Konfiguration, um NGINX mit Fail2Ban einzurichten. Diese Konfiguration schützt dein System vor Brute-Force-Angriffen und ermöglicht die Verwendung von NGINX als Reverse Proxy. ## Schritt 1: Docker und Docker Compose installieren Stelle sicher, dass Docker und Docker Compose auf deinem System installiert sind. Du kannst die folgenden Links für die Installation verwenden: - [Docker Installationsanleitung](https://docs.docker.com/get-docker/) - [Docker Compose Installationsanleitung](https://docs.docker.com/compose/install/) ## Schritt 2: Erstelle die .env Datei für die Umgebungsvariablen ### Verwendung Umgebungseinstellungen Ports Du solltest eine .env-Datei erstellen, die sich im Stammverzeichnis von nginx-proxy befindet, und die erforderlichen Variablen in der docker-compose.yml-Datei deklarieren. Beispiel für die Produktion: ```env HTTP_PORT=80 HTTPS_PORT=443 DEFAULT_EMAIL=my@email.com ENABLE_IPV6=true ``` Beispiel für die Entwicklung: ```env HTTP_PORT=8080 HTTPS_PORT=8443 DEFAULT_EMAIL=my@email.com DEBUG=1 ACME_CA_URI=https://acme-staging-v02.api.letsencrypt.org/directory ``` ### no-www Wenn die Variable WWW innerhalb deines proxied Services auf no-www gesetzt ist, erstellt nginx-proxy automatisch eine Umleitung von www.mydomain.com zu mydomain.com. Du solltest www.domain.com zur LETSENCRYPT_HOST-Variable hinzufügen, um ebenfalls ein SSL-Zertifikat zu erhalten. ### Netzwerke Es müssen 2 externe Netzwerke erstellt werden (eins ist optional, wenn du IPv6 ohne den Docker-Userland-Proxy nicht unterstützen möchtest). ### Netzwerk: nginx-proxy Es handelt sich um ein einfaches externes gebrücktes Netzwerk, das auf dem Host mit dem Befehl `docker network create nginx-proxy` erstellt werden kann. ### Netzwerk: edge Dies ist ein IPv6-fähiges Netzwerk, das aus der docker-compose.yml-Datei entfernt werden kann (sowohl aus der Netzwerkliste des nginx-Dienstes als auch aus der Netzwerkliste am Ende der Datei). Du solltest auch `ENABLE_IPV6: true` aus dem docker-gen-Block entfernen. Wenn du IPv6 wirklich unterstützen möchtest (ohne den IPv6-zu-IPv4-Userland-Proxy), um die echten IPv6-Adressen von Benutzern abzurufen, solltest du IPv6 in der daemon.json von dockerd zuerst aktivieren. Dieser Leitfaden (oder dieser, wenn du Swarm verwenden möchtest) beschreibt die erforderlichen Schritte. Nachdem du IPv6 im Standard-Docker-Brücken-Netzwerk aktiviert hast, kannst du das edge-Netzwerk mit dem Befehl `docker network create —ipv6 —subnet fd00:dead:beef::/48 edge` erstellen. Es ist möglicherweise erforderlich, `sudo ip6tables -t nat -A POSTROUTING -s fd00:dead:beef::/48 ! -o docker0 -j MASQUERADE` auszuführen (beachte, dass dies nicht gegen einen Neustart gesichert ist). Schließlich musst du irgendeine Art von IPv6-NAT aktivieren. Du kannst dieses Repository schnell verwenden: `docker run -d —restart=always -v /var/run/docker.sock:/var/run/docker.sock:ro —cap-drop=ALL —cap-add=NET_RAW —cap-add=NET_ADMIN —cap-add=SYS_MODULE —net=host —name ipv6nat robbertkl/ipv6nat`, und es wird sich um alles kümmern (vergiss nicht, es gegen Neustarts abzusichern). Du kannst auch die offizielle (und experimentelle) Unterstützung von Docker für ip6tables verwenden, indem du sie in der daemon.json von dockerd aktivierst. Vergiss nicht, auch die experimentelle Flagge zu aktivieren. Je nach Anwendungsfall möchtest du möglicherweise den Docker-Userland-Proxy deaktivieren, indem du „userland-proxy“: false zu deiner daemon.json-Datei hinzufügst. Deine daemon.json sollte etwa so aussehen: ```json { „experimental“: true, „ipv6“: true, „ip6tables“: true, „fixed-cidr-v6“: „fd00::/80“ } ``` Denke daran, dass jede Modifikation dieser Datei durch das Neustarten des Docker-Dienstes, nicht nur durch das Neuladen, gefolgt werden sollte. ## Schritt 3: Erstelle die Docker-Compose-Konfiguration Erstelle eine `docker-compose.yml`-Datei in deinem Projektverzeichnis und füge den folgenden Inhalt ein: ```yaml version: ‚3‘ services: fail2ban: build: builds/fail2ban/. container_name: app-nginxproxy-fail2ban restart: always network_mode: „host“ volumes: - ./logs:/var/log/nginx:ro - ./fail2ban:/var/run/fail2ban:rw cap_add: - NET_ADMIN docker-gen: image: nginxproxy/docker-gen command: -notify-sighup app-nginxproxy-nginx -watch -wait 500ms:3s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf container_name: app-nginxproxy-dgen restart: always volumes: - ./volumes/nginx/conf.d:/etc/nginx/conf.d - ./volumes/nginx/vhost.d:/etc/nginx/vhost.d - ./volumes/nginx/certs:/etc/nginx/certs:ro - ./volumes/nginx/htpasswd:/etc/nginx/htpasswd:ro - /var/run/docker.sock:/tmp/docker.sock:ro - ./volumes/docker-gen/templates/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro networks: - default - edge-tier environment: ENABLE_IPV6: ${ENABLE_IPV6:-false} nginx: image: nginx:alpine container_name: app-nginxproxy-nginx restart: always depends_on: - docker-gen ports: - ‚${HTTP_PORT:-80}:80‘ - ‚${HTTPS_PORT:-443}:443‘ - 8448:8448 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./volumes/nginx/conf.d:/etc/nginx/conf.d:ro - ./volumes/nginx/vhost.d:/etc/nginx/vhost.d:ro - ./volumes/nginx/certs:/etc/nginx/certs:ro - ./volumes/nginx/htpasswd:/etc/nginx/htpasswd:ro - ./volumes/nginx/html:/usr/share/nginx/html:ro - ./logs:/var/log/nginx/:rw - ./data:/data:ro - /etc/localtime:/etc/localtime:ro networks: - default - edge-tier acme-companion: image: nginxproxy/acme-companion container_name: app-nginxproxy-acme restart: always depends_on: - docker-gen - nginx volumes: - ./volumes/nginx/conf.d:/etc/nginx/conf.d:ro - ./volumes/nginx/vhost.d:/etc/nginx/vhost.d - ./volumes/nginx/html:/usr/share/nginx/html - ./volumes/nginx/certs:/etc/nginx/certs - ./volumes/nginx/acme:/etc/acme.sh - /var/run/docker.sock:/var/run/docker.sock:ro - /opt/containers/mailu/certs:/etc/nginx/certs/mailu-certs networks: - default - edge-tier environment: NGINX_DOCKER_GEN_CONTAINER: app-nginxproxy-dgen NGINX_PROXY_CONTAINER: app-nginxproxy-nginx ACME_CA_URI: ${ACME_CA_URI:-} DEFAULT_EMAIL: ${DEFAULT_EMAIL} DEBUG: ${DEBUG:-0} networks: default: name: nginx-proxy external: true edge-tier: name: edge external: true ``` ## Schritt 3: NGINX mit Fail2Ban starten Navigiere zum Verzeichnis, in dem sich deine `docker-compose.yml`-Datei befindet, und führe den folgenden Befehl aus: ```bash docker-compose up -d ``` Dieser Befehl startet NGINX mit Fail2Ban und den anderen Diensten im Hintergrund. ## Anpassungen und Erweiterungen - Du kannst `banaction` mit einer Komma-separierten Liste verwenden, um mehrere Ban-Actions zu konfigurieren. - Überprüfe die Fail2Ban-Dokumentation für spezifischere Optionen und Aktionen. ## Dockerfile-Anpassungen Wenn du Fail2Ban mit einer anderen Konfiguration oder spezifischen Anpassungen verwenden möchtest, bearbeite das Dockerfile in `path/to/fail2ban/Dockerfile`. Stelle sicher, dass du die Konfigurationen und Aktionen entsprechend deinen Anforderungen anpasst. ## Lizenz Dieses Konfigurationsbeispiel steht unter der [MIT Lizenz](LICENSE).