natuerlich
Goto Top

2x Traefik kaskadiert: RevProxy im DMZ + LAN (Docker) mit subdomains im LAN?

Ausgangslage: Erfolgreich traefik (HTTP-Reverse-Proxy) auf Raspi 4 im DMZ zwischen FritzBox und Mikrotik eingerichtet (Ubuntu Server LTS | traefik pur ohne docker). Let's encrypt funktioniert für alle subdomains. Abgesichert erstmal mit DigestAuth. SSL Labs bescheinigt Rating "A".
Im internen Netz Ubuntu-Server (192.168.100.1) mit Docker (exemplarisch: grafana, esphome,...) und eigenem Zertifikat (CA bekannt gemacht in DMZ-Server und Browsern).

traefik_dmz: Funktioniert mit subdomains und direktem Redirect wunderbar (schreibt auch logs | /etc/traefik/traefik.yml und /etc/traefik/dynamic/config.yml --> siehe unten)
treafik_dmz --> Docker-Dienste (LAN)
https://grafana.meindomain.de --> https://192.168.100.1:3000
https://esphome.meindomain.de --> http://192.168.100.1:6052

Nachteil: Label können nicht sinnvoll genutzt werden.
Durchreichen von Docker-sock ins DMZ scheint mir unter Sicherheitsaspekten risikoreich und möchte ich vermeiden. Spricht ja nix gegen eine Kaskade.
Daher: traefik_int zusätzlich auf Docker installiert. Domains/subdomains im DMZ und LAN Docker-Server bekannt gemacht in hosts/DNS (hal-30, grafana.hal-30, esphome.hal-30 verweisen per ping auf allen Servern und Clients auf 192.168.100.1). Im Browser funktionieren "https://hal-30:3000" oder "http://hal-30:6052" "http://hal-30:8080" (für traefik_int Dashboard) wunderbar. Aber mit Port geht's am traefik_int natürlich vorbei.

Ziel: 2 traefik kaskadiert (DMZ für Let's encrypt und Sicherheit, INT für das geschmeidige Nutzen der Labels)
traefik_dmz --> traefik_int --> Docker-Dienste
https://grafana.meinedomain.de/ --> http://grafana.hal-30/ --> https://192.168.100.1:3000
https://esphome.meinedomain.de/ --> http://esphome.hal-30/ --> http://192.168.100.1:6052

Probleme:
  • traefik_int läuft (Dashboard zeigt Routers, Services,...), aber schreibt weder applog.log, noch access.log. Auch in "Portainer" schweigt das Log vom traefik_int --> docker-compose siehe unten
  • Aufruf der Dienste via treafik_int per Subdomain funktioniert nicht im Browser oder als redirect-Ziel aus dem treafik im DMZ. Weder "http://grafana.hal-30/", noch "http://esphome.hal-30/" --> "Bad Gateway"

Frage: Was übersehe ich und verhindert, dass traefik_int logs schreibt? Damit könnte man ja analysieren. Wie kann ich prüfen ob und wie die Anfragen traefik_int überhaupt erreichen?
Frage: Funktionieren subdomains im LAN? Wie richtet man das im traefik_int ein?

Danke für Eure Hilfe.

Anhang: docker-compose.yml von grafana und esphome jeweils um Label erweitert:
    labels:
      - "traefik.enable=true"  
      - "traefik.http.routers.esphome.entrypoints=web"  
      - "traefik.http.routers.esphome.rule=Host(`esphome.hal-30`)"  
      - "traefik.http.services.esphome.loadbalancer.server.port=6052"  
    labels:
      - "traefik.enable=true"  
      - "traefik.http.routers.grafana.tls=true"  
      - "traefik.http.routers.grafana.entrypoints=websecure"  
      - "traefik.http.routers.grafana.rule=Host(`grafana.hal-30`)"  
      - "traefik.http.services.grafana.loadbalancer.server.scheme=https"  
      - "traefik.http.services.grafana.loadbalancer.server.port=3000"  
Anhang: /app/traefik_int/docker-compose.yml
version: '3.3'  

services:

  traefik:
    image: traefik:v3
    container_name: traefik_int
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"  
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "80:80"  
      - "443:443"  
      - "8080:8080"  
    networks:
      - default
      - traefik
    command:
      # static traefik.yml replaced by commands:
      - "--api.insecure=true"  
      - "--api.dashboard=true"  
      - "--providers.docker=true"  
      - "--providers.docker.exposedbydefault=false"  
      - "--entrypoints.websecure.address=:443"  
      - "--entrypoints.websecure.http.tls=true"  
      - "--entrypoints.web.address=:80"  
      - "--log.filepath=/app/traefik_int/applog.log"  
      - "--log.format=json"  
      - "--log.level=DEBUG"  # INFO WARN DEBUG ERROR  
      - "--accesslog=true"  
      - "--accesslog.filepath=/app/traefik_int/access.log"  
      - "--accesslog.format=json"  
    labels:
      - "traefik.enable=true"  
      - "traefik.http.routers.traefik.rule=PathPrefix(`/api`) || PathPrefix(`/dashboard`)"  
      - "traefik.http.routers.traefik.entrypoints=web"  
      - "traefik.http.routers.traefik.service=api@internal"  

networks:
  traefik:
    external: true

Anhang: DMZ /etc/traefik/traefik.yml
global:
  sendAnonymousUsage: false
  checkNewVersion: false

api:
  dashboard: false  # do not offer the dashboard of the DMZ traefik
  debug: false

log:
  filePath: "/etc/traefik/applog.log"  
  format: json
  level: "DEBUG"  # INFO WARN DEBUG  
  maxSize: 200
  maxBackups: 3

accessLog:
  filePath: "/etc/traefik/access.log"  
  format: json
#  bufferingSize: 100
#  filters:

providers:
  file:
    directory: "/etc/traefik/dynamic"  
    watch: true

entryPoints:
  web:
    address: ":80"  
    http:
      redirections:
        entryPoint:
          to: "websecure"  
          scheme: "https"  
          permanent: true
  websecure:
    address: ":443"  
#  traefik:
#    address: ":8080" 

certificatesResolvers:
  myLE:
    acme:
      email: "letsencrypt@meinedomain.de"  
      storage: "/etc/traefik/acme.json"  
      httpChallenge:
        # used during the challenge
        entryPoint: "web"  

Anhang: DMZ /etc/traefik/dynamic/config.yml
http:
  routers:
    grafana:
      rule: "Host(`grafana.meindomain.de`)"  
      entryPoints: "websecure"  
      tls:
        certResolver: "myLE"  
      middlewares:
      - "auth"  
      - "secRateLimit"  
      - "secHeaders"  
      service: "grafana"  

    esphome:
      rule: "Host(`esphome.meinedomain.de`)"  
      entryPoints: "websecure"  
      tls:
        certResolver: "myLE"  
      middlewares:
      - "auth"  
      - "secRateLimit"  
      - "secHeaders"  
      service: "esphome"  

  services:
    grafana:
      loadBalancer:
        servers:
          - url: "https://hal-30:3000"     # direct: OK  
#          - url: "http://grafana.hal-30/"           # via treafik_int: FAIL 

    esphome:
      loadBalancer:
        servers:
          - url: "http://hal-30:6052/"   # direct: OK  
#          - url: "http://esphom.hal-30"     # via treafik_int: FAIL 

  middlewares:

    auth:
      digestAuth:
        usersFile: "/etc/traefik/digestauthfile"  

    secHeaders:
      headers:
        browserXssFilter: true
        contentTypeNosniff: true
        frameDeny: true
        sslRedirect: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 15768000

    secRateLimit:
      rateLimit:
        average: 50
        burst: 50

Content-ID: 669743

Url: https://administrator.de/contentid/669743

Ausgedruckt am: 25.11.2024 um 18:11 Uhr