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
/adminauf 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
/adminkorrekt 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:
- A-Record in Pi-hole anlegen
- Proxy Host in NPM erstellen
- 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!