Wenn mehrere Dienste auf demselben Server über Port 80 (für HTTP) oder 443 (für HTTPS) kommunizieren sollen, kann dies zu Konflikten führen, da normalerweise nur ein Dienst einen bestimmten Port zu einem bestimmten Zeitpunkt belegen kann. Hier kommt Traefik ins Spiel und hilft, dieses Problem zu lösen.
Traefik agiert als Reverse-Proxy und Load-Balancer und ermöglicht es, dass alle eingehenden Anfragen auf Port 80 oder 443 an die richtigen Dienste weitergeleitet werden, basierend auf den von Ihnen konfigurierten Regeln. Dies wird manchmal als “Routing” bezeichnet.
Diese Anleitung ist VERALTET und WIRD NICHT MEHR GEPFLEGT. Hier geht’s zur neuen Anleitung: https://goneuland.de/traefik-v3-installation-konfiguration-und-crowdsec-security/
In wie weit unterscheidet sich diese zu der bisherigen vorhandenen Anleitung?
- Meine bisherige Anleitung ist nun schon ein paar Tage alt und ich habe in der Zwischenzeit vieles weiter lernen dürfen.
- Es gab viele wichtige Kommentare, Fragen und Anregungen – vielen Dank dafür!
- Es steht in absehbarer Zeit ein Traefik Major Release an – Version 3
0. Versionierung
Datum | Änderung |
---|---|
25.01.2024 | – docker-compose.yml -> Traefik -> Portfreigabe angepasst (host anstelle von ingress )– crontab erweitert |
20.01.2024 | Hinweis ergänzt unter “6.1.1. Token anlegen“. Der Hinweis ist der Schlüssel zum erfolgreichen Setup unter Debian. |
29.11.2023 | Hinweis hinzugefügt |
06.11.2023 | 3 kleine Anpassungen an der traefik.yml nach Hinweisen von @Umek –
– providers.providersThrottleDuration: 10s – tls_resolver.acme.tlsChallenge: {} |
20.10.2023 | Anleitungüberprüfung. Frischer Ubuntu Server mit dieser Anleitung 1:1 umgesetzt. |
23.07.2023 | Differenz zwischen Ubuntu und Debian hinzugefügt unter 9.3.1. |
12.07.2023 | Entfernen des Hinweis vom 10.07.2023 |
10.07.2023 | Hinweis zu Problemen mit Docker 24.0.4 |
02.07.2023 | Hinweis zur Stabilität und automatisierten Updates hinzugefügt |
26.06.2023 | Bugfix zu Version Traefik v2.10.3 In der /opt/containers/traefik-crowdsec-stack/traefik/traefik.yml Zeile hub: true unter experimental entfernen |
04.06.2023 | sleep 30 aus Punkt 5.2. entfernt |
25.05.2023 | Migration ans Ende der Einleitung verschoben |
Initialer Release |
1. Zielsetzung & Vorwort
- Traefik v2 installieren und konfigurieren
- Crowdsec installieren und konfigurieren
- Traefik Services via CrowdSec sichern
- Einzelner Stack
- Wie wir unsere Services mit Traefik verfügbar machen
Hinweis: Bitte beachtet, dass ich nicht jede Änderung im Vergleich zur alten Anleitung ausführlich darlegen werde. Allerdings werde ich besondere Sorgfalt darauf verwenden, an Stellen, an denen die neue Anleitung nicht mehr mit der alten kompatibel ist, einen entsprechenden Hinweis einzufügen. Mein Ziel ist es, euch durch diesen Prozess so reibungslos und verständlich wie möglich zu führen.
Wenn du ein neues Setup, also einen neuen Server aufsetzt, dann kannst du diese Anleitung einfach abarbeiten.
Solltest du aber die alte Anleitung befolgt haben und möchtest nun auf diese FullStack-Anleitung setzten musst du vorher ALLE Container und ALLE Netzwerke außer host,bridge
und none
herunterfahren und dann nach der Anleitung anpassen und Schritt für Schritt wieder hochfahren!
ACHTUNG! Die gesamte Anleitung wurde als root
-User durchgeführt!
2. Voraussetzung
3. Traefik + CrowdSec im Stack vorbereiten
In dieser aktualisierten Anleitung konzentrieren wir uns darauf, Traefik, CrowdSec und alle damit verbundenen Komponenten in einem einzigen Stack zu definieren. Warum? Ganz einfach, die Erfahrung hat gezeigt, dass die Startreihenfolge der Container durchaus relevant sein kann. Mit einem Full-Stack-Ansatz kann ich diesen Aspekt besser steuern und somit eine optimale Performance und Funktionalität gewährleisten.
Wichtiger Hinweis!
Diese Anleitung ist nicht vollständig kompatibel zu meiner alten und wohl bekanntesten Anleitung! Ich werde am Ende ein extra Abschnitt nur der Migration widmen.
3.1. Verzeichnisse / Dateien anlegen
Beginnen wir mit der Erstellung der benötigten Verzeichnisse für den Full-Stack. Im Folgenden wird das Hauptverzeichnis traefik-crowdsec-stack
erstellt, und dann darin Unterordner für traefik
, crowdsec
, config
und zwei zusätzliche Unterordner für config
und data
in crowdsec
.
# Hauptverzeichnis erstellen und zusätzliche Unterordner in 'crowdsec' erstellen mkdir -p /opt/containers/traefik-crowdsec-stack/{traefik,crowdsec/{config,data},config} # Ins Hauptverzeichnis wechseln cd /opt/containers/traefik-crowdsec-stack
Im nächsten Schritt erzeugen wir die notwendigen Dateien und setzen die korrekten Zugriffsrechte.
# .env Datei im Hauptverzeichnis erstellen touch /opt/containers/traefik-crowdsec-stack/.env # Umgebungsspezifische .env Dateien in 'config' erstellen touch /opt/containers/traefik-crowdsec-stack/config/{crowdsec.env,traefik.env,traefik-crowdsec-bouncer.env} # Zusätzliche Dateien in 'traefik' erstellen und Zugriffsrechte für bestimmte Dateien festlegen touch /opt/containers/traefik-crowdsec-stack/traefik/{acme_letsencrypt.json,traefik.yml,dynamic_conf.yml,tls_letsencrypt.json} chmod 600 /opt/containers/traefik-crowdsec-stack/traefik/{acme_letsencrypt.json,tls_letsencrypt.json}
Als nächstes möchten wir sicherstellen, dass alles korrekt angelegt wurde. Hierfür verwenden wir den tree
Befehl. Falls das tree
Programm noch nicht installiert ist, können wir es wie folgt installieren:
Für Ubuntu/Debian:
apt install tree
Jetzt können wir den Befehl tree
Verzeichnis ausführen
tree -L 2 -a /opt/containers/traefik-crowdsec-stack/
um die Struktur zu überprüfen. Die Ausgabe sollte folgendermaßen aussehen:
. ├── config │ ├── crowdsec.env │ ├── traefik.env │ └── traefik-crowdsec-bouncer.env ├── crowdsec │ ├── config │ └── data ├── .env └── traefik ├── acme_letsencrypt.json ├── dynamic_conf.yml ├── tls_letsencrypt.json └── traefik.yml
Wenn eure Ausgabe genau so aussieht, habt ihr alles richtig gemacht und wir können weitermachen. Wenn nicht, überprüft bitte die vorherigen Schritte.
Bevor wir diesen Abschnitt abschließen, sollten wir einige wichtige Unterschiede zu meiner alten Anleitung hervorheben:
- Datenstruktur: Die Art und Weise, wie wir unsere Daten strukturieren, hat sich erheblich verändert. Wir nutzen jetzt eine ordentlichere und effizientere Struktur, die es uns ermöglicht, die Dinge besser zu organisieren und zu verwalten.
- Verwendung von .env Dateien: In dieser Anleitung verwenden wir .env Dateien, um Umgebungsvariablen zu speichern. Dies ist eine übliche Praxis, die uns hilft, sensitive Informationen sicher und organisiert zu halten, und es uns ermöglicht, verschiedene Einstellungen für verschiedene Umgebungen zu haben.
- TLS Resolver: Ein zusätzliches Feature dieser Anleitung ist die Verfügbarkeit eines TLS Resolvers. Dies ist ein mächtiges Werkzeug, das wir im weiteren Verlauf der Anleitung detailliert behandeln werden.
3.2. docker-compose.yml anlegen
Wir beginnen nun mit der Erstellung unserer docker-compose.yml
Datei. Hierfür verwenden wir den Texteditor nano
. Um die Lesbarkeit zu verbessern und die Verwaltung zu erleichtern, teilen wir die Datei in mehrere Abschnitte auf. Jeder Abschnitt befasst sich mit einem bestimmten Aspekt unserer Stack-Konfiguration.
nano docker-compose.yml
Mit dem obigen Befehl öffnen wir nano
und erstellen gleichzeitig die Datei docker-compose.yml
, falls sie noch nicht existiert. Nun können wir mit der Konfiguration unserer Full-Stack-Anwendung beginnen. Im folgenden kommen mehrere Abschnitte. Abschnitt 1-5 ist enthalten Schritt-für-Schritt Schnipsel. Abschnitt 6 ist das komplette File.
# Die Version der Docker Compose-Datei. Hier verwenden wir Version 3.9. version: "3.9" # Der Beginn des 'services' Abschnitts. services:
# Name des Services. crowdsec: # Der Name des Containers, der aus diesem Service erzeugt wird container_name: ${SERVICES_CROWDSEC_CONTAINER_NAME:-crowdsec} # Umgebungsvariablen für den Container. env_file: ./config/crowdsec.env # Hostname des CrowdSec-Containers, kann über eine Umgebungsvariable angepasst werden. hostname: ${SERVICES_CROWDSEC_HOSTNAME:-crowdsec} # Gesundheitsüberprüfung für den CrowdSec-Service healthcheck: test: ["CMD", "cscli", "version"] interval: 20s timeout: 2s retries: 5 start_period: 10s # Docker-Image, das für den Container verwendet wird. image: ${SERVICES_CROWDSEC_IMAGE:-crowdsecurity/crowdsec}:${SERVICES_CROWDSEC_IMAGE_VERSION:-latest} # Netzwerke, zu denen der Container gehört. networks: crowdsec: # Feste IPv4-Adresse vergeben. ipv4_address: ${SERVICES_CROWDSEC_NETWORKS_CROWDSEC_IPV4:-172.31.254.254} # Restart-Strategie für den Container. restart: unless-stopped # Sicherheitsoptionen für den Container. security_opt: - no-new-privileges=true # Volumes, die vom Container verwendet werden. volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /var/log/auth.log:/var/log/auth.log:ro - /var/log/traefik:/var/log/traefik:ro - ./crowdsec/config:/etc/crowdsec - ./crowdsec/data:/var/lib/crowdsec/data
# Der Name des Service traefik: # Der Name des Containers, der aus diesem Service erzeugt wird container_name: ${SERVICES_TRAEFIK_CONTAINER_NAME:-traefik} # Diese Option sorgt dafür, dass der Traefik-Service erst gestartet wird, # nachdem der Crowdsec-Service healthy ist depends_on: crowdsec: condition: service_healthy # Umgebungsvariablen für den Container. env_file: ./config/traefik.env # Hostname des Traefik-Containers, kann über eine Umgebungsvariable angepasst werden. hostname: ${SERVICES_TRAEFIK_HOSTNAME:-traefik} # Gesundheitsüberprüfung für den Traefik-Service healthcheck: test: ["CMD", "traefik", "healthcheck", "--ping"] interval: 10s timeout: 1s retries: 3 start_period: 10s # Das Docker-Image, das für diesen Service verwendet wird # Version kann über eine Umgebungsvariable angepasst werden. Standard: 2.10 image: ${SERVICES_TRAEFIK_IMAGE:-traefik}:${SERVICES_TRAEFIK_IMAGE_VERSION:-2.10} # Docker Labels für den Traefik-Service. Diese werden für die Traefik-Konfiguration verwendet labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.traefik.entrypoints: websecure traefik.http.routers.traefik.middlewares: default@file traefik.http.routers.traefik.rule: Host(${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST}) traefik.http.routers.traefik.service: api@internal traefik.http.routers.traefik.tls: "true" traefik.http.routers.traefik.tls.certresolver: http_resolver traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly: "true" traefik.http.services.traefik.loadbalancer.sticky.cookie.secure: "true" traefik.http.routers.pingweb.rule: PathPrefix(`/ping`) traefik.http.routers.pingweb.service: ping@internal traefik.http.routers.pingweb.entrypoints: websecure # Die Netzwerke, zu denen dieser Service gehört networks: crowdsec: # IPv4-Adresse des CrowdSec Containers im Traefik-Netwerk: crowdsec ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV4:-172.31.254.253} proxy: # IPv4-Adresse des Traefik Containers im Traefik-Netwerk: proxy ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_PROXY_IPV4:-172.16.255.254} # Die Ports, die diesem Service zugeordnet sind ports: - mode: host target: 80 published: "80" protocol: tcp - mode: host target: 443 published: "443" protocol: tcp # Der Restart-Policy dieses Service restart: unless-stopped # Sicherheitsoptionen für diesen Service security_opt: - no-new-privileges:true # Die Volumes, die diesem Service zugeordnet sind volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /var/log/traefik/:/var/log/traefik/ - ./traefik/traefik.yml:/traefik.yml:ro - ./traefik/acme_letsencrypt.json:/acme_letsencrypt.json - ./traefik/tls_letsencrypt.json:/tls_letsencrypt.json - ./traefik/dynamic_conf.yml:/dynamic_conf.yml
# Definition des Traefik CrowdSec Bouncer-Dienstes traefik_crowdsec_bouncer: # Der Name des Containers, der aus diesem Service erzeugt wird container_name: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_CONTAINER_NAME:-traefik_crowdsec_bouncer} # Abhängigkeitsdefinition: Dieser Service wird erst gestartet, wenn der Crowdsec-Service als "healthy" gekennzeichnet ist depends_on: crowdsec: condition: service_healthy # Pfad zur .env-Datei für den Traefik CrowdSec Bouncer-Dienst env_file: ./config/traefik-crowdsec-bouncer.env # Der Hostname des Containers, kann über eine Umgebungsvariable angepasst werden hostname: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_HOSTNAME:-traefik-crowdsec-bouncer} # Docker-Image, das für den Container verwendet wird. Die Version kann über eine Umgebungsvariable angepasst werden image: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE:-fbonalair/traefik-crowdsec-bouncer}:${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE_VERSION:-latest} # Netzwerke, zu denen der Container gehört networks: crowdsec: # Feste IPv4-Adresse für den Container in diesem Netzwerk ipv4_address: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV4:-172.31.254.252} # Restart-Strategie für den Container. 'unless-stopped' bedeutet, dass der Container immer neu gestartet wird, es sei denn, er wird manuell gestoppt restart: unless-stopped
# Definition der Netzwerke, die von den Services verwendet werden networks: # Definition des 'proxy' Netzwerks proxy: # Der Name des Netzwerks, kann über eine Umgebungsvariable angepasst werden name: ${NETWORKS_PROXY_NAME:-proxy} # Der Treiber, der für das Netzwerk verwendet wird, hier ist es 'bridge' driver: bridge # IP-Adress-Management-Konfiguration (IPAM) ipam: # Konfiguration des IP-Adress-Subnetzes für das Netzwerk config: - subnet: ${NETWORKS_PROXY_SUBNET_IPV4:-172.30.0.0/16} # Wenn 'attachable' auf 'true' gesetzt ist, können Standalone-Container an dieses Netzwerk angehängt werden attachable: true # Definition des 'crowdsec' Netzwerks crowdsec: # Der Name des Netzwerks, kann über eine Umgebungsvariable angepasst werden name: ${NETWORKS_CROWDSEC_NAME:-crowdsec} # Der Treiber, der für das Netzwerk verwendet wird, hier ist es 'bridge' driver: bridge # IP-Adress-Management-Konfiguration (IPAM) ipam: # Konfiguration des IP-Adress-Subnetzes für das Netzwerk config: - subnet: ${NETWORKS_CROWDSEC_SUBNET_IPV4:-172.31.0.0/16} # Wenn 'attachable' auf 'true' gesetzt ist, können Standalone-Container an dieses Netzwerk angehängt werden attachable: true
version: "3.9" services: crowdsec: container_name: ${SERVICES_CROWDSEC_CONTAINER_NAME:-crowdsec} env_file: ./config/crowdsec.env hostname: ${SERVICES_CROWDSEC_HOSTNAME:-crowdsec} healthcheck: test: ["CMD", "cscli", "version"] interval: 20s timeout: 2s retries: 5 start_period: 10s image: ${SERVICES_CROWDSEC_IMAGE:-crowdsecurity/crowdsec}:${SERVICES_CROWDSEC_IMAGE_VERSION:-latest} networks: crowdsec: ipv4_address: ${SERVICES_CROWDSEC_NETWORKS_CROWDSEC_IPV4:-172.31.254.254} restart: unless-stopped security_opt: - no-new-privileges=true volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /var/log/auth.log:/var/log/auth.log:ro - /var/log/traefik:/var/log/traefik:ro - ./crowdsec/config:/etc/crowdsec - ./crowdsec/data:/var/lib/crowdsec/data traefik: container_name: ${SERVICES_TRAEFIK_CONTAINER_NAME:-traefik} depends_on: crowdsec: condition: service_healthy env_file: ./config/traefik.env hostname: ${SERVICES_TRAEFIK_HOSTNAME:-traefik} healthcheck: test: ["CMD", "traefik", "healthcheck", "--ping"] interval: 10s timeout: 1s retries: 3 start_period: 10s image: ${SERVICES_TRAEFIK_IMAGE:-traefik}:${SERVICES_TRAEFIK_IMAGE_VERSION:-2.10} labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.traefik.entrypoints: websecure traefik.http.routers.traefik.middlewares: default@file traefik.http.routers.traefik.rule: Host(${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST}) traefik.http.routers.traefik.service: api@internal traefik.http.routers.traefik.tls: "true" traefik.http.routers.traefik.tls.certresolver: http_resolver traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly: "true" traefik.http.services.traefik.loadbalancer.sticky.cookie.secure: "true" traefik.http.routers.pingweb.rule: PathPrefix(`/ping`) traefik.http.routers.pingweb.service: ping@internal traefik.http.routers.pingweb.entrypoints: websecure networks: crowdsec: ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV4:-172.31.254.253} proxy: ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_PROXY_IPV4:-172.30.255.254} ports: - mode: host target: 80 published: "80" protocol: tcp - mode: host target: 443 published: "443" protocol: tcp restart: unless-stopped security_opt: - no-new-privileges:true volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /var/log/traefik/:/var/log/traefik/ - ./traefik/traefik.yml:/traefik.yml:ro - ./traefik/acme_letsencrypt.json:/acme_letsencrypt.json - ./traefik/tls_letsencrypt.json:/tls_letsencrypt.json - ./traefik/dynamic_conf.yml:/dynamic_conf.yml traefik_crowdsec_bouncer: container_name: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_CONTAINER_NAME:-traefik_crowdsec_bouncer} depends_on: crowdsec: condition: service_healthy env_file: ./config/traefik-crowdsec-bouncer.env hostname: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_HOSTNAME:-traefik-crowdsec-bouncer} image: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE:-fbonalair/traefik-crowdsec-bouncer}:${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE_VERSION:-latest} networks: crowdsec: ipv4_address: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV4:-172.31.254.252} restart: unless-stopped networks: proxy: name: ${NETWORKS_PROXY_NAME:-proxy} driver: bridge ipam: config: - subnet: ${NETWORKS_PROXY_SUBNET_IPV4:-172.30.0.0/16} attachable: true crowdsec: name: ${NETWORKS_CROWDSEC_NAME:-crowdsec} driver: bridge ipam: config: - subnet: ${NETWORKS_CROWDSEC_SUBNET_IPV4:-172.31.0.0/16} attachable: true
Es ist zu beachten, dass wir nun keine direkten Änderungen an der docker-compose.yml
Datei mehr vornehmen müssen. Die meisten Einstellungen, einschließlich der Container-Namen, Hostnamen, Netzwerkeinstellungen und verwendeten Docker-Images, werden im nächsten Schritt über Umgebungsvariablen in einer .env
Datei definiert.
3.3. DOTENV Konfiguration
In diesem Schritt bearbeiten wir die .env
Datei, um die Dienste und Netzwerkeinstellungen anzupassen.
nano /opt/containers/traefik-crowdsec-stack/.env
Hier ist unser Setup:
# Service Crowdsec SERVICES_CROWDSEC_CONTAINER_NAME=crowdsec SERVICES_CROWDSEC_HOSTNAME=crowdsec SERVICES_CROWDSEC_IMAGE=crowdsecurity/crowdsec SERVICES_CROWDSEC_IMAGE_VERSION=latest SERVICES_CROWDSEC_NETWORKS_CROWDSEC_IPV4=172.31.254.254 # Service Traefik SERVICES_TRAEFIK_CONTAINER_NAME=traefik SERVICES_TRAEFIK_HOSTNAME=traefik SERVICES_TRAEFIK_IMAGE=traefik SERVICES_TRAEFIK_IMAGE_VERSION=2.10 SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=`traefik.DeineDomainHier.de` SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV4=172.31.254.253 SERVICES_TRAEFIK_NETWORKS_PROXY_IPV4=172.30.255.254 # Service Traefik Crowdsec Bouncer SERVICES_TRAEFIK_CROWDSEC_BOUNCER_CONTAINER_NAME=traefik_crowdsec_bouncer SERVICES_TRAEFIK_CROWDSEC_BOUNCER_HOSTNAME=traefik-crowdsec-bouncer SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE=fbonalair/traefik-crowdsec-bouncer SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE_VERSION=latest SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV4=172.31.254.252 # Netzwerkeinstellungen NETWORKS_PROXY_NAME=proxy NETWORKS_PROXY_SUBNET_IPV4=172.30.0.0/16 NETWORKS_CROWDSEC_NAME=crowdsec NETWORKS_CROWDSEC_SUBNET_IPV4=172.31.0.0/16
Bis auf eine Ausnahme ist dieses Beispielsetup bereits optimiert und erfordert keine weiteren Anpassungen, um richtig zu funktionieren. Die einzige Zeile, die du anpassen musst, ist SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST
. Hier definierst du die eigene Domain für das Traefik-Dashboard. Denke daran, `traefik.DeineDomainHier.de`
durch die tatsächliche Domain zu ersetzen, welche auch via A oder CNAME auf den richtigen Server zeigt, die du für das Traefik-Dashboard verwenden möchtest.
Achtung! Die ``
sind unabdingbar! Hier könnten aber auch mehrere Domains definiert werden:
SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=`traefik.DeineDomainHier.de`,`www.traefik.DeineDomainHier.de`
3.4. Erläuterung zur Konfiguration
3.4.1. Healthchecks
Unsere Konfiguration nutzt Healthchecks für Traefik und CrowdSec. Healthchecks sind praktische Funktionen, die uns ermöglichen zu überprüfen, ob ein Service ordnungsgemäß läuft. Wenn ein Healthcheck fehlschlägt, weiß Docker, dass mit diesem Service etwas nicht stimmt, und kann entsprechend reagieren.
Die Healthchecks sind in diesem Kontext besonders wichtig, weil wir mit ihnen und der depends_on
-Funktion die Reihenfolge und Abhängigkeiten der einzelnen Services in unserem Stack besser kontrollieren können.
Die depends_on
-Option erlaubt es uns, die Startreihenfolge unserer Container festzulegen. Ein Container, der von einem anderen Container abhängt, wird erst gestartet, wenn der abhängige Container vollständig hochgefahren und betriebsbereit ist. Mit Healthchecks können wir sicherstellen, dass ein Service nicht nur gestartet wurde, sondern tatsächlich ordnungsgemäß funktioniert, bevor wir einen abhängigen Service starten.
In unserem Fall sorgt dies dafür, dass der Traefik und CrowdSec vollständig betriebsbereit sind, bevor der Traefik CrowdSec Bouncer gestartet wird, was uns dabei hilft, sicherzustellen, dass unser Stack stabil und zuverlässig läuft.
3.4.2. Netzwerkkonfiguration
In unserer Konfiguration vergeben wir für die beiden Netzwerke proxy
und crowdsec
spezifische IP-Adressbereiche. Zudem weisen wir den drei Services jeweils feste IP-Adressen zu, die sich am Ende des jeweils verfügbaren IP-Bereichs befinden. Aber warum machen wir das eigentlich?
Der IP-Adressbereich jedes Netzwerks wird festgelegt, um eine gewisse Konsistenz in unserer Setup-Konfiguration zu gewährleisten. Wir weisen jeder Service-Instanz im jeweiligen Netzwerk eine spezifische IP-Adresse zu, die sich am Ende des verfügbaren IP-Bereichs befindet. Dadurch stellen wir sicher, dass die IP-Adressen der Services konstant bleiben und es unwahrscheinlich ist, dass sie versehentlich von Docker’s DHCP-Dienst einem anderen Container zugewiesen werden. Dies könnte zu Adresskonflikten führen.
Zudem benötigen viele Systeme, wie zum Beispiel WordPress, die als Docker-Container laufen, die genaue IP-Adresse des Proxy-Servers (in unserem Fall Traefik). Sollte diese IP-Adresse nicht festgelegt sein, können Fehlfunktionen auftreten. Das liegt daran, dass sich die IP-Adresse bei einem neuen DHCP-Lease ändern könnte, was dazu führen würde, dass die Einstellungen von WordPress oder ähnlichen Systemen nicht mehr korrekt wären.
Durch die Festlegung von spezifischen IP-Adressbereichen und die Zuweisung von IP-Adressen am Ende dieser Bereiche an unsere Services sorgen wir für eine stabile und konsistente Netzwerkkonfiguration. Dies ermöglicht es uns, später weitere Container sicher hinzuzufügen, die dann vom Docker-Netzwerk-DHCP eine Adresse aus dem Anfangsbereich des Netzwerks zugewiesen bekommen können.
3.4.3. Neustart und Abhängigkeiten
Unsere Verwendung eines Docker Stacks bietet weitere Vorteile in Bezug auf die Wartung und Zuverlässigkeit unseres Systems. Innerhalb eines Docker Stacks werden alle definierten Netzwerke und Dienste als zusammenhängende Einheit behandelt. Das bedeutet, dass bei einem Neustart des Stacks alle Dienste in der korrekten Reihenfolge und mit den notwendigen Abhängigkeiten hochgefahren werden.
Durch diese Organisation wird sichergestellt, dass, falls das System neu gestartet werden muss oder aus irgendeinem Grund ausfällt, alle Dienste und Netzwerke ordnungsgemäß und in der korrekten Reihenfolge wieder hergestellt werden.
Das trägt nicht nur zu einem stabileren System bei, sondern erleichtert auch die Wartung, da wir nicht manuell jeden Dienst in einer bestimmten Reihenfolge starten müssen. Der Docker Stack kümmert sich automatisch darum, was letztlich Zeit spart und das Risiko von Fehlern reduziert.
4. Traefik-Konfiguration
4.1. Konfiguration der traefik.yml
Jetzt widmen wir uns der Konfigurationsdatei traefik.yml
. In dieser Datei setzen wir statische Konfigurationsoptionen fest.
nano /opt/containers/traefik-crowdsec-stack/traefik/traefik.yml
Hier ein unsere Konfiguration:
api: dashboard: true metrics: prometheus: addRoutersLabels: true certificatesResolvers: http_resolver: acme: email: "[email protected]" storage: "acme_letsencrypt.json" httpChallenge: entryPoint: web tls_resolver: acme: email: "[email protected]" storage: "tls_letsencrypt.json" tlsChallenge: {} entryPoints: ping: address: ':88' web: address: ':80' http: redirections: entryPoint: to: websecure scheme: https middlewares: - traefik-crowdsec-bouncer@file websecure: address: ':443' http: middlewares: - traefik-crowdsec-bouncer@file proxyProtocol: trustedIPs: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 forwardedHeaders: trustedIPs: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 ping: entryPoint: "ping" global: checknewversion: true sendanonymoususage: false experimental: plugins: real-ip: moduleName: github.com/Paxxs/traefik-get-real-ip version: "v1.0.2" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false network: "proxy" file: filename: "./dynamic_conf.yml" watch: true providersThrottleDuration: 10s log: level: "INFO" filePath: "/var/log/traefik/traefik.log" accessLog: filePath: "/var/log/traefik/access.log" bufferingSize: 100
Beachte bitte, dass du die E-Mail-Adressen unter certificatesResolvers
zwei mal anpasst. Sie dienen als Kontaktinformationen für Let’s Encrypt und sollten daher auf eine gültige E-Mail-Adresse gesetzt sein, die du kontrollierst.
Hinweis! An dieser Stelle darf nur eine E-Mail-Adresse gesetzt werden. Zwei unterschiedliche führen zu einem Fehler:
traefik.go:81: command traefik error: unable to initialize certificates resolver "tls_resolver", all the acme resolvers must use the same email
4.2. Konfiguration der dynamic_conf.yml
Jetzt widmen wir uns der Konfigurationsdatei dynamic_conf.yml
. In dieser Datei setzen wir statische Konfigurationsoptionen fest.
nano /opt/containers/traefik-crowdsec-stack/traefik/dynamic_conf.yml
Hier ein unsere Konfiguration:
tls: options: default: minVersion: VersionTLS12 cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 curvePreferences: - CurveP521 - CurveP384 sniStrict: true http: middlewares: default: chain: middlewares: - default-security-headers - gzip default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" gzip: compress: {} traefik-crowdsec-bouncer: forwardauth: address: http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth trustForwardHeader: true real-ip-cf: plugin: real-ip: Proxy: - proxyHeadername: "*" realIP: Cf-Connecting-Ip OverwriteXFF: true
4.3. Erläuterung zu Traefik-Konfiguration
4.3.1. Änderung im ACME-Bereich
Unter dem Abschnitt certificatesResolvers
haben wir den Bezeichner für den HTTP-Resolver von http
in http_resolver
geändert.
certificatesResolvers: http_resolver: acme: email: "[email protected]" storage: "acme_letsencrypt.json" httpChallenge: entryPoint: web
Der Grund für diese Änderung ist, die Klarheit und Verständlichkeit der Konfigurationsdatei zu verbessern. Da der Begriff http
an mehreren Stellen in der traefik.yml
Konfiguration verwendet wird, kann dies zu Verwirrung führen. Durch die Umbenennung in http_resolver
verdeutlichen wir, dass es sich hier speziell um den Mechanismus zur Erstellung des Zertifikats handelt, nicht um den allgemeinen HTTP-Eintrag unter entryPoints
. Dies trägt zur Verbesserung der Lesbarkeit und des Verständnisses der Konfiguration bei.
4.3.2. Hinzufügen des tls_resolver
Unter dem Abschnitt certificatesResolvers
haben wir nun auch einen TLS-Resolver: tls_resolver
tls_resolver: acme: email: "[email protected]" storage: "tls_letsencrypt.json" tlsChallenge: {}
Die TLS-Challenge (oder TLS-ALPN-01 Challenge) ist eine moderne und effektive Methode zur Überprüfung der Domainkontrolle für die Ausstellung von Let’s Encrypt-Zertifikaten. Sie nutzt eine spezielle TLS-Erweiterung namens “Application-Layer Protocol Negotiation” (ALPN) zur Kommunikation mit dem Let’s Encrypt-Validierungsserver während des TLS-Handshakes.
Für die Entwicklung von Python-Webanwendungen, insbesondere solchen, die auf dem Flask-Framework basieren, kann die Verwendung eines TLS-Resolvers besonders vorteilhaft sein. Viele solcher Anwendungen laufen auf Port 443 und profitieren daher von der Verwendung der TLS-Challenge zur Zertifikatserzeugung.
Wichtig zu beachten ist, dass die Verwendung der TLS-Challenge spezifische Anforderungen an die Server- und Netzwerkkonfiguration stellt. Unter anderem muss Ihr Server den ALPN-Erweiterungsstandard unterstützen und Port 443 muss in Ihrer Firewall offen sein. Daher ist es empfehlenswert, die Eignung Ihrer Server- und Netzwerkkonfiguration zu überprüfen, bevor Sie sich für die Verwendung der TLS-Challenge entscheiden.
4.3.3. Überarbeitung der EntryPoints
In unserem aktualisierten Setup haben wir einige Anpassungen an den entryPoints vorgenommen. Insbesondere haben wir den Namen des http
entryPoint zu web
und den https
entryPoint zu websecure
geändert.
entryPoints: ping: address: ":88" web: address: ":80" http: redirections: entryPoint: to: "websecure" scheme: "https" middlewares: - traefik-crowdsec-bouncer@file websecure: address: ":443" http: middlewares: - traefik-crowdsec-bouncer@file proxyProtocol: trustedIPs: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 forwardedHeaders: trustedIPs: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16
Diese Änderungen sind hauptsächlich aus Kompatibilitäts- und Klarheitsgründen durchgeführt worden. Die offizielle Dokumentation von Traefik verwendet in der Regel web
und websecure
als entryPoint-Namen, und durch die Einhaltung dieser Benennungskonvention werden unsere Konfigurationen leichter verständlich für jeden, der mit Traefik vertraut ist. Darüber hinaus erleichtert die Einhaltung der offiziellen Benennungskonventionen das Verständnis und die Anwendung der offiziellen Traefik-Dokumentation.
Es ist wichtig zu beachten, dass trotz der Namensänderungen die Funktionalität der entryPoints gleich bleibt – web
leitet den unverschlüsselten HTTP-Verkehr auf Port 80 und websecure
handhabt den verschlüsselten HTTPS-Verkehr auf Port 443.
4.3.4. Anpassung der Middleware-Namen
In der neuesten Version der Konfiguration haben wir die Middleware für beide Einträge web
und websecure
aktualisiert. Die Middleware wurde von crowdsec-bouncer@file
auf traefik-crowdsec-bouncer@file
geändert.
entryPoints: ... web: ... http: middlewares: - traefik-crowdsec-bouncer@file websecure: ... http: middlewares: - traefik-crowdsec-bouncer@file
Der Grund für diese Änderung liegt in der klaren Namensführung und Übersichtlichkeit. Der Name traefik-crowdsec-bouncer
verdeutlicht, dass dieser Bouncer speziell für Traefik konzipiert ist. Dies ist besonders wichtig, da es verschiedene Bouncer für unterschiedliche Anwendungen und Kontexte gibt. Ein klares und explizites Benennen erleichtert das Verständnis und die Wartung des Setups.
5. CrowdSec-Konfiguration
5.1. Konfiguration der crowdsec.env
Zur Konfiguration von CrowdSec bearbeiten wir die Datei config/crowdsec.env
. Diese Datei ist essentiell, um die Umgebungsvariablen übersichtlich und zentral zu definieren. Durch die Auslagerung dieser Definitionen in eine separate Datei, bleibt unser Setup klar strukturiert und wartungsfreundlich.
nano /opt/containers/traefik-crowdsec-stack/config/crowdsec.env
Dort definieren wir ein paar Environments welche wir in CrowdSec benötigen:
PGID="1000" COLLECTIONS="crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors crowdsecurity/postfix crowdsecurity/dovecot crowdsecurity/nginx"
PGID
: Dies steht für “Group ID” und bestimmt, unter welcher Gruppen-ID der CrowdSec-Prozess ausgeführt wird. Im vorliegenden Fall ist das die Gruppen-ID “1000”. Die Gruppen-ID sollte der ID einer existierenden Gruppe in deinem System entsprechen, die die benötigten Zugriffsrechte hat.COLLECTIONS
: Dies ist eine Liste von sogenannten “Collection”-Namen. Eine Collection in CrowdSec ist eine Gruppe von Szenarien, Parsern und Post-Overflows, die einen bestimmten Zweck erfüllen. Im vorliegenden Fall werden die folgenden Collections verwendet:crowdsecurity/traefik
: Diese Collection ist speziell für die Überwachung und den Schutz von Traefik, einem modernen Reverse-Proxy und Load-Balancer.crowdsecurity/http-cve
: Diese Collection enthält Szenarien zur Erkennung von bekannten Schwachstellen und Angriffen (CVEs) auf HTTP-Server.crowdsecurity/whitelist-good-actors
: Eine Collection, die dafür sorgt, dass bekannte “gute” Akteure nicht fälschlicherweise als bösartig erkannt werden.crowdsecurity/postfix
undcrowdsecurity/dovecot
: Diese beiden Collections sind speziell für die Überwachung und den Schutz von Postfix- und Dovecot-Mailservern.crowdsecurity/nginx
: Eine Collection, die speziell für die Überwachung und den Schutz von Nginx-Webservern entwickelt wurde.
Diese Umgebungsvariablen sind entscheidend für die Konfiguration von CrowdSec. Sie ermöglichen es, das Verhalten von CrowdSec fein abzustimmen und an die spezifischen Anforderungen deines Systems anzupassen. Es ist wichtig, diese Werte sorgfältig zu überprüfen und zu aktualisieren, um die bestmögliche Sicherheit zu gewährleisten.
5.2. Konfiguration der acquis.yaml
Zu diesem Zeitpunkt könntest du bemerkt haben, dass wir bisher keine acquis.yaml
-Datei angelegt haben. Der Grund dafür ist, dass diese Datei Teil der Ressourcen ist, die das Docker-Image von CrowdSec bereitstellt. Um die Konfigurationsdateien von CrowdSec zu generieren, müssen wir den CrowdSec-Dienst kurz starten. Dazu wechseln wir zunächst in das Verzeichnis unserer Docker-Compose-Datei für den Traefik-CrowdSec-Stack und starten dann den Dienst:
cd /opt/containers/traefik-crowdsec-stack docker compose up crowdsec -d && docker compose down
Mit dem Befehl docker compose up crowdsec -d
starten wir den CrowdSec-Dienst im Hintergrundmodus. Schließlich beenden wir den Dienst wieder mit docker compose down
.
Jetzt sollten alle Konfigurationsdateien von CrowdSec vorhanden sein und wir können nun die acquis.yaml
-Datei nach anpassen. In der acquis.yaml
-Datei werden die Log-Dateien definiert welche eingelesen und beobachtet werden sollen. Hier ist es wichtig, dass die Logdateien und Services auch in CrowdSec eingebunden sind. Dies habe ich in dieser Anleitung bereits in der docker-compose.yml
angelegt:
version: "3.9" services: crowdsec: ... volumes: ... # Hier wird die auth.log vom System in CrowdSec eingebracht - /var/log/auth.log:/var/log/auth.log:ro # Hier wird die der Ordner in den Traefik seine Logs schreibt in CrowdSec eingebracht - /var/log/traefik:/var/log/traefik:ro ... traefik: ... volumes: ... # Hier wird der Ordner in den Traefik seine Logs schreibt auf den Host gemounted - /var/log/traefik/:/var/log/traefik/ ... ... ...
Nun zur acquis.yaml
-Datei. Die haben wir nun generiert. Nach aktuellem Stand sieht diese so aus:
filenames: - /var/log/nginx/*.log - ./tests/nginx/nginx.log #this is not a syslog log, indicate which kind of logs it is labels: type: nginx --- filenames: - /var/log/auth.log - /var/log/syslog labels: type: syslog --- filename: /var/log/apache2/*.log labels: type: apache2
Wir passen diese nun an unsere Bedürfnisse an und dafür öffnen wir sie mit nano
.
nano /opt/containers/traefik-crowdsec-stack/crowdsec/config/acquis.yaml
Dort fügen wir folgendes ein bzw. ersetzen den vorhandenen Inhalt:
filenames: - /var/log/auth.log - /var/log/syslog labels: type: syslog --- filenames: - /var/log/traefik/*.log labels: type: traefik ---
In ersten Abschnitt der Konfigurationsdatei werden die auth.log
und syslog
Dateien zur Analyse hinzugefügt. Das Label “syslog” wird diesen Dateien zugeordnet. Dies ermöglicht es CrowdSec, bestimmte Analysemethoden auf diese Dateien anzuwenden, die für syslog-Logs geeignet sind.
Im zweiten Abschnitt der Konfigurationsdatei fügen wir alle Logdateien hinzu, die im Verzeichnis /var/log/traefik/
liegen und deren Dateinamen mit .log
enden. Diesen Dateien weisen wir das Label “traefik” zu. So kann CrowdSec spezifische Analysemethoden anwenden, die für Traefik-Logs geeignet sind.
6. Traefik und Crowdsec verheiraten – der Bouncer
CrowdSec hat nun die Fähigkeit, Logdateien zu analysieren und verdächtige IP-Adressen in eine Sperrliste aufzunehmen – das ist ein großer Schritt! Doch in der aktuellen Konfiguration haben wir noch keine Maßnahmen ergriffen, um potenzielle Angriffe tatsächlich abzuwehren. Das ist die Aufgabe sogenannter “Bouncer” in CrowdSec.
Es gibt eine Vielzahl an verschiedenen Bouncern für diverse Einsatzgebiete: Es gibt zum Beispiel Bouncer für Firewalls wie iptables oder nftables, und es gibt auch Bouncer zur Steuerung der Firewall von Cloudflare. Für unseren konkreten Anwendungsfall ist jedoch der Traefik Bouncer besonders interessant, da er die Fähigkeit hat, speziell mit unserem Traefik Load Balancer zu interagieren.
6.1. Traefik CrowdSec Bouncer
Wie du vielleicht bemerkt hast, haben wir in der zu Beginn definierten Docker-Compose-Datei bereits alle notwendigen Komponenten für den Traefik CrowdSec Bouncer unter dem Abschnitt services -> traefik_crowdsec_bouncer
eingefügt.
An dieser Stelle brauchen wir nur noch die zugehörige .env-Datei, die wir zuvor erstellt haben, um zwei weitere Werte zu erweitern in dem wir die Datei mit nano
öffnen:
nano /opt/containers/traefik-crowdsec-stack/config/traefik-crowdsec-bouncer.env
Jetzt fügen wir folgende Variablen ein:
# Access-Token damit Bouncer und CrowdSec kommunizieren können CROWDSEC_BOUNCER_API_KEY= # Hostname mit richtigem Port von CrowdSec CROWDSEC_AGENT_HOST=${SERVICES_CROWDSEC_HOSTNAME}:8080 # Bei Debian funktioniert ${SERVICES_CROWDSEC_HOSTNAME} nicht # In Debian müssen wir ${SERVICES_CROWDSEC_HOSTNAME} durch einen Wert ersetzen: # CROWDSEC_AGENT_HOST=crowdsec:8080 # alternativ: # CROWDSEC_AGENT_HOST=172.31.254.254:8080
6.1.1. Access Token anlegen
In der traefik-crowdsec-bouncer.env
haben wir die Variable CROWDSEC_BOUNCER_API_KEY
angelegt und um diese mit einem Access-Token bzw. API-Key auch nutzen zu können müssen wir diesen wie folgt generieren:
cd /opt/containers/traefik-crowdsec-stack docker compose up crowdsec -d docker compose exec -t crowdsec cscli bouncers add traefik-crowdsec-bouncer docker compose down
So, oder so ähnlich sollte die Ausgabe aussehen:
[+] Running 3/3 ✔ Network crowdsec Created 0.1s ✔ Network proxy Created 0.1s ✔ Container crowdsec Started 0.4s Api key for 'traefik-crowdsec-bouncer': ee21c448d67e04550dec5b07b42ad6ee Please keep this key since you will not be able to retrieve it! [+] Running 3/3 ✔ Container crowdsec Removed 10.2s ✔ Network crowdsec Removed 0.2s ✔ Network proxy Removed
Nun speichern wir uns den generierten Schlüssel (in diesem Beispiel: ee21c448d67e04550dec5b07b42ad6ee
) in die Zwischenablage und fügen via nano
in unsere config/traefik-crowdsec-bouncer.env
.
# Access-Token damit Bouncer und CrowdSec kommunizieren können CROWDSEC_BOUNCER_API_KEY=ee21c448d67e04550dec5b07b42ad6ee # Hostname mit richtigem Port von CrowdSec CROWDSEC_AGENT_HOST=${SERVICES_CROWDSEC_HOSTNAME}:8080 # Bei Debian funktioniert ${SERVICES_CROWDSEC_HOSTNAME} nicht # In Debian müssen wir ${SERVICES_CROWDSEC_HOSTNAME} durch einen Wert ersetzen: # CROWDSEC_AGENT_HOST=crowdsec:8080 # alternativ: # CROWDSEC_AGENT_HOST=172.31.254.254:8080
6.1.2. Traefik kontrollieren
Wie wir bereits in einem früheren Abschnitt dieser Anleitung festgelegt haben, wird in der dynamic_conf.yml
-Datei die traefik-crowdsec-bouncer
-Konfiguration definiert:
traefik-crowdsec-bouncer: forwardauth: address: http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth trustForwardHeader: true
Dieser Abschnitt ermöglicht es Traefik, mit dem CrowdSec Bouncer zu kommunizieren. Hierbei müssen wir sicherstellen, dass der unter address
angegebene Hostname dem entspricht, den wir in der .env-Datei unter folgendem Punkt definiert haben:
SERVICES_TRAEFIK_CROWDSEC_BOUNCER_HOSTNAME=traefik-crowdsec-bouncer
Leider ist es in dieser Konfiguration nicht ohne Weiteres möglich, die Variable direkt zu setzen. Alternativ kann hier jedoch auch die IP-Adresse, die unter:
SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV4=172.31.254.252
definiert ist, verwendet werden.
In der traefik.yml
-Datei haben wir unter entryPoints
Traefik angewiesen, bei jeder Anfrage, die über den jeweiligen Point web
bzw. websecure
kommt, diese direkt über die Middleware an den Bouncer zu senden:
entryPoints: web: address: ":80" http: redirections: entryPoint: to: "websecure" scheme: "https" middlewares: - traefik-crowdsec-bouncer@file websecure: address: ":443" http: middlewares: - traefik-crowdsec-bouncer@file
Diese Konfiguration gewährleistet letztendlich das erfolgreiche Zusammenspiel zwischen allen Komponenten. Traefik kommuniziert mit dem Bouncer, der wiederum mit CrowdSec kommuniziert. Diese strukturierte Kommunikation zwischen den Komponenten sorgt dafür, dass potenziell schädliche Anfragen effektiv blockiert werden.
7. Dienst starten
Uff! Das war wirklich eine lange und gründliche Anleitung bis jetzt. Ich habe mein Bestes gegeben, um viele Aspekte direkt zu erläutern und das Verständnis der Funktionsweise sowie des Aufbaus des Stacks zu erleichtern.
Jetzt, bevor wir mit dem Starten des Dienstes fortfahren, möchte ich dich bitten: Nimm dir einen Moment Zeit, geh nochmal alle Schritte durch und prüfe, ob alle Dateien richtig erstellt und mit dem passenden Inhalt gefüllt wurden.
Also, gönn dir eine kleine Pause, streck dich mal und gönn deinen Augen eine kurze Verschnaufpause vom Bildschirm. Dann, mit frischem Blick und voller Energie, können wir uns dem nächsten Schritt zuwenden. Und keine Sorge, wir sind schon fast am Ziel!
☕️☕️☕️
Bereit?
cd /opt/containers/traefik-crowdsec-stack docker compose up -d
🚀🚀🚀 Fertig, oder?
So, wir sind fast durch, aber es gibt noch ein paar Dinge, die wir erledigen müssen. Was fehlt? Die Überprüfung und die bereits angekündigte Migration der alten Anleitung zu diesem Setup.
Außerdem werde ich noch einige optionale Dinge hinzufügen. Es handelt sich dabei um Extras, die nicht unbedingt notwendig sind, aber je nach deinen spezifischen Anforderungen nützlich sein könnten. Bleib also dran und lass uns diese letzten Schritte gemeinsam erledigen!
8. Überprüfung
Natürlich sollten wir zwischendurch und gemäß dieser Anleitung immer wieder überprüfen, ob alles funktioniert, wie es sollte. Das tun wir jetzt nach all diesen Schritten.
Wir haben den Container ja bereits gestartet. Als erstes überprüfen wir, ob alle Container als “healthy” (gesund) markiert sind:
cd /opt/containers/traefik-crowdsec-stack docker compose ps
root@mail:/opt/containers/traefik-crowdsec-stack# docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS crowdsec crowdsecurity/crowdsec:latest "/bin/sh -c '/bin/ba…" crowdsec 3 days ago Up 19 hours (healthy) traefik traefik:2.10 "/entrypoint.sh trae…" traefik 3 days ago Up 22 hours (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp traefik_crowdsec_bouncer fbonalair/traefik-crowdsec-bouncer:latest "/app" traefik_crowdsec_bouncer 3 days ago Up 3 days (healthy) root@mail:/opt/containers/traefik-crowdsec-stack#
Wenn wir alles richtig gemacht haben, sind alle Container als “healthy” markiert.
Dann rufen wir das Traefik-Dashboard mit der zuvor festgelegten URL auf. Das Dashboard sollte sich öffnen und auch ein valides LE-Zertifikat haben.
Beim Öffnen des Dashboards werden auch Logdateien erstellt, und diese überprüfen wir als nächstes:
cd /var/log/traefik ls -all cat traefik.log cat access.log
Hier sollten wir idealerweise die Dateien traefik.log
und access.log
finden, und in beide sollte etwas geschrieben sein. Wenn die Datei access.log nicht vorhanden ist, ist das kein Beinbruch, sollte aber beobachtet werden.
Wenn das alles passt, betrachten wir mit dem Befehl:
docker exec crowdsec cscli metrics
die ganz oben stehenden Acquisition Metrics
. Dort sollte nun die traefik.log
aufgeführt sein. Wenn die Datei access.log
im System vorhanden ist, sollte sie ebenfalls dort erscheinen.
Sollte etwas nicht funktionieren schaue als erstes “Hinweis zu Kommentaren” an ☕️
9. Optional
Es gibt noch einige optionale Punkte. Diesen Bereich werde ich nach und nach erweitern bzw. auf vorhandene Anleitungen verweisen!
9.1. CrowdSec aktuell halten
Die benutzten COLLECTIONS werden überwiegend durch die Community gepflegt und natürlich auch auf neue Crowdsec-Versionen angepasst. Damit wir nicht in einen Fehler laufen oder eine veraltet COLLECTION verwenden ist es Sinnvoll diese regelmäßig zu aktualisieren. Dazu legen wir uns einen Cronjob an:
crontab -e
Dieser Cronjob wird jeden Tag um 03:00 Uhr aufgerufen, aktualisiert die Pakete aus dem CrowdSec Hub und läd die Konfiguration neu.
0 3 * * * docker exec crowdsec cscli hub update && docker exec crowdsec cscli hub upgrade --force && docker exec -t crowdsec kill -SIGHUP 1 >/dev/null 2>&1
9.2. Traefik Dashboard schützen
Um das Traefik Dashboard abzusichern und unbefugten Zugriff zu verhindern, wird empfohlen, eine zusätzliche Authentifizierung einzurichten. Dadurch wird eine Benutzername-Passwort-Überprüfung erforderlich, um auf das Dashboard zugreifen zu können.
Traefik bietet eine einfache Methode zur Implementierung der Authentifizierung. Um dies zu erreichen, müssen wir zunächst die folgenden Pakete auf unserem System installieren:
apt update && apt install apache2-utils
Nachdem wir diese Schritte durchgeführt haben, müssen wir innerhalb von Traefik eine Middleware konfigurieren. Bevor wir dies tun, erstellen wir ein Passwort mit dem folgenden Befehl:
echo $(htpasswd -nb DeinUsername 'DeinSuperSicheresPasswort') # Ausgabe DeinUsername:$apr1$xSRxT4UY$wk42WRgVzBW5Pf69sS5aT.
Es wird empfohlen, die Ausgabe zu speichern, zum Beispiel durch Kopieren und Einfügen in eine Textdatei.
9.2.1. dynamic_conf.yml anpassen
Jetzt ist es an der Zeit, die Middleware zu konfigurieren. Dazu öffnen wir die Datei dynamic_conf.yml mit Texteditor:
nano /opt/containers/traefik-crowdsec-stack/traefik/dynamic_conf.yml
Wir befinden uns im Abschnitt “http” -> “middlewares”. Bisher sieht dieser Teil folgendermaßen aus:
... http: middlewares: default: chain: middlewares: - default-security-headers - gzip default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" gzip: compress: {} traefik-crowdsec-bouncer: forwardauth: address: http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth trustForwardHeader: true real-ip-cf: plugin: real-ip: Proxy: - proxyHeadername: "*" realIP: Cf-Connecting-Ip OverwriteXFF: true ...
Nun fügen wir die Konfiguration für unsere Schutzmaßnahmen hinzu:
traefikAuth: basicAuth: users: - "DeinUsername:$apr1$xSRxT4UY$wk42WRgVzBW5Pf69sS5aT."
Hierbei ersetzen wir natürlich “DeinUsername” und “$apr1$xSRxT4UY$wk42WRgVzBW5Pf69sS5aT.” durch die zuvor generierten Werte.
Dieses Snippet fügen wir an beliebiger Stelle in die middlewares ein:
... http: middlewares: default: chain: middlewares: - default-security-headers - gzip default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" gzip: compress: {} traefik-crowdsec-bouncer: forwardauth: address: http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth trustForwardHeader: true real-ip-cf: plugin: real-ip: Proxy: - proxyHeadername: "*" realIP: Cf-Connecting-Ip OverwriteXFF: true traefikAuth: basicAuth: users: - "DeinUsername:$apr1$xSRxT4UY$wk42WRgVzBW5Pf69sS5aT." ...
9.2.2. docker-compose.yml anpassen
Im letzten Schritt müssen wir Anpassungen in der Datei docker-compose.yml vornehmen. Öffnen Sie die Datei mit einem Texteditor:
nano /opt/containers/traefik-crowdsec-stack/docker-compose.yml
Suchen Sie den Abschnitt für Traefik:
traefik: container_name: ${SERVICES_TRAEFIK_CONTAINER_NAME:-traefik} depends_on: crowdsec: condition: service_healthy env_file: ./config/traefik.env hostname: ${SERVICES_TRAEFIK_HOSTNAME:-traefik} healthcheck: test: ["CMD", "traefik", "healthcheck", "--ping"] interval: 10s timeout: 1s retries: 3 start_period: 10s image: ${SERVICES_TRAEFIK_IMAGE:-traefik}:${SERVICES_TRAEFIK_IMAGE_VERSION:-2.10} labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.traefik.entrypoints: websecure traefik.http.routers.traefik.middlewares: default@file traefik.http.routers.traefik.rule: Host(${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST}) traefik.http.routers.traefik.service: api@internal traefik.http.routers.traefik.tls: "true" traefik.http.routers.traefik.tls.certresolver: http_resolver traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly: "true" traefik.http.services.traefik.loadbalancer.sticky.cookie.secure: "true" traefik.http.routers.pingweb.rule: PathPrefix(`/ping`) traefik.http.routers.pingweb.service: ping@internal traefik.http.routers.pingweb.entrypoints: websecure networks: crowdsec: ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV4:-172.31.254.253} proxy: ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_PROXY_IPV4:-172.16.255.254} ports: - "80:80" - "443:443" restart: unless-stopped security_opt: - no-new-privileges:true volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /var/log/traefik/:/var/log/traefik/ - ./traefik/traefik.yml:/traefik.yml:ro - ./traefik/acme_letsencrypt.json:/acme_letsencrypt.json - ./traefik/tls_letsencrypt.json:/tls_letsencrypt.json - ./traefik/dynamic_conf.yml:/dynamic_conf.yml
Innerhalb dieses Abschnitts finden Sie unter “labels” das Label:
traefik.http.routers.traefik.middlewares: default@file
Erweitern Sie diese Zeile nun um unsere gerade erstellte Middleware “traefikAuth”:
traefik.http.routers.traefik.middlewares: default@file,traefikAuth@file
9.2.3 Neustart des Setups
Abschließend führen wir einen Neustart des FullStacks durch und überprüfen anschließend, ob beim Aufruf des Traefik Dashboards nun ein Passwort abgefragt wird.
Wechseln Sie zum Verzeichnis des Traefik-Crowdsec-Stacks:
cd /opt/containers/traefik-crowdsec-stack
Starten Sie den FullStack neu und erzwingen Sie die Neuerstellung der Container:
docker compose up -d --force-recreate
Nachdem der Neustart abgeschlossen ist, überprüfen Sie, ob beim Aufruf des Traefik Dashboards nun ein Passwort abgefragt wird.
9.3. Erweiterung der Firewall (IP-Tables bzw. UFW) mit CrowdSec
Jetzt wollen wir CrowdSec auf unserem System installieren und die Firewall mithilfe des Bouncers um CrowdSec erweitern. In dieser Anleitung haben wir CrowdSec bereits über Docker in unser System integriert. Doch wir möchten den Firewall-Bouncer direkt auf unserem System installieren und ihn dann mit CrowdSec verknüpfen, das in einem Docker-Container läuft.
9.3.1. Repository für CrowdSec Firewall Bouncer
Um den Firewall Bouncer zu installieren, müssen wir das entsprechende Repository unter Ubuntu (bei Debian nicht notwenig) einbinden. Wir führen den folgenden Befehl aus, um die erforderlichen Repositorys hinzuzufügen:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
Dadurch werden die benötigten Repositorys zu unserem System hinzugefügt.
9.3.2. Installation des Firewall Bouncers
Die Pakete für den CrowdSec Firewall Bouncer sind in unseren Repositories verfügbar. Wir müssen das Paket entsprechend unserem Firewall-System auswählen: IPTables bzw. UFW
Verwenden wir den folgenden Befehl, um den CrowdSec Firewall Bouncer für IPTables bzw. UFW zu installieren:
apt install crowdsec-firewall-bouncer-iptables
9.3.3. Access Token anlegen
Ähnlich wie in Schritt 6.1.1. benötigen wir auch für den CrowdSec Firewall Bouncer für IPTables einen Access Token, um mit CrowdSec kommunizieren zu können. Um diesen Access Token zu erhalten, führen wir die folgenden Schritte aus:
cd /opt/containers/traefik-crowdsec-stack docker compose exec -t crowdsec cscli bouncers add crowdsec-firewall-bouncer-iptables
So könnte die erwartete Ausgabe aussehen:
API-Schlüssel für 'crowdsec-firewall-bouncer-iptables': ee21c448d67e04550dec5b07b42ad6ee Wir müssen beachten, dass wir diesen Schlüssel gut aufbewahren, da wir ihn nicht erneut abrufen können!
Nun speichern wir uns den generierten Schlüssel (in diesem Beispiel: ee21c448d67e04550dec5b07b42ad6ee
) in die Zwischenablage.
9.3.4. Anpassung der Konfiguration
Um die Konfiguration anzupassen, geben wir einfach den folgenden Befehl ein:
nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
Vorher:
api_url: http://127.0.0.1:8080/ api_key:
Nachher:
api_url: http://172.31.254.254:8080/ api_key: ee21c448d67e04550dec5b07b42ad6ee
Hierbei ersetzen wir die Werte für “api_url” und “api_key” entsprechend. Beachtet, dass die euer eigener Access-Token individuell ist und von den oben gezeigten Beispielen abweichen wird.
9.3.5. CrowdSec Firewall Bouncer starten
Jetzt starten wir den Bouncer mit dem folgenden Befehl:
systemctl start crowdsec-firewall-bouncer
Anschließend überprüfen wir den Status mit dem Befehl:
systemctl status crowdsec-firewall-bouncer
Die Ausgabe sollte in etwa wie folgt aussehen:
crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec Loaded: loaded (/etc/systemd/system/crowdsec-firewall-bouncer.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-10-24 23:51:09 CEST; 21s ago Process: 14877 ExecStartPre=/usr/sbin/crowdsec-firewall-bouncer -c /etc/crowdsec/bouncers/crowd .. ..
Dadurch stellen wir sicher, dass der CrowdSec Firewall Bouncer ordnungsgemäß gestartet ist.
9.3.6. Anzeigen der CrowdSec Bouncer-Liste
Jetzt können wir uns alle CrowdSec Bouncer anzeigen lassen, um sicherzustellen, dass unser Firewall Bouncer dort aufgeführt wird.
Führen wir den folgenden Befehl aus:
docker exec crowdsec cscli bouncers list
Das Ergebnis sollte in etwa wie folgt aussehen:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Name IP Address Valid Last API pull Type Version Auth Type ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- traefik-crowdsec-bouncer 172.31.255.252 ✔️ 2023-05-24T21:14:45Z Go-http-client 1.1 api-key crowdsec-firewall-bouncer-iptables 172.31.240.1 ✔️ 2023-05-24T21:15:27Z crowdsec-firewall-bouncer v0.0.27-debian-pragmatic-8d09f19d69e92a63e63888794af3a57c6a- api-key de3489 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Wir müssen beachten, dass die im obigen Beispiel aufgeführten IP-Adressen individuell für unser Setup sind und bei uns andere Werte haben werden.
Damit haben wir bestätigt, dass alles erfolgreich funktioniert hat und unser Firewall Bouncer in der Liste aufgeführt wird.
9.3.7. Auslesen des CrowdSec Firewall Bouncer Logs
Nun werfen wir einen Blick auf das Log des Firewall Bouncers. Dies kann besonders im Fehlerfall sehr hilfreich sein. Geben wir dazu den folgenden Befehl ein:
cat /var/log/crowdsec-firewall-bouncer.log
In den letzten Zeilen sollten wir Informationen sehen, dass unser Bouncer neue Entscheidungen von CrowdSec erhalten hat. Ein Beispiel könnte wie folgt aussehen:
time="24-10-2022 23:51:09" level=info msg="Using API key auth" time="24-10-2022 23:51:09" level=info msg="Processing new and deleted decisions . . ." time="24-10-2022 23:51:09" level=info msg="14 decisions added" time="24-10-2022 23:52:59" level=info msg="1 decision added" time="24-10-2022 23:54:29" level=info msg="1 decision added"
Wir müssen beachten, dass die genauen Informationen in unserem Log individuell sein können und von den oben gezeigten Beispielen abweichen können. Durch das Auslesen des Logs können wir jedoch überprüfen, ob unser Bouncer neue Entscheidungen von CrowdSec erhalten hat.
9.3.8. Automatisches Starten des CrowdSec Firewall Bouncers
Um sicherzustellen, dass unser Firewall Bouncer automatisch bei jedem Serverneustart gestartet wird, können wir einen Cron-Eintrag erstellen. Dadurch ersparen wir uns das manuelle Starten nach jedem Neustart. Credits an @ice-cue für diesen Tipp in der alten Anleitung!
Geben wir den folgenden Befehl ein, um den Cron-Editor zu öffnen:
crontab -e
Dort fügen wir nun folgende Zeile hinzu:
@reboot sleep 120 && systemctl start crowdsec-firewall-bouncer
Mit diesem Befehl wird der CrowdSec Firewall Bouncer 120 Sekunden nach dem Serverneustart gestartet. Dadurch ist gewährleistet, dass unser Firewall Bouncer automatisch beim Start des Servers gestartet wird.
9.3.9. Anzeigen der gebannten IP-Adressen
Wir könnn uns mit einem Befehl alle aktuellen Bans anschauen:
docker exec crowdsec cscli decisions list
9.3.10. Eigene IP-Adresse bannen
Um zu testen, ob alles funktioniert, wollen wir uns selbst bannen. Dadurch haben wir für EINE MINUTE keinen Zugriff mehr auf unseren Server. Zuerst ermitteln wir unsere eigene IP-Adresse mithilfe einer Webseite wie z. B. https://www.wieistmeineip.de/.
Anschließend geben wir den folgenden Befehl ein. Achtet darauf, dass ihr die “1.2.3.4” durch eure eigene IP-Adresse ersetzt:
docker exec crowdsec cscli decisions add --ip 1.2.3.4 --duration 1m
Wenn wir alles richtig gemacht haben, sollten unsere SSH-Verbindung sowie alle anderen Verbindungen zu unserem Server nun eine Minute lang blockiert bzw. gesperrt sein.
Bitte beachtet, dass dies nur zu Testzwecken empfohlen ist und wir sicherstellen sollten, dass wir wieder Zugriff auf unseren Server erhaltet, nachdem der Test abgeschlossen ist.
9.4. Logrotate für Traefik
Es ist bereits bekannt, dass die traefik.log
-Datei sehr schnell wächst, insbesondere wenn das Debug-Level auf “info” gesetzt ist. Das kann schnell zu Speicherplatzproblemen führen, wenn sie nicht gehandhabt wird. Traefik selbst bietet keine eingebaute Log-Rotation-Funktion, aber zum Glück gibt es eine Standardkomponente namens Logrotate in vielen Linux-Distributionen wie Ubuntu, die uns dabei helfen kann.
Bei diesem Inhalt handelt es sich um exklusiven Content für Community Plus Mitglieder und Supporter.
Bitte logge dich mit deinem Account ein um den Inhalt zu sehen.
10. Migration
Ich bin mir ziemlich sicher, dass dieser Beitrag meinen alten Beitrag ersetzen wird. Genau so ist es auch gedacht. Mein Plan ist, den alten Beitrag weiterhin zu erhalten, allerdings mit dem Hinweis, dass es diesen neuen gibt. Weder Christian, ich noch irgendeiner der Co-Autoren wird in der Lage sein, alle Anleitungen zeitnah anzupassen. Deshalb möchte ich hier eine allgemeine Migrationsanleitung beschreiben.
- Für diejenigen, die ihre bisherige Konfiguration bereits individuell verändert haben, gehe ich davon aus, dass sie den Stack gut genug verstanden haben, um ihr Setup selbst zu übertragen.
- Für diejenigen, die einfach nur dankbar sind, dass das alte Setup funktioniert hat, gibt es hier die Migrationsanleitung.
10.1. Neuen Container hinzufügen
Um einen neuen Container über Traefik verfügbar zu machen und gleichzeitig durch CrowdSec zu schützen, müssen wir in der zugehörigen Docker-compose.yml die Ports entfernen und dem entsprechenden Container Labels hinzufügen. Hier ein Beispiel mit WordPress:
Dies ist die docker-compose.yml aus der WordPress-Dokumentation auf hub.docker.com:
version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db:
Dies wird dann zu folgender Konfiguration geändert:
version: '3.1' services: wordpress: environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_NAME: exampledb WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_USER: exampleuser image: wordpress labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.wordpress-secure.entrypoints: websecure traefik.http.routers.wordpress-secure.middlewares: default@file traefik.http.routers.wordpress-secure.rule: Host(`meinwordpress.de`) traefik.http.routers.wordpress-secure.service: wordpress traefik.http.routers.wordpress-secure.tls: "true" traefik.http.routers.wordpress-secure.tls.certresolver: http_resolver traefik.http.routers.wordpress.entrypoints: web traefik.http.routers.wordpress.rule: Host(`meinwordpress.de`) traefik.http.services.wordpress.loadbalancer.server.port: "80" networks: default: null proxy: null restart: always volumes: - wordpress:/var/www/html db: environment: MYSQL_DATABASE: exampledb MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: "1" MYSQL_USER: exampleuser image: mysql:5.7 networks: default: null restart: always volumes: - db:/var/lib/mysql networks: default: proxy: external: true volumes: db: wordpress:
Eine kurze Erklärung dazu: Die Ports müssen nicht mehr explizit freigegeben (exposed) werden, da dies nun Traefik übernimmt. Wir teilen Traefik lediglich über Labels mit, welcher Resolver verwendet werden soll und über welchen Port Traefik auf WordPress zugreifen kann. Zusätzlich muss dem WordPress-Container noch das Traefik-Netzwerk namens “proxy” zugewiesen werden. Allerdings sollte dies nur dem WordPress-Container zugewiesen werden, da wir zwar die Datenbank gemeinsam mit WordPress im “default”-Netzwerk betreiben, die Datenbank jedoch nicht öffentlich zugänglich machen möchten.
10.2. Beispiel Mailcow anpassen
Eine sehr bekannte Anleitung hier im Blog ist die “Mailcow – E-Mail Komplettsytem mit Antivirus, Spam Filer, Webmail, Webfrontend installieren mittels Docker und Traefik” die von Christian und mir gepflegt wird. In der Anleitung von Mailcow ist an Punkt “4.2 docker-compose.override.yml erstellen“ der Teil an dem die Labels definiert werden.
10.2.1. Ursprüngliche Konfiguration
version: '3.9' services: nginx-mailcow: labels: - "traefik.enable=true" - "traefik.http.routers.nginx-mailcow.entrypoints=http" - "traefik.http.routers.nginx-mailcow.rule=HostRegexp(`{host:(autodiscover|autoconfig|mail|mta-sts|imap|pop3|smtp).+}`)" - "traefik.http.routers.nginx-mailcow-secure.entrypoints=https" - "traefik.http.routers.nginx-mailcow-secure.rule=Host(`mail.euredomain.de`)" - "traefik.http.routers.nginx-mailcow-secure.rule=HostRegexp(`{host:(autodiscover|autoconfig|mail|mta-sts|imap|pop3|smtp).+}`)" - "traefik.http.routers.nginx-mailcow-secure.rule=Host(`mail.euredomain.de`, `autodiscover.euredomain.de`, `autoconfig.euredomain.de`, `mta-sts.euredomain.de`)" - "traefik.http.routers.nginx-mailcow-secure.middlewares=default@file" - "traefik.http.routers.nginx-mailcow-secure.tls=true" - "traefik.http.routers.nginx-mailcow-secure.tls.certresolver=http" - "traefik.http.routers.nginx-mailcow-secure.service=nginx-mailcow" - "traefik.http.services.nginx-mailcow.loadbalancer.server.port=80" - "traefik.docker.network=proxy" networks: - proxy certdumper: image: humenius/traefik-certs-dumper:latest restart: unless-stopped network_mode: none command: --restart-containers mailcowdockerized-postfix-mailcow-1,mailcowdockerized-dovecot-mailcow-1 volumes: - /opt/containers/traefik/data:/traefik:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/assets/ssl:/output:rw environment: DOMAIN: ${MAILCOW_HOSTNAME} ACME_FILE_PATH: "/traefik/acme_letsencrypt.json" networks: proxy: external: true
10.2.2. Neue Konfiguration
version: '3.9' services: nginx-mailcow: labels: - "traefik.enable=true" - "traefik.http.routers.nginx-mailcow.entrypoints=web" - "traefik.http.routers.nginx-mailcow.rule=HostRegexp(`{host:(autodiscover|autoconfig|mail|mta-sts|imap|pop3|smtp).+}`)" - "traefik.http.routers.nginx-mailcow-secure.entrypoints=websecure" - "traefik.http.routers.nginx-mailcow-secure.rule=Host(`mail.euredomain.de`)" - "traefik.http.routers.nginx-mailcow-secure.rule=HostRegexp(`{host:(autodiscover|autoconfig|mail|mta-sts|imap|pop3|smtp).+}`)" - "traefik.http.routers.nginx-mailcow-secure.rule=Host(`mail.euredomain.de`, `autodiscover.euredomain.de`, `autoconfig.euredomain.de`, `mta-sts.euredomain.de`)" - "traefik.http.routers.nginx-mailcow-secure.middlewares=default@file" - "traefik.http.routers.nginx-mailcow-secure.tls=true" - "traefik.http.routers.nginx-mailcow-secure.tls.certresolver=http_resolver" - "traefik.http.routers.nginx-mailcow-secure.service=nginx-mailcow" - "traefik.http.services.nginx-mailcow.loadbalancer.server.port=80" - "traefik.docker.network=proxy" networks: - proxy certdumper: image: humenius/traefik-certs-dumper:latest restart: unless-stopped network_mode: none command: --restart-containers mailcowdockerized-postfix-mailcow-1,mailcowdockerized-dovecot-mailcow-1 volumes: - /opt/containers/traefik-crowdsec-stack/traefik:/traefik:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/assets/ssl:/output:rw environment: DOMAIN: ${MAILCOW_HOSTNAME} ACME_FILE_PATH: "/traefik/acme_letsencrypt.json" networks: proxy: external: true
10.2.3. Änderungen
- Änderung der Eintrittspunkte:
- Von: “traefik.http.routers.nginx-mailcow.entrypoints=http”
- Zu: “traefik.http.routers.nginx-mailcow.entrypoints=web”
- Von: “traefik.http.routers.nginx-mailcow-secure.entrypoints=https”
- Zu: “traefik.http.routers.nginx-mailcow-secure.entrypoints=websecure”
- Änderung des Zertifikat-Resolver:
- Von: “traefik.http.routers.nginx-mailcow-secure.tls.certresolver=http”
- Zu: “traefik.http.routers.nginx-mailcow-secure.tls.certresolver=http_resolver”
- Änderung des Volumes für den “certdumper” Dienst:
- Von: “/opt/containers/traefik/data:/traefik:ro”
- Zu: “/opt/containers/traefik-crowdsec-stack/traefik:/traefik:ro”
10.2.4. Konfiguration mit neuerer Notationen
Mit den steigenden Docker Versionen hat auch eine leicht angepasste Notation Einzug genommen, welche ich zumindest kurz zeigen möchte:
version: '3.9' services: nginx-mailcow: labels: traefik.enable: true traefik.http.routers.nginx-mailcow.entrypoints: web traefik.http.routers.nginx-mailcow.rule: HostRegexp(`{host:(autodiscover|autoconfig|mail|mta-sts|imap|pop3|smtp).+}`) traefik.http.routers.nginx-mailcow-secure.entrypoints: websecure traefik.http.routers.nginx-mailcow-secure.rule: Host(`mail.euredomain.de`) traefik.http.routers.nginx-mailcow-secure.rule: HostRegexp(`{host:(autodiscover|autoconfig|mail|mta-sts|imap|pop3|smtp).+}`) traefik.http.routers.nginx-mailcow-secure.rule: Host(`mail.euredomain.de`, `autodiscover.euredomain.de`, `autoconfig.euredomain.de`, `mta-sts.euredomain.de`) traefik.http.routers.nginx-mailcow-secure.middlewares: default@file traefik.http.routers.nginx-mailcow-secure.tls: true traefik.http.routers.nginx-mailcow-secure.tls.certresolver: http_resolver traefik.http.routers.nginx-mailcow-secure.service: nginx-mailcow traefik.http.services.nginx-mailcow.loadbalancer.server.port: "80" traefik.docker.network: proxy networks: - proxy certdumper: image: humenius/traefik-certs-dumper:latest restart: unless-stopped network_mode: none command: --restart-containers mailcowdockerized-postfix-mailcow-1,mailcowdockerized-dovecot-mailcow-1 volumes: - /opt/containers/traefik-crowdsec-stack/traefik:/traefik:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/assets/ssl:/output:rw environment: DOMAIN: ${MAILCOW_HOSTNAME} ACME_FILE_PATH: "/traefik/acme_letsencrypt.json" networks: proxy: external: true
10.3. Beispiel Nextcloud Server
Eine weitere sehr bekannte Anleitung hier im Blog ist die “Nextcloud Server – mit Docker Compose und Traefik installieren” die von Christian gepflegt wird. In der Anleitung von Nextcloud ist an Punkt “2. Docker Compose anlegen“ der Teil an dem die Labels definiert werden.
10.3.1. Alte Konfiguration
version: '3.3' services: ... nextcloud-app: environment: TRUSTED_PROXIES: 172.18.0.2/16 ... labels: - "traefik.enable=true" - "traefik.http.routers.nextcloud.entrypoints=https" - "traefik.http.routers.nextcloud.rule=(Host(`nextcloud.euredomain.de`))" - "traefik.http.routers.nextcloud.tls=true" - "traefik.http.routers.nextcloud.tls.certresolver=http" - "traefik.http.routers.nextcloud.service=nextcloud" - "traefik.http.services.nextcloud.loadbalancer.server.port=80" - "traefik.docker.network=proxy" - "traefik.http.routers.nextcloud.middlewares=nextcloud-dav,default@file" - "traefik.http.middlewares.nextcloud-dav.replacepathregex.regex=^/.well-known/ca(l|rd)dav" - "traefik.http.middlewares.nextcloud-dav.replacepathregex.replacement=/remote.php/dav/" ...
10.3.2. Neue Notation und Konfiguration
version: '3.3' services: ... nextcloud-app: environment: TRUSTED_PROXIES: 172.16.255.254 ... labels: traefik.docker.network: proxy traefik.enable: "true" traefik.http.middlewares.nextcloud-dav.replacepathregex.regex: ^/.well-known/ca(l|rd)dav traefik.http.middlewares.nextcloud-dav.replacepathregex.replacement: /remote.php/dav/ traefik.http.routers.nextcloud.entrypoints: websecure traefik.http.routers.nextcloud.middlewares: nextcloud-dav,default@file traefik.http.routers.nextcloud.rule: (Host(`nextcloud.euredomain.de`)) traefik.http.routers.nextcloud.service: nextcloud traefik.http.routers.nextcloud.tls: "true" traefik.http.routers.nextcloud.tls.certresolver: http_resolver traefik.http.services.nextcloud.loadbalancer.server.port: "80" ...
10.3.3. Hinweis zur Nextcloud Anleitung
An dieser Stelle ist nochmal ein gesonderter Hinweis zur Anleitung angebracht! Der Punkt “2.1 Trusted Proxy IP ermitteln” entfällt vollständig! In dem FullStack hat Traefik immer eine fest definierte IPv4-Adresse. So müssen wir keine Range mehr an Nextcloud weitergeben sondern können uns auf die spezifische Adresse von Traefik im proxy
-Netzwerk verlassen!
10.4. Liste bereits migrierter Anleitungen
Hier ist eine Liste von Anleitungen, die bereits erfolgreich migriert wurden:
Diese Anleitungen wurden sorgfältig überarbeitet und sind nun auf die neue Umgebung und die aktuelle Anleitung angepasst.
Hinweis
Hinweis zur Stabilität und automatisierten Updates
Es ist in der Tat eine komplexe Aufgabe, eine allumfassende Aussage über die Stabilität des Full-Stacks von Traefik und Crowdsec zu treffen. In vielerlei Hinsicht zeigt sich dieser Stack auf einer Vielzahl von Servern als außerordentlich robust und betriebssicher. Dabei ist es nicht ungewöhnlich, dass sich gelegentlich ein Container im Full-Stack verabschiedet, ein Phänomen, das in der Welt von Docker nicht nur auf Full-Stack-Systeme beschränkt ist. Hier habt ihr die Wahl, es entweder als gegeben hinzunehmen oder in den Logdateien nach der genauen Ursache zu forschen.
Um euch ein persönliches Beispiel zu geben: Diese spezielle Konfiguration läuft bei mir auf mehr als zehn Servern und über einen Zeitraum von mehr als fünf Monaten kam es nur einmal zu einem solchen Vorfall auf einem Server. Wenn ein ähnliches Ereignis nahezu zeitgleich auf mehreren Servern auftritt, liegt die Vermutung nahe, dass es eher nicht am Setup, sondern an einem externen Dienst liegt. In den Fällen, die ich beobachten konnte, gab es beispielsweise ein kurzes Problem mit Crowdsec, einem Dienst, der naturgemäß von externen Faktoren beeinflusst wird.
Dies unterstreicht nur noch mehr die unabdingbare Bedeutung eines gründlichen Monitorings der kritischen Komponenten. Damit ist es möglich, eine optimale Performance zu gewährleisten und gleichzeitig die Fähigkeit zu bewahren, bei möglichen Problemen entsprechend zu reagieren. Updates sollten dabei immer unter Aufsicht durchgeführt werden, was die Implementierung von automatisierten Updates ohne entsprechende Fallback-Option nahezu ausschließt.
Hinweis zu Traefik v3.0beta2
Das in diesem Artikel beschriebene Setup ist grundsätzlich auch mit Traefik v3.0beta2 kompatibel. Ich habe es erfolgreich getestet. Es ist jedoch wichtig zu beachten, dass in der aktuellen Beta-Version ein bekannter Fehler vorhanden ist, der dazu führt, dass das Dashboard trotz korrekter Konfiguration nicht erreichbar ist. Wie kann ich dann sicher sein, dass das Setup korrekt funktioniert? Zum Beispiel funktioniert die oben beschriebene WordPress-Anleitung perfekt und ist mit Traefik v3.0beta2 gut erreichbar. Daher ist es sicher zu schlussfolgern, dass das Setup korrekt funktioniert, trotz des Bugs mit dem Dashboard.
Hinweis zu Kommentaren
Wenn etwas nicht funktioniert, gehe noch einmal alle einzelnen Punkte in der Anleitung durch. Ich habe die Anleitung mehrfach getestet und Christian hat sie auch durchgesehen. Wenn du sicher bist, dass du alles richtig konfiguriert hast und das noch einmal überprüft hast, dann hinterlasse gerne einen Kommentar. Der Blog wird von Christian betrieben und er, sowie alle Co-Autoren, bemühen uns, alle Fragen und Probleme zu lösen – allerdings ist dies auch immer von unserer verfügbaren Zeit abhängig!
Bitte abonniert GoNeuland, damit dieser Blog uns auch weiterhin viele Jahre Freude bereiten kann 😉
Hallo,
habe die Anleitung gerade abgearbeitet und meine, dass die Zeile für die Installation des repositories des firewall-bouncer falsch ist. Bei mir kann ich nach der Installation des repos aus der Anleitung den bouncer nicht installieren.
Von der crowdsec-Seite habe ich diese Zeile für die Installation des repos:
Benutzt man diese, kann man nachher corwdsec-firewall-bouncer-iptables installieren und der bouncer funktioniert.
Super Anleitung – vielen Dank dafür. Ideal für jemanden, der keine Ahnung von traefik hat (wie ich).
Soweit hat bei mir alles geklappt – alles healthy.
Aber wie kommt man auf das traefic dashboard? Gegoogelt habe ich port 10999, aber da läuft bei mir nichts. Wie mache ich da weiter?
Bei mir läuft das auf einem raspberry hinter einer Fritzbox und ich würde gerne als erstes nextcloud (docker) darüber laufen lassen, momentan reicht es mir intern. Über die Anleitung dazu von Dir bin ich auf dieses Tutorial gestoßen.
Braucht der raspi eine eigene domain oder kann man die, die sich die FB schon geholt hat, mitnutzen? Wie bringe ich die fritzbox dazu, den raspi mit domain anzusprechen?
Fragen über Fragen, vielleicht bin ich dafür hier auch falsch…
Hallo, ich bin begeistert von der supertollen Anleitung!
Hat bei mir fast ein ganzes Jahr bis vor ein paar Wochen funktioniert, bis ich einen Router tauschen MUSSTE. Dieser hat nun eine andere IP-Adresse (genauer gesagt, die Public IP / WAN-IP). Alle Versuche mit der neuen IP-Adresse scheinen zu scheitern – es kommt immer noch seit dem Routertausch vor, dass ich im lokalen Netzwerk die URLs nicht mehr abrufen kann – von außerhalb funktionieren die Subdomains / Domains.
ddclient, traefik, etc… alles schon neu eingerichet, docker-container recreated, Netzwerke wurden auch aktualisiert.
Hat jemand auch diese Erfahrung gesammelt?
Woran kann es liegen?!
Auf tatkräftige Unterstützung würde ich mich sehr freuen!
Erstmal danke für die Anleitung, ich bin hervorragend damit zurechtgekommen.
Allerdings ignoriert sie wie viele andere auch das eigentliche #Neuland, nämlich IPv6 welches inzwischen seit 30! Jahren als Standard existiert.
Da neue Internetanschlüsse inzwischen ausschließlich mit IPv6 nativ und mit glück IPv4 über CGN geschaltet werden wäre es an der Zeit das dies auch endlich mal in den Tutorials und Köpfen der (Hobby-)Administratoren ankommt.
Erstmal vielen Dank für das tolle tutorial!
Hier noch ein Tip für alle, die noch einen Nextcloud container mit in diese Traefik/Crowdsec Kombi einbinden wollen und ständig ins banning laufen… mit:
hat der Spuk ein Ende.👻
Erhalte einen Fehler in Docker, wenn ich den ‘traefik-crowdsec-stack’ starte:
level=error msg=”Error handling plugin refcount operation” driver= error=”legacy plugin: Unable to find plugin without name” mode=1
Docker info:
Client: Docker Engine – Community
Version: 27.3.1
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.17.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.29.7
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 3
Running: 3
Paused: 0
Stopped: 0
Images: 3
Server Version: 27.3.1
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: runc io.containerd.runc.v2
Default Runtime: runc
Init Binary: docker-init
containerd version: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
runc version: v1.1.14-0-g2c9f560
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.1.0-25-amd64
Operating System: Debian GNU/Linux 12 (bookworm)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.62GiB
Name: deb02-docker
ID: 7248d237-3eea-4ae2-92e5-4da8ad3049cc
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: true
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Zuerst möchte ich mich wirklich für diese ausführliche Anleitung bedanken, es war wirklich einfach diese nachzuvollziehen und umzusetzen.
Allerdings habe ich am Ende das Problem, dass wenn ich meine IP-Adresse banne, nur die Verbindung über SSH geblockt wird.
Das Traefik Dashboard über traefik.domain.tld ist weiterhin erreichbar.
Ich vermute, dass es mit Cloudflare zu tun hat, da meine Domain hinter einem Cloudflare Proxy liegt. Ich sehe, dass in der Anleitung ein Cloudflare real ip Plugin genutzt wird, ich kann aber nicht sagen ob alles richtig konfiguriert ist. Ich schätze mal Nein, da ich wie gesagt trotz Ban meiner IP das Traefik Dashboard erreichen kann.
Kann mir jemand aushelfen?
Danke im Voraus.
Hallo zusammen,
ich bekommen folgenden Fehler beim Start von Crowdsec
Vielleicht hat jemand ne Idee?
Update von Traefik
Wann ist ein Update von Traefik geplant bzw. sinnvoll? Gemäss Anleitung ist immer noch die Version 2.10 angepinnt (SERVICES_TRAEFIK_IMAGE_VERSION=2.10). Ich möchte nicht auf latest wechseln und dann Probleme mit der Stabilität erhalten. Danke für eine Mitteilung über den Zeitplan.
Bei mir wird seit heute die IP 172.31.0.1 mit einem Ban belegt.
29161450 | crowdsec | Ip:172.31.0.1 | crowdsecurity/http-bad-user-agent | ban
Was kann ich denn dagegen machen? Hatte ich noch nie.
Mich würde interessieren an welcher Stelle ich die traefik Konfiguration anpassen muss um zusätzlich zu https auch noch sftp / ssh zu unterstützen? Das wäre hilfreich wenn ein SFTP Server in einem Container laufen soll.
Hallo zusammen,
habe gerade die Anleitung zum Crowdsec-Treafik-Stack abgearbeitet und beim Nachsehen auf dem Server sind auch alle drei container als ‘healthy’ gekennzeichnet. Beim Versuch das Dashboard zu öffnen kommt allerdings die Fehlermeldung dass die IP Adresse nicht gefunden würde – DNS-Problem?. Ich hab bei Strato einen vituellen Linux-Server gemietet und bei den DNS Einstellungen ANAME auf meinen Domainnamen (ohne Präfix traefik.) und die IP des Servers eingestellt.
Hat jemand eine Idee was da falsch laufen könnte?
Vielen Dank im Voraus!
Erstmal Hi in die Runde!👋
Mein Crowdsec-Traefik Setup läuft erstmal gut. Vielen Dank dafür, psycho0verload!
Nun möchte ich zusätzlich eine Authentik Instanz mit OAuth für meine Nextcloud betreiben. Soweit so gut. die ersten Dienste mit ForwardAuth wurden erfolgreich integriert (beispielweise Traefik selbst und mein VS-Code Server).
Das OAuth für Portainer und meine Nextcloud will aber wirklich nicht. Die Kommunikation zwischen den Diensten scheint nicht erfolgreich zu sein.
Meine Vermutung ist, dass der traefik-crowdsec-bouncer die Kommunikation zwischen Authentik und Nextcloud irgendwie beeinflusst. Mein Lösungsansatz wäre also die Middleware aus dem entrypoint zu entfernen und nur dem Traefik Container zuzuordnen.
Kann mir vielleicht jemand erklären, wofür die folgende Middleware benötigt wird:
Vielen Dank im Voraus,
Eure Kartoffel! 🥔
Hallo Zusammen,
leider läuft Treafik nach wie vor nicht. Ich habe die Schritte in der Anleitung V2 genau befolgt. Die Container konnten alle erstellt werden, leider funktioniert die Kommunikation mit meiner ddns nicht.
Ich habe SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=
traefik.meineddnsdomain
definiert.
Leider wird bei mir kein Zertifikat für die traefik.domain erzeugt.
time=”2024-07-15T22:34:19+02:00″ level=error msg=”Unable to obtain ACME certificate for domains \”traefik.meinddnsdomain\”: unable to generate a certificate for the domains [traefik.meineddnsdomain]: error: one or more domains had a problem:\n[traefik.meineddnsdomain] acme: error: 400 :: urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for traefik.meineddnsdomain – check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for traefik.meineddnsdomain – check that a DNS record exists for this domain\n” routerName=traefik@docker rule=”Host(
traefik.meineddnsdomain
)” providerName=http_resolver.acme ACME CA=”https://acme-v02.api.letsencrypt.org/directory”. Der Link für das Dashboard funktioniert auch nicht. http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth
Habt ihr eine Idee wo das Problem liegen könnte ?
Moin,
ich habe mir gerade alles auf einem neuen Ubuntu 24.04 LTS (noble) installiert.
Bis auf die Installation von
hat alles geklappt. Hier gibt es aber scheinbar noch keine Pakete für noble. Ich konnte hier aber ohne Probleme die Pakete von jammy installieren, nachdem ich die crowdsec_crowdsec.list entsprechend angepasst hatte.
Danach lief dann alles so wie es soll.
Hallo, ich habe versucht den Container per docker compose zu starten leider erhalte ich eine Fehlermeldung. Alle Dateien und Variablen sind gemäß Dokumentation gesetzt außer mein Domain name. Dieser entspricht meinem DynDNS name dessen port 80 und 443 erreichbar gemacht werden soll.
Ich erhalte folgende Meldung.
Invalid Plugins:
compose failed to fetch metadata: fork/exec /root/.docker/cli-plugins/docker-compose: exec format error
Ich habe auch per portainer einen Versuch gestartet auch ohne Erfolg.
hier erhalte ich folgende Meldungen
failed to deploy a stack: time=”2024-07-01T22:46:23Z” level=warning msg=”The \”SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST\” variable is not set. Defaulting to a blank string.” Failed to load /data/compose/43/config/traefik.env: open /data/compose/43/config/traefik.env: no such file or directory
Die dateien .env und die traefik.toml etc. sind alle enthalten.
Habt ihr eine Idee?
Mir ist gerade eine Inkonsistenz aufgellen. Wir erstellen eine traefik.env, diese wird auch in der docker-compose.yml als env_file referenziert, jedoch wird in der aktuellen Anleitung dann immernoch .env verwendet.
Hallo zusammen,
habe ich es überlesen oder übersehen…?
Wie kann ich “externe” Systeme über Traefik ansprechen?
Beispiel: Traefik befindet sich in einem Subnetz, relativ nah am Internetzugang. Der Mail-Server befindet sich in einem anderen Subnetz, dass zum Subnetz des Traefik bestmöglich abgeschirmt ist.
Das Routing und die Firewall-Thematik soll nicht das Thema sein, sondern nur die Traefik-Konfiguration. Wie findet Traefik bei Angabe entsprechender Networks mit Subnetzangabe das System?
Wahrscheinlich wissen es alle Anderen. Es wäre nett, wenn mir jemand einen Tipp geben könnte, im Zweifel wo ich das nachlesen kann. Danke.👍
Kleines Problem mit der Hoffnung, hier Hilfe zu bekommen.
Hallo, war gerade dabei die Konfiguration zu überarbeiten und bekomme nun folgende Fehlermeldung: FATA[13-06-2024 14:30:40] unable to create bouncer: bouncer crowdsec-firewall-bouncer-iptables already exists. Ich komme nun partout nicht darauf, wie ich das lösen kann. Ich möchte gern einen Access-Token laut Schritt 9.3.3 anlegen. Hat jemand eine Idee, was ich machen kann?
Danke!
Ja Moin! Ich hab die Anleitung heute auf einem frischen Debian 12 abgearbeitet, funktioniert wunderbar, bisher auch keine Probleme mit WordPress 🙂
Traefik 3 ist da.
https://doc.traefik.io/traefik/v3.0/migration/v2-to-v3/
Ist ein Update der Anleitung geplant?
HeyHo!
Respekt an eure Arbeit!
Bei mir läuft der Stack ohne Probleme. Auch Matrix/Synapse ist bereits integriert und funktioniert wie gewohnt. ABER, die Integration von basicAuth ab Punkt 9.2
möchte bei mir nicht wirklich funktionieren.
Ich bekomme zwar nun ein Eingabe Prombt Serviert, aber der Login funktioniert nicht.
In den Logs bekomme ich dazu auch nicht wirklich was angezeigt dazu?
Ist die Problematik bekannt?
Grüße
Hallo in die Runde,
ich nutze zur Synchronisierung zwischen Nextcloud und Android Davx5. Jetzt wird dieser Vorgang von Crowdsec gebannt. Bisher habe ich in der “traefik-crowdsec-stack/crowdsec/config/hub/parsers/s02-enrich/crowdsecurity/” die whitelist entsprechend angepasst. Mit dem Job aus Punkt 9.1 hier in der Anleitung wird die whitelist jeden Tag neu erstellt. Aber eben ohne meine Anpassung. Hat da jemand eine Idee. Vielen Dank.
Gruß Andreas
Hi, wie müsste denn die image Zeile im yml file angepasst werden, um auf Traefik v3 zu upgraden?
Moin leuts .
Ich hab ein Problem. Und zwar beschäftige ich mich aktuell mehr mit Docker usw.. auch bzgl traefik ..
jetzt hab ich aber seit neusten das Problem. Egal ob pterodactyl. forgejo , mediawiki .
Alles läuft ordnungsgemäß nach der installation mit docker compose.
Nur leider nach ein paar tagen gibts dann datenbank probleme. timeouts usw.. find aber niergends einen fehler . Und das komische ist. erst läufts und dann plötzlich nicht mehr. Dann gibt es nur noch timeouts . Und badgateway fehler. Und diese lassen sich nur beheben. in dem ich die container komplett neu mach. Und alle volumes von den betroffnenen clear.. Hatte das schon mal jemand? oder vll jemand einen tipp ? Bin aktuell am verzweifeln. -_-
Hallo,
ich erhalte diese Meldung obwohl ich Docker V2 installiert habe.
WARN[0000] /opt/containers/traefik-crowdsec-stack/docker-compose.yml:
version
is obsoleteMeine Versionen.
Docker version 26.0.0, build 2ae903e
Docker Compose version v2.25.0
Was ist zu tun. Gruß Andreas
Hallo,
ich erhalte nach abarbeiten der Anleitung und mehrmaliger ueberpruefung folgende Meldung:
Kann mir hier jmd weiterhelfen woran das liegt?
Mein vps ist nackig und hat kein Port 80 in Verwendung.
Gruß,
micha
Super anleitung. Allerdings möchte ich manche subdomains gar nicht im www veröffentlichen.
Bisher habe ich dafür die DNS Challenge mit Ionos genutzt.
Ich scheitere allerdings kläglich an der Änderung der Anleitung auf die DNS Challenge:
Hier mein bisher laufende Konfig:
Traefik.yml:
Die config.yml ist leer.
Kann mich jemand in die richtige Richtung schubsen wo ich das in der Anleitung einbauen muss?
grüße
Yo! Zunächst auch von mir vielen herzlichen Dank für die immens gute Anleitung.
Ich möchte gerne drei Dinge beisteuern.
Erstens hatte ich Probleme, den Bouncer zum Bouncen zu bewegen, zweitens hatte ich irritierende Meldungen im Logfile, und drittens möchte ich für eine von außen nicht erreichbare Domain gerne Zertifikate verwenden.
Der Bouncer.
Das Problem war im Logfile /var/log/crowdsec-firewall-bouncer.log zu finden:
Das Problem kann zustandekommen, wenn beim Start des Bouncers auf dem “echten” Host die API im Docker-Container (noch) nicht verfügbar ist. Laut https://discourse.crowdsec.net/t/decisions-not-applied/211/4 wird in diesem Fall auch nicht erneut versucht, die API zu erreichen.
Die Lösung besteht auf meinem System (mit systemd) aus dem Erstellen einer Timer-Unit für den crowdsec-firewall-bouncer.service:
Der dazugehörige Service muß noch vom automatischen Start abgehalten werden:
Danach dann noch
Beim nächsten Systemstart sollte der Timer dann 120s warten, bevor er den Service startet.
Das Logfile.
In /var/log/traefik/traefik.log waren Meldungen zu finden, daß die Middleware nicht gefunden werden konnte:
Das scheint laut https://github.com/traefik/traefik/issues/9779 ein Bug zu sein, der noch ein bißchen Zeit zur Behebung benötigt und mit dem Herausnehmen der Middleware aus dem “web”-entrypoint umgangen werden kann. Das ist auch nicht schlimm, weil “web” ja ohnehin auf “websecure” weiterleitet.
Die Zertifikate.
Ein Teil der Webseiten, für die Traefik zuständig ist, befindet sich in einer nur lokal aufgelösten und über VPN erreichbaren Domain. Daher kann auch Letsencrypt über HTTP oder TLS kein Zertifikat ausstellen. Vielleicht geht es dem ein oder anderen Leser ähnlich. Ich habe kurzerhand selbstsignierte Zertifikate erstellt und in ./certs gespeichert.
Den Resolver aus docker-compose.yml entfernen und das ./certs-Verzeichnis mounten:
und in der dynamic_conf.yml bekanntmachen:
Vielen Dank nochmal und viel Erfolg!
Hi zusammen 🙂
Erstmal vielen Dank für die ausführliche Dokumentation! Ich konnte dank ihr auf meinem Server problemlos den Stack einrichten.
Jetzt hab ich mir ein VPS bei Hetzner für ein kleines Projekt zugelegt (der VPS hat ARM64 Architektur).
Ich hab die Anleitung wieder Schritt für Schritt befolgt, die Services starten auch ohne Probleme. Allerdings krieg ich mit
cat /var/log/traefik/traefik.log
nur folgenden Output:
time=”2024-03-12T21:37:26Z” level=info msg=”Traefik version 2.10.7 built on 2023-12-06T15:54:59Z”
time=”2024-03-12T21:37:26Z” level=info msg=”\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://doc.traefik.io/traefik/contributing/data-collection/\n”
time=”2024-03-12T21:37:26Z” level=info msg=”Enabling ProxyProtocol for trusted IPs [10.0.0.0/8 172.16.0.0/12 192.168.0.0/16]” entryPointName=websecure
time=”2024-03-12T21:37:29Z” level=error msg=”Plugins are disabled because an error has occurred.” error=”unable to set up plugins environment: unable to download plugin github.com/Paxxs/traefik-get-real-ip: failed to call service: Get \”https://plugins.traefik.io/public/download/github.com/Paxxs/traefik-get-real-ip/v1.0.2\”: dial tcp 172.67.75.8:443: connect: network is unreachable”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider aggregator aggregator.ProviderAggregator”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider *file.Provider”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider *traefik.Provider”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider *docker.Provider”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider *acme.ChallengeTLSALPN”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider *acme.Provider”
time=”2024-03-12T21:37:29Z” level=info msg=”Testing certificate renew…” providerName=tls_resolver.acme ACME CA=”https://acme-v02.api.letsencrypt.org/directory”
time=”2024-03-12T21:37:29Z” level=info msg=”Starting provider *acme.Provider”
time=”2024-03-12T21:37:29Z” level=info msg=”Testing certificate renew…” ACME CA=”https://acme-v02.api.letsencrypt.org/directory” providerName=http_resolver.acme
time=”2024-03-12T21:37:51Z” level=error msg=”Unable to obtain ACME certificate for domains \”traefik.meine.domain\”: cannot get ACME client get directory at ‘https://acme-v02.api.letsencrypt.org/directory’: Get \”https://acme-v02.api.letsencrypt.org/directory\”: dial tcp 172.65.32.248:443: connect: network is unreachable” providerName=http_resolver.acme ACME CA=”https://acme-v02.api.letsencrypt.org/directory” rule=”Host(
traefik.meine.domain
)” routerName=traefik@dockertime=”2024-03-12T21:47:26Z” level=warning msg=”Error checking new version: Get \”https://update.traefik.io/repos/traefik/traefik/releases\”: dial tcp 13.39.208.199:443: connect: network is unreachable”
Das Dashboard kann ich über die konfigurierte Domain nicht aufrufen.
Wenn ich die Metrics auslesen will, krieg ich folgenden Output:
time=”2024-03-12T21:46:39Z” level=fatal msg=”failed to fetch prometheus metrics: executing GET request for URL \”http://0.0.0.0:6060/metrics\” failed: Get \”http://0.0.0.0:6060/metrics\”: dial tcp 0.0.0.0:6060: connect: connection refused”
Ich kann mir da echt keinen Reim drauf machen, weil die Konfiguration eigtl. 1:1 wie bei meiner anderen Maschine ist 🤔- Die Domain zum Zugriff auf das Dashboard ist natürlich anders
Weiß einer von euch weiter? Danke schonmal im Voraus 🙂
Edit: Formatierung
Tag zusammen,
kann mir einer den passenden Hinweis geben wie ich das Ganze im Portainer deploye…
Da schimpft er nämlich weil er die 3 *.env Dateien aus dem Host-Filesystem nicht gegriffen bekommt.
Die werden ja in dieser Anleitung per Compose in der CLI direkt referenziert, aber wie bringt man dem Portainer den Dateipfad denn bei???
Ich habe meine Whitelist unter ./crowdsec/config/parsers/s02-enrich/meinewhitelist.yaml angepasst und festgestellt, dass ich unter /etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml eine andere Whitelist hatte.
Ich habe beide Whitelists bearbeitet und seitdem bekomme ich
als Fehler und Crowdsec startet nicht mehr.
Hat jemand mal ein ähnliches Problem beobachten können? Das Entfernen von /etc/crowdsec/parsers/s02-enrich/mywhitelists.yaml hilft auch nicht.
Ergänzung / Korrektur zum Thema “tlsChallenge”
In der Anleitung wird konstatiert:
“Wichtig zu beachten ist, dass die Verwendung der TLS-Challenge spezifische Anforderungen an die Server- und Netzwerkkonfiguration stellt.”
Das ist generell richtig. Da jedoch in diesem Fall die gesamte TLS/HTTPS Kommunikation von traefik selbst übernommen wird, ist es völlig unerheblich, wie der dahinterliegende Server ausgestattet ist.
Fazit: Der Eintrag zur httpChallenge kann komplett entfallen!
Außerdem schlage ich vor, den Eintrag um “keyType: ‘EC384′” zu ergänzen. Das bringt einen deutlich sicheren Schlüssel verbunden mit geringerem Overhead.
Ich habe heute gesehen, dass es der crowdsec-bouncer es in das offizielle Plugin-Verzeichnis von Traefik geschafft hat.
https://plugins.traefik.io/plugins/6335346ca4caa9ddeffda116/crowdsec-bouncer-traefik-plugin
Er würde dann als eigene middleware direkt laufen, ohne http Aufruf.
Ob dann noch der iptables-bouncer eingebunden werden kann ist fraglich. (Wie?)
Hat das jemand ausprobiert?
Ich habe heute meinen Proxmox-Server mit meinem Traefik-Container neu starten müssen. Plötzlich funktionierte gar nichts mehr. Ich konnte nichtmal mehr Traefik aufrufen. Kein Container war mehr erreichbar. Zwei verscheidene Fehlermeldungen tauchten im Traefik-Log auf: “”while fetching bouncer info: ent: bouncer not found” und “failed to run filter : invalid character ‘i’ in literal true (expecting ‘r’) (1:1)\n | UnmarshalJSON(evt.Parsed.message, evt.Unmarshaled, \”traefik\””.
Leider konnte dazu nirgends relevante Informationen finden. X-mal Container neu gestartet, hat aber alles nichts gebracht. Nach einem Blick auf hub.docker.com/_/traefik habe ich gesehen, dass es eine Version 2.11 von Traefik gibt. Habe die docker-compose.yml und die .env auf diese Version angepasst, frisch gepullt und den kompletten Proxy-Stack neu gestartet. Jetzt läuft alles wieder.
Falls jemand dieselben Probleme hat, hoffe ich, dass das diese Infos auch für andere hilfreich sein können.
Nun laufen eine Menge Container im Docker mit Traefik, crowdsec u. bouncer nach dieser Anleitung in einer VM auf Proxmox –> Ich habe nun noch einen weiteren Server, der bisher mit NGinx nach “aussen” horchte. NGinx habe ich nun zugunsten von Traefik usw. deaktiviert, frage ich mich jetzt aber, ob es möglich ist, das Taefik-Stack auch für den besagten weiteren Server nutzen zu können. Der Server sollte dann im besten Fall über eine weitere Subdomain über das Traefik-Stack lokal als auch aus dem Internet erreichbar sein. Eine weiterführende Antwort auf meine vllt. eine “blöde” Frage 😇 wäre schön. Danke im Voraus!
Hab eine nette Verbesserung (plugin) gefunden:
Ich möchte gerne, wenn ich einen Container herunter fahre, auf eine Baustellen-Seite umleiten, damit ein schönes – dem Container entsprechendes 404 angezeigt wird.
Nein – Ich will nicht extra eine WordPress-Instanz dafür aufmachen.
Also
Plugin in traefik.yml einbinden mit:
experimental:
plugins:
traefik-plugin-waeb:
moduleName: github.com/tomMoulard/traefik-plugin-waeb
version: “v1.0.1”
und bestücken in der dynamic_conf.yml mit
http:
middlewares:
traefik-plugin-waeb:
plugin:
traefik-plugin-waeb:
root: “/var/www/baustelle/”
und
http:
routers:
baustelle:
entrypoints: “websecure”
rule: host(
baustelle.cs.de
)service: noop@interna
middlewares:
– traefik-plugin-waeb
tls: true
tls.certresolver: “http_resolver”
Jetzt in /var/www/baustelle/ eine kleine html-Seite abgelegt.
Braucht man’s – Nein – Aber es macht Spaß
Hallo,
immer wenn ich die dynamic_conf.yml anpasse und etwas falsch mache, (kann man ja nicht mit “docker config check” überprüfen) dann versterben alle Services, weil default@file nicht mehr gefunden wird.
So weit so schlecht.
Jetzt habe ich folgendes probiert:
dynamic Verzeichnis gebaut. und die dynamic_conf.yml in verschiedene einzelne Dateien zerteilt, damit nicht immer alles wegfliegt, wenn eines nicht geht.
Folgender Versuch:
in der traefik.yml wollte ich diesen Eintrag verändern:
providers:
file:
filename: “./dynamic_conf.yml”
ändern in
providers:
file:
directory: “./dynamic/”
(Ja das steht so in der Doku 🙂
Ich habe alles versucht *.yml Dateien / *.yaml-Dateien reinwerfen
Die Dateischnipsel sind alle korrekt, aber Sie werden nicht eingebunden.
In mittelschwerer Verzweiflung habe ich sogar folgendes versucht:
providers:
file:
filename: [“./dynamic_conf.yml”, “./neue_conf.yml”]
Das wäre syntaktisch und logisch sogar richtig, aber Traefik frisst es nicht.
Am Ende hat er keine der Dateien gelesen.
Hat das jemand hinbekommen?
Moin
bei mir läufts leider nicht.
Mein Plan ist erstmal nextcloud auf meinem Home-Server unter nextcloud.euredomain.de erreichbar zu machen. Ich habe meine Domains bei strato und habe dementsprechend subdomains nextcloud.euredomain.de und traefik.euredomain.de angelegt. Ebenso verwende ich die dyndns-update Funktion von strato (die zu funktionieren scheint). A-Records darf ich bei strato – offenbar wegen dyndns – nicht anlegen. Also CNAME – ich habe nextcloud.euredomain.de auf euredomain.de. und traefik.euredomain.de auf euredomain.de. eingestellt.
Im moment landen sowohl nextcloud.euredomain.de als auch traefik.euredomain.de auf traefik.euredomain.de. Seltsam
Ausserdem bekomme ich eine Fehlermeldug im crowdsec-container:
level=warning msg=”failed to run filter : invalid character ‘i’ in literal true (expecting ‘r’) (1:1)\n | UnmarshalJSON(evt.Parsed.message, evt.Unmarshaled, \”traefik\”) in [\”\”, nil]\n | ^” id=spring-fog name=child-crowdsecurity/traefik-logs stage=s01-parse
Ist das ignorabel?
Danke!
Hallo,
ich habe die Anleitung bis zum Punkt 9 gemacht. Der Traefik Webserver war ohne Abfrage von Benutzername und Kennwort erreichbar. Daher habe ich dann noch die Anleitung bis 9.2.3. gemacht. Anschließend wurde ich bei Aufruf des Webservers zwar nach Benutzernamen und Kennwort gefragt, aber die in 9.2 erstellten Zugangsdaten (die ich auch an die entsprechende Stelle kopiert habe), wurden nicht akzeptiert. Anschließend habe ich die Schritte erneut durchgeführt und nun bekomme ich den Fehler “404 page not found”
Habt ihr eine Idee was ich falsch mache bzw. wo ich bei der Fehlersuche ansetzen kann?
Hallo zusammen,
mein Server läuft jetzt einige Zeit. Nun wolle ich gemäß der Anleitung die Docker-Container updaten. Leider gibt es da immer noch ein Proxy Netzwerk.
✔ Container traefik_crowdsec_bouncer Removed 0.3s
✔ Container traefik Removed 11.5s
✔ Container crowdsec Removed 0.4s
✔ Network crowdsec Removed 0.4s
! Network proxy Resource is still in use 0.0s
Ich weiß leider nicht genau, wie ich das proxy Netzwerk stoppen kann. Den Server habe ich gemäße dieser Anleitung eingerichtet.
Gruß,
Stefan
Hallo zusammen,
danke für die Anleitung(en). Ich konnte mit eurer Hilfe unter anderen Emby, Portainer, Overleaf uvm. zum Laufen bringen.
Ich habe allerdings große Schwierigkeiten, Firefly III -> Anleitung zum Laufen zu bringen.
Ich bekomme stets einen “Bad Gateway”-Error. Nehme ich die Traefik Flags raus, starte den Container erneut, kann ich über localhost+port den Service aufrufen.
Ich habe bereits andere Ports ausprobiert. Die Logs von Firefly III geben keine Fehler aus. Das Traefik Dashboard scheint ebenfalls “richtig” zu routen. Andere Dienste Laufen parallel uneingeschränkt weiter.
Hier noch meine .yml Datei:
Moin, vielen Dank für Eure gute Arbeit. Der Weg war zwar lang, hat aber problemlos dank der Doku geklappt.
Eigentlich wollte ich nur ne neue Platte in meinen Nextcloud-Server einbauen…
Jetzt ist traefik neu 😂
Eine Frage ist geblieben:
Meine IP erreiche ich über cloud.mueller.de, die habe ich bei traefik eingetragen und bekomme das Dashboard.
Wenn ich den Nextcloud Container starte, der auf die gleich Domain hört, ist das Dashboard von traefik weg – logisch.
Wie bekomme ich das wieder?
Zweite Domain auf die gleiche IP für traefik einrichten?
Freue mich auf Input 😀
Nach knapp einem Jahr mit dieser config habe ich heute Server neu aufgesetzt, weil ich nicht zufrieden bin mit Crowdsec und bezüglich Traefik im Allgemeinen viele Docs hauptsächlich nginx behandeln.
Hallo, vielen Dank für diese präzise Dokumentation des Deployments von traefik + Crowdsec.
Ich habe in meinem Homelab eine VM erstellt, Docker installiert und das Deployment ausgeführt.
Alle Container starten und sind healthy.
Allerdings kann ich das traefik Dashboard nicht aufrufen.
Wie kann ich die Ursache für diesen Fehler ermitteln?
Schöne Anleitung leider bekomme ich bei 5.2
Die Fehlermeldung:
services must be a mapping
Ich habe die Anleitung genau gemacht, mit copy and paste- woran kann das liegen ?
Hallo,
Einer der besten und ausführlichsten Tutorials über Traefik und Crowdsec. Bin bis zum Punkt 9.2.3 gekommen um zu Neustarten und testen. Im Docker logs gibt es Fehler und die Logs im /var/log werden nicht generiert. Bin alle Punkte bis 9.2.3 zwei mal durchgelaufen um sicher zu sein ob ich im acquis.yaml die Einträge falsch eingetippt habe. Da stimmt alles sowohl auch im docker-compose.yml.
Gegen Ende der Logs nach dem ich docker compose up -d –force-recreate gestartet habe gibt es die Fehler:
200 69.364918ms \”crowdsec/v1.6.0-4192af30\” \””
traefik_crowdsec_bouncer | [GIN-debug] [WARNING] Running in “debug” mode. Switch to “release” mode in production.
traefik_crowdsec_bouncer | – using env: export GIN_MODE=release
traefik_crowdsec_bouncer | – using code: gin.SetMode(gin.ReleaseMode)
traefik_crowdsec_bouncer |
traefik_crowdsec_bouncer | [GIN-debug] GET /api/v1/ping –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.Ping (2 handlers)
traefik_crowdsec_bouncer | [GIN-debug] GET /api/v1/healthz –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.Healthz (2 handlers)
traefik_crowdsec_bouncer | [GIN-debug] GET /api/v1/forwardAuth –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.ForwardAuth (2 handlers)
traefik_crowdsec_bouncer | [GIN-debug] GET /api/v1/metrics –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.Metrics (2 handlers)
traefik_crowdsec_bouncer | [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
traefik_crowdsec_bouncer | Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
traefik_crowdsec_bouncer | [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
traefik_crowdsec_bouncer | [GIN-debug] Listening and serving HTTP on :8080
traefik | 2024/02/06 20:19:42 command traefik error: no configuration found in file: /traefik.yml
traefik exited with code 0
traefik | 2024/02/06 20:19:43 command traefik error: no configuration found in file: /traefik.yml
traefik exited with code 0
traefik | 2024/02/06 20:19:44 command traefik error: no configuration found in file: /traefik.yml
traefik exited with code 0
traefik | 2024/02/06 20:19:45 command traefik error: no configuration found in file: /traefik.yml
traefik exited with code 1
traefik | 2024/02/06 20:19:47 command traefik error: no configuration found in file: /traefik.yml
Den kompletten Docker Log ist hier verfügbar: https://pastebin.com/2bfD0hvX
Kann es sein das ich etwas übersprungen habe?
Traefik und Crowdsec läuft, Aufruf der Dashboard über die Domain funktioniert nicht und im Ordner /var/log/traefik/ sind keine Log Files.
Acquisition Metrics:
+————————+————+————–+—————-+————————+
| Source | Lines read | Lines parsed | Lines unparsed | Lines poured to bucket |
+————————+————+————–+—————-+————————+
| file:/var/log/auth.log | 19 | 6 | 13 | 18 |
+————————+————+————–+—————-+————————+
Vielen Dank für die super Anleitung. Ich habe den “Stack” schon ein paar Monate bei mir laufen und an sich funktioniert alles gut.
Ich habe die Konfiguration so übernommen wie in der Anleitung. Außerdem habe ich hinter dem Proxy eine Nextcloud Instanz (auch per Konfiguration von hier). Zusätzlich habe ich meine eigene IP auf die Whitelist gesetzt (bzw. wird diese per cronjob regelmäßig erneuert), damit ich nicht gebanned werde.
Bei folgendem Usecase werde ich jedoch trotz der Whitelist immer gebanned: wenn ich in Nextcloud (28.0.2) im Browser einen Ordner verschieben möchte und mich dabei durch Unterordner des Zielpfades klicke, wird die eigene IP gebanned.
Daher habe ich mich auf die Suche des Problems gemacht (crowdsec explain,…) und mir ist aufgefallen, dass im Log des Traefik-Crowdsec-Stack die Einträge vom Traefik Container nicht auftauchen, das Label “traefik” wird nur mit einem Eintrag genannt:
Zeigt mir nur einen Eintrag mit Label “traefik”:
In “/var/log/traefik/access.log” sind die Einträge vorhanden, die durch den Nextcloud Aufruf erzeugt wurden. Und die Crowdsec Metrik (“docker exec crowdsec cscli metrics”) zeigt mir die entsprechenden Log-Dateien auch an:
Ich habe versucht das Banning zu untersuchen mit crowdsec explain, aber durch die fehlenden Einträge im Stack-Log gibt es dazu natürlich auch keine Erklärung:
Woran kann es liegen, dass der Traefik Log nicht vom Stack erfasst wird? Und, kann das die Ursache sein, dass die Whitelist nicht greift?
Vielen Dank für eure Hilfe.
Da fällt mir ein ich wollte noch was Fragen.
Seit Debian 12 gibt es unter diesem ja kein Syslog und kein Auth.log mehr.
Alles in Journalctl.
Nun hat Crowdsec ja eine Journald Erweiterung. Hat jemand von Euch schon Erfahrung damit und vielleicht eine funktionierende Config.
Ich habe damit bisher keinen Erfolg gehabt.
Zur neuen Anleitung von Traefik 2+3 vom 29.11.2024
Hallo und guten Tag . Ich bin hier neu und sehe eine ausführliche Anleitung zu Traefik in Verbindung mit Nextcloud. Das ist das, was ich brauche und bislang vermisse.
Ein paar Fragen
Ich denke hier werde ich andere Ports freischalten müssen und traefik muss dann beispielsweise 6080 auf den Containerport 80 umleiten.
Desgleichen 443. Das sollte doch in traefik so möglich sein ?, oder ?
3.Nun möchte ich verschiedene Konstellationen, wie üblich, im Homelab testen. Traefik verwendet Lets encrypt-Zertifikate. Kann es sein, daß bei “zu häufigen” Anfragen zu Lets encrypt die Zertifikate blockiert werden, sodaß man “gesperrt” wird ? Falls damit zu rechnen ist, wie ließe sich das vermeiden ?
Danke schonmal für Eure Anworten.