Caddy als reverse proxy

mubuntu

New member
Caddy als reverse proxy
Ich betreibe einen debian trixie server im hausnetz fritz.box mit einer festen ip. 192.168.178.2 Darauf läuft Docker. Mit drei Containern/Services auf verschiedenen Ports. Die Services sind unter /opt/docker/service1, …/service2, …/service3 angelegt. Jeder Service mit eigener Docker-compose.yaml Datei. (Ich würde jeden Dienst gern im Hausnetz mit Namen aufrufen. ZB. http(s)://dienst1.fritz.box.) Jeder Service legt idR ein eigenes Netz an. 172.xx.0.0/16. Soweit laufen die Dienste. Nun möchte ich Caddy als reverse proxy davor zu setzen, der über Port 80/443 alle 3 services erreichbar macht. (Nur im Hausnetz! Nicht von außen!) Hierfür werden die Services alle im selben Dockernetz betrieben. Hierfür habe ich unter Docker ein proxy-net angelegt. In den .yaml Dateien der Dienste habe ich dieses Netz dann zugewiesen. —> networks: external: true
Auch das funktioniert soweit. Alle Dienste im selben Netz. Auf der Fritzbox habe ich bei DNS-Rebind-Schutz die drei Serverdienst-url‘s („dienst1-3.fritz.box“) als Ausnahme eingetragen. Leider funktioniert das Konstrukt nicht. Anbei die caddy-config sowie das Caddyfile.

docker-Composite.yaml
services:
caddy:
container_name: caddy
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
networks:
- "proxy-network"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./data:/data
- ./config:/config
networks:
proxy-network:
external: true

Mit diesem nachfolgendem Caddyfile ist der Container zwar im proxy-network, zieht aber keine ip-Adresse. Lasse ich den Eintrag weg, wird eine IP gezogen.)
{
auto_https off
}
pihole.fritz.box:12380 {
proxy-network pihole:12380 # der pihole-port ist umgebogen
}

Kann mir bitte jemand weiter helfen? Ich bin thematisch nicht tief genug im Thema um das zu lösen. Besten Dank im Voraus!
 
Kannst du das Konstrukt genauer darstellen?

Liest sich so als wenn der pihole der für die Namensauflösung benötigt wird selber hinter dem proxy läuft.
Der proxy soll ja eben Dienste hinter sich verstecken.
Die Namensauflösung (DNS, port 53) muss aber im Netz verfügbar sein.

Ausnahme beim DNS Rebind Schutz sorgt nur dafür dass die sub.example.com im lokalen Netz aufrufen kannst, ohne dass die Fritzbox dazwischen grätscht.

Alle Dienste laufen als Container?
Caddy, pihole und ein dritter?
Dann mindestens mal die komplette compose Datei von caddy und pihole bitte.
 
Alle Dienste laufen als Container mit eigener .yaml-File. Aktuell läuft als dritter Dienst noch WUD. DNS läuft auf dem Dienst pihole:12380 weitergeleitet zur FRITZ!Box. Diese verteilt über dhcp auch die ip des DNS Servers. Anbei die pihole-config. Caddy ist bereits komplett gepostet. Danke für die Unterstützung!

YAML:
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
     # dns ports
     - "53:53/tcp"
     - "53:53/udp"
     # Default HTTP Port
     - "12380:80/tcp"
     # Default HTTPS Port
     - "12443:443/tcp"
    networks:
     - "proxy-network"
    environment:
     TZ: 'Europe/Berlin'
     FTLCONF_webserver_api_password: 'xxxxxxxx'
     FTLCONF_dns_upstreams: '192.168.178.1'
     FTLCONF_dns_listeningMode: 'ALL'
    volumes:
     - './etc-pihole:/etc/pihole'
    restart: unless-stopped
networks:
  proxy-network:
    external: true # Use the pre-created network
 
Was heißt?
pihole:12380 weitergeleitet zur FRITZ!Box.

Normal sollte ja nur die Fritzbox den DNS Redolver im Heimnetz verteilen. Und dieser dann (externe) upstream DND Resolver und Server befragen.
Zudem ist 12380 in deinem Beispiel ein Web UI Port und hat nix mit DNS zu tun.
Wenn du am Ende alles nur intern betreiben willst braucht es auch keine Portfreigabe oder Portweiterleitung in der Fritzbox.

Das Netzwerk 'proxy-network' hast du selbst definiert? Wenn ja, wie genau?

Du willst ja außerhalb des Docker Host im LAN nur den Proxy erreichen. Und der proxy wiederum nur über docker interne Netzwerke die nachgelagerten Dienste.
Der Caddy braucht also Zugriff via Host ins LAN über ein Docker Netzwerk. Die Container untereinander Zugriff über ein zweites Netzwerk. Nur caddy sitzt dann in beiden.

Willst du caddy nur für die Web UI der Dienste, oder soll sämtlicher Verkehr (dns, http, https,...) über den Proxy?
 
Ich nutze Caddy zwar nicht, aber das hier kann so nicht korrekt sein:
Code:
pihole.fritz.box:12380 {
proxy-network pihole:12380 # der pihole-port ist umgebogen
}

Es müsste so aussehen:
Code:
pihole.fritz.box {
  reverse_proxy pihole:80
}
Dein Caddy bindet Port 80 und 443, von hier kommen die Pakete rein. Innerhalb von Caddy ist dann der Port bei den Regeln irrelevant, da hier nur die Domain für die Erkennung des Ziels relevant.

Ich wüsste gerne wie Du auf die Idee kommst, dass hier proxy-network zu verwenden ist, wenn reverse_proxy eine Direktive ist (sieh https://caddyserver.com/docs/caddyfile/directives). Das ist nicht einfach irgendein Platzhalter :)

Da Caddy und der Ziel-Container im selben Container-Netzwerk sein müssen, kennt Caddy über Docker's Service Discovery innerhalb des Container-Netzwerks schon den Ziel-Container. Hier den Containernamen zu verwenden ist richtig, dann aber den Host-Port zu verwenden, obwohl du über das Container-Netzwerk kommst, ist nicht richtig.

Da dein Pihole als DNS-Server an die Clients kommuniziert wird, benötigt man im Pihole je Domain einen Override Eintrag, der jeweils auf die IP des Dockerhosts auflösen muss (auch hier hat ein Port nichts zu suchen).
 
Was mir nicht klar ist, er müsste doch auch die DNS Ports über den proxy leiten, oder kann man bei Docker den pihole web-ui Port ins Container Netz mit Caddy und die pihole DNS Ports am Proxy vorbei bekommen?

In der Verlegenheit war ich noch nie.
Bis jetzt habe ich nur interne Netze und web ui via proxy oder direkt (wenn es ein extra web-ui container ist). Dass noch weitere Dienste von einem anderen Container exposed werden sollen noch nicht.
Pihole laufen bei mir direkt als proxmox LXC.
 
Ehrlich gesagt habe ich den ersten Paragraphen nicht so richtig verstanden, daher gehe ich auf die Teile ein, die ich verstanden habe:
PiHole bindet doch port 53 udp/tcp. Damit ist der Docker-Host direkt als DNS-Resolver über die IP des Docker-Host ansprechbar. Ein gepublishter Port macht Portforwarding vom Host-Port zum Container Port. Caddy als Layer 4 LB hat nur dann Charme, wenn einem die Source-IP egal ist, und/oder man mehrere Instanzen zur Lastverteilung beim LB registrieren will.

Die Web-UI vom Container wäre nach der Anpassung am Caddyfile sowohl mittels Domain-Namen durch Caddy erreichbar, als auch zusätzlich noch über den Published Host-Port zu erreichen.
 
Ja, hatte interne Netze im Kopf.

Hast recht. Dann sind alle Dienste über Host IP und Port erreichbar.
Außer, dass man dann mehrere Dienste über den Proxy erreicht gibt es dann aber keinen Vorteil, oder?
Keine Abschottung, nix.
 

Letzte Anleitungen

Statistik des Forums

Themen
8.017
Beiträge
78.907
Mitglieder
8.721
Neuestes Mitglied
gkhar2
Zurück
Oben