Skip to main content

Praktische Anleitung: Pi-hole Web-UI und Nginx Proxy Manager zusammen betreiben

✔️ Überblick: Rollen der einzelnen Komponenten

Pi-hole

  • Betreibt lokalen DNS (Port 53)
  • Dient als DNS-Resolver für dein Netzwerk
  • Stellt lokale DNS-Einträge bereit, damit Geräte Servicenamen auflösen können (z. B. home.lab, jellyfin.lab)
  • Muss kein HTTP (Port 80) oder HTTPS (Port 443) ausliefern

Nginx Proxy Manager (NPM)

  • Bearbeitet den gesamten HTTP/HTTPS-Verkehr für die Dienste
  • Verwaltet SSL-Zertifikate (Let’s Encrypt, falls gewünscht)
  • Leitet eingehende Anfragen an die internen Dienste auf unterschiedlichen Ports/IPs weiter

Kernprinzip

Pi-hole ist ausschließlich für die DNS-Auflösung zuständig.
NPM kümmert sich um Web-Traffic-Routing und HTTPS-Terminierung.

Diese klare Trennung verhindert Konflikte und macht die Verwaltung skalierbar.


✔️ Beste Architektur (am zuverlässigsten)

1) Pi-hole Web-UI von Port 80/443 wegbewegen

Standardmäßig bindet Pi-hole seine Web-Oberfläche an Port 80/443. Das kollidiert mit NPM.

Pi-hole Admin-UI auf einen anderen Port umstellen (z. B. 8081, 8888):

  • Auf dem Pi-hole-Host: Lighttpd-Konfiguration anpassen, sodass /admin auf z. B. Port 8081 lauscht
  • DNS auf Port 53 bleibt davon unberührt

Dadurch kann NPM die Ports 80/443 exklusiv nutzen. (bolet.io)


2) Lokale DNS-Einträge in Pi-hole für alle reverse-proxied Hosts

Erstelle A-Records, die freundliche Domains auf die IP von NPM zeigen.

Beispiel:

pihole.lab.zn80.net     → 192.168.10.105
jellyfin.lab.zn80.net   → 192.168.10.105
bookstack.lab.zn80.net  → 192.168.10.105

Warum?

  • Geräte fragen Pi-hole-DNS ab und erhalten deine internen Namen
  • NPM leitet dann anhand des Host-Headers weiter

Pi-hole ist die maßgebliche DNS-Quelle für dein LAN. (ReproDev


3) Proxy Hosts in NPM für jeden Dienst konfigurieren

In NPM unter Proxy Hosts:

Domain / Hostname Forward To Port Hinweise
pihole.lab.zn80.net 192.168.10.105 8081 Pi-hole Admin-UI
jellyfin.lab.zn80.net 192.168.10.xxx 8096 Jellyfin-Dienst
bookstack.lab.zn80.net Weitere Dienste

Wichtige Details

  • Bei Pi-hole ggf. den Pfad /admin korrekt weiterleiten
  • Idealerweise für alle Hosts SSL aktivieren (via Let’s Encrypt – auch bei internen Domains)
    → Falls Let’s Encrypt die internen Domains nicht validieren kann, lokales CA-Zertifikat oder vertrauenswürdiges selbstsigniertes Zertifikat verwenden und auf den Clients einpflegen. (Reddit)

Dadurch wird alles sauber nur über Hostnamen erreichbar:

https://jellyfin.lab.zn80.net
https://pihole.lab.zn80.net/admin

4) Interne explizite DNS-Einträge statt Wildcard (optional, aber sicherer)

Man könnte versucht sein, einen Wildcard zu nutzen (*.lab.zn80.net → 192.168.10.105), das ist jedoch weniger sicher und macht Zertifikatsvalidierung & Fehlersuche schwieriger.

Besseres Muster:

  • Pi-hole lokaler DNS → explizite A-Records pro Hostname
  • Pi-hole → NPM-IP
  • NPM → interner Dienst

Explizite Einträge helfen bei:

  • TTL-Verwaltung
  • SSL-Zertifikatsausstellung
  • Fehlersuche

🧠 Warum das der beste Weg ist

✅ DNS + Reverse Proxy sind sauber getrennt

Pi-hole liefert kein HTTP → keine Port-Konflikte
NPM kann 80/443 störungsfrei nutzen

✅ Echte HTTPS-Verschlüsselung auch intern

Jeder Dienst kann über NPM ein gültiges Zertifikat erhalten

✅ Einfach, skalierbar & zukunftssicher

Neuen Dienst hinzufügen:

  1. A-Record in Pi-hole anlegen
  2. Proxy Host in NPM erstellen
  3. Fertig

✅ Funktioniert mit VPN / lokalen DNS-Clients

Solange Geräte Pi-hole als DNS-Server nutzen (LAN, WLAN, VPN), lösen sie die Namen auf, die NPM proxyen kann. (Pi-Hole Uberspace)


🛠 Detaillierte Umsetzung

A) Pi-hole Weboberfläche auf anderen Port legen

Datei bearbeiten: /etc/lighttpd/lighttpd.conf

server.port = 8081

Danach neu starten:

sudo systemctl restart lighttpd

B) DNS-Einträge in Pi-hole anlegen

In Pi-hole unter:
Local DNS → DNS Records

Beispiele:

pihole.lab.zn80.net     → 192.168.10.105
jellyfin.lab.zn80.net   → 192.168.10.105

C) Proxy Hosts in NPM anlegen

Für jeden Dienst:

  • Domain-Namen: deine lokale Domain
  • Forward-Hostname/-IP + Port: echter Dienst (Pi-hole Admin = 8081)
  • SSL:
    • Neues Zertifikat anfordern (wenn öffentliche Domain oder DNS-Challenge möglich)
    • Oder lokales CA / vertrauenswürdiges selbstsigniertes Zertifikat verwenden

Empfohlene Standard-Optionen:

  • Block exploits → aktiviert
  • Expires headers → optional
  • Websockets → falls benötigt

🚫 Was man nicht tun sollte

❌ DNS-Port 53 nicht über NPM proxyn

DNS muss direkt erreicht werden – niemals proxyen!

❌ Pi-hole Admin-UI nicht öffentlich exponieren

Nur aus LAN oder per VPN erreichbar machen.

❌ Keine Wildcards verwenden, wenn man die Zertifikatskette nicht beherrscht

Wildcard-DNS kann HTTPS kaputt machen, wenn die Zertifikate nicht passen.


📌 So sollte es am Ende aussehen

Nach der Einrichtung:

nslookup pihole.lab.zn80.net    # → 192.168.10.105
nslookup jellyfin.lab.zn80.net  # → 192.168.10.105

Im Browser:

https://pihole.lab.zn80.net/admin          # mit SSL
https://jellyfin.lab.zn80.net              # mit SSL

Pi-hole macht DNS, NPM übernimmt den Web-Zugriff – alles sicher, konsistent und gut wartbar.

Viel Erfolg bei der Umsetzung!