2x Traefik kaskadiert: RevProxy im DMZ + LAN (Docker) mit subdomains im LAN?
Ausgangslage: Erfolgreich traefik (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)
traefik_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 bestehendem Docker-Server 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:
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:
Anhang: /app/traefik_int/docker-compose.yml
Anhang: DMZ /etc/traefik/traefik.yml
Anhang: DMZ /etc/traefik/dynamic/config.yml
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)
traefik_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 bestehendem Docker-Server 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"
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://esphome.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
Please also mark the comments that contributed to the solution of the article
Content-ID: 669743
Url: https://administrator.de/contentid/669743
Printed on: December 7, 2024 at 17:12 o'clock