Einen oder mehrere Nginx Proxy Manager

Don-DCH

Captain
Registriert
Aug. 2009
Beiträge
3.090
Guten Abend,

ich habe mich heute mit Unraid, Docke rund Nginx Proxy Manager beschäftigt.
In vielen teilen bin ich weiter gekommen. Nur beim NPM (Nginx Proxy Manager) stehe ich gerade auf dem Schlauch, daher auch der entsprechende Thread.

Ausgangssituation

2 Unraid Server nachfolgend Server A und B genannt mit folgenden IPs:

Server A: 192.168.1.10
Server B: 192.168.1.20

Auf Server A läuft Unraid und der NPM (sagen wir mal Custom Bridged mit der IP 192.168.1.80) sowie ein paar Docker Container.
Auf Server B läuft ebenfalls Unraid und kein NPM aber ebenfalls einige Docker Container

Im NPM selbst habe ich ein SSL Zertifikat eingebunden über DNS Challange.
Auf Server B exisiert Beispielsweise ein Container mit Jellyfin.
Dieser hat die IP 192.168.1.70 mit Port 8096 http

Wenn ich jetzt auf Server A unter NPM einen Proxy eintrag gemacht habe:
HTTPS://jellyfin.mydomain.de --> 192.168.1.70:8096

Wie verhält es sich dann, wenn ein Client im Browser HTTPS://jellyfin.mydomain.de aufruft?
Es wird eine gesicherte Verbindung zu dem NPM über den Netzwerkswitch weitergeleitet.

Der NPM schickt die Anfrage UNVERSCHLÜSSELT über HTTP Port 8096 weiter über die Netzwerkinfrastruktur und sämtliche Switche bis er beim Server B angekommen ist, ist das richtig?

Um jetzt quasi Dauerhaft eine verschlüsselte Verbindung zu haben benötigt man auf beiden Servern NPM und erstellt da den Proxy Host Eintrag auf dem Server, auf dem auch der Zielcontainer ist, wäre das richtig?

Oder ist es sogar so, das man mit Docker Custom Bridge das nicht machen kann, da immer über den Netzwerk Switch oder Router läuft., da ja die einzelnen Docker unter Custom Bridge Abgeschottet sind und so die Container nicht miteinander "reden können"

So das man im Prinzip statt Custom Bridge die Docker Einstellung Bridge benötigt, da es hier dann ein Subnetz wäre? (Zweites Bild)

Ich hoffe sehr, das man meine Frage und Gedankengänge versteht.
Ich habe etwas in Draw.io vorbereitet um das ganze hoffentlich noch verständlicher zu machen.

1711904445512.png




Zweites Bild:
1711906608129.png


Viele Grüße und einen schönen Abend zusammen :)
 
Gibt mehre Möglichkeiten um sicherzustellen, dass innerhalb des LAN-Netzwerk die Verbindungen immer verschlüsselt sind.

1.) Auf beiden Servern NGINX. DNS-Records so anpassen, dass sie für die Subdomain direkt auf die richtige NGINX-Instanz gehen
2.) Auf beiden Servern NGINX. DNS-Records immer auf Host A. Je nach App Nginx-Destination auf Host-B via :443 (dabei Let's Encrypt Zertifikat auf beiden Servern ausstellen).
3) Host A und Host B durch ein privates Wireguard-VPN Netzwerk verbinden (das ist die Lösung die ich mit zwei Proxmox-Servern nutze), damit ist die Inter-Server-Kommunikation vom LAN-Netzwerk isoliert
 
Danke dir für deine schnelle Rückmeldung :)

x.treme schrieb:
1.) Auf beiden Servern NGINX. DNS-Records so anpassen, dass sie für die Subdomain direkt auf die richtige NGINX-Instanz gehen
mit nginx meinst du den Proxy manager gell? Oder den Webserver?
Also Im Prinzip so wie ich es bei Bild 2 gemacht habe?

x.treme schrieb:
2.) Auf beiden Servern NGINX. DNS-Records immer auf Host A. Je nach App Nginx-Destination auf Host-B via :443 (dabei Let's Encrypt Zertifikat auf beiden Servern ausstellen).
Das vertsehe ich nicht ganz, das wäre der Aufbau wie Bild 2 aber eine Weiterleitung wie Bild 1 und dabei jeden Container auf dem Gleichen Port 443 weiterleiten?
Geht das denn?
Oder habe ich hier einen Denkfehler?

x.treme schrieb:
3) Host A und Host B durch ein privates Wireguard-VPN Netzwerk verbinden (das ist die Lösung die ich mit zwei Proxmox-Servern nutze), damit ist die Inter-Server-Kommunikation vom LAN-Netzwerk isoliert
Das ist wirklich interessant!
An ein VPN habe ich tatsächlich garnicht gedacht.

Wie würdest du es im Allgemeinen bewerten wenn die Server im Netz unverschlüsselt Daten übertragen, mache ich mir da zu viele Sorgen/Gedanken oder ist es schon SInnvoll das mit HTTPS auch so einzurichten.

Viele Grüße
 
Den einzigen Port den ich via Docker mappen würde an deiner Stelle wäre :443 (und ggf :80 mit rewrite zu :443) von Nginx Proxy Manager.

Abseits von dem Nginx Proxy Manager Ports, musst du für die meisten Apps keinerlei weitere Ports deinem LAN-Netzwerk exposen.
Du packst NPM und Jellyfin in das selbe Docker-Netzwerk (e.g. 172.17.0.0/24), und in Nginx Proxy Manager trägst du dann "jellyfin" als Adresse (ist der Alias) sowie 8096 ein. Dadurch ist die unverschlüsselte Verbindung lediglich innerhalb des isolierten Docker-Netwerks, während Unraid selber nur :443/:80 ins LAN freigibt.

Eben so kannst du auch eine Verbindung zwischen zwei Nginx Proxy Manager Instanzen via HTTPS herstellen, indem z.B. https://cloudbeaver.mydomain.com auf 192.168.1.10:443 geht (NPM auf Server 1) dies verschlüsselt auf https://192.168.1.20:443 weiterleitet (NPM auf Server 2), und dies dann auf http://cloudbeaver:8978 weiterleitet (innerhalb Docker Netzwerk 172.17.0.0/24). Bei der Variante 2 von oben würdest du also cloudbeaver.mydomain.com auf beiden Servern in NPM eintragen (und beide Server hätten ein gültiges Let's Encrypt Zertifikat für die HTTPS Verschlüsselung), jedoch eben mit angepassten Destinations.

Dadurch haben die Docker-Apps keinen direkten Zugriff auf dein Heimnetzwerk sonder NGINX ist immer der Proxy zwischen dem Heimnetzwerk und den Docker-Netzwerken. Um's noch mehr abzusichern, richtest du für jede Docker App ein eigenes gemeinsames Docker Netzwerk mit NPM ein, damit z.B. eine kompromitierter Docker-Container nicht den unverschlüsselten Datenverkehr der anderen Container sniffen kann.

Hoffe das war einigermaßen verständlich :D
 
x.treme schrieb:
Abseits von dem Nginx Proxy Manager Ports, musst du für die meisten Apps keinerlei weitere Ports deinem LAN-Netzwerk exposen.
Du packst NPM und Jellyfin in das selbe Docker-Netzwerk (e.g. 172.17.0.0/24), und in Nginx Proxy Manager trägst du dann "jellyfin" als Adresse (ist der Alias) sowie 8096 ein. Dadurch ist die unverschlüsselte Verbindung lediglich innerhalb des isolierten Docker-Netwerks, während Unraid selber nur :443/:80 ins LAN freigibt.
Genau, so hab ich das bei meinem Synology auch gemacht.
Überall eine Extra Domain für jeden Dienst und das mit HTTPS erreichbar gemacht.
Da ich mich nicht so gut auskenne habe ich die Docker Container allerdings immer nach Anleitung von https://mariushosting.com/ installiert und nicht weiter viel hinterfragt.
Jetzt möchte ich gern alles verstehen was ich da mache und es möglichst sicher einrichten.

Für Apps wie Adguard wäre das allerdings besser eine Custom Bridge zu nutzen oder? Da man ja Port 53 so sauber getrennt vom Unraid system hat.
Generell verstehe ich das auch so, das Bridge am sichersten durch das getrennte Subnetz ist, was nur innerhalb von Docker existiert.

Man muss sich halt wieder Gedanken machen wegen dem Portmapping, das entfällt ja bei Custom Bridges, wo jeder Docker Container eine eigene IP bekommt.

Für nginx wäre denke ich Custom auch besser oder?

x.treme schrieb:
Eben so kannst du auch eine Verbindung zwischen zwei Nginx Proxy Manager Instanzen via HTTPS herstellen, indem z.B. https://cloudbeaver.mydomain.com auf 192.168.1.10:443 geht (NPM auf Server 1) dies verschlüsselt auf https://192.168.1.20:443 weiterleitet (NPM auf Server 2), und dies dann auf http://cloudbeaver:8978 weiterleitet (innerhalb Docker Netzwerk 172.17.0.0/24).
Hmm, das heißt ich binde bei beiden mein Zertifikat ein.
Und Kann bei Adguard eine DNS Umschreibung für Server 1 Setzen sprich *.mydomain.de zu 192.168.1.10 und mache auf Server 1 Einen Proxy Host Eintrag oder wäre das eine andere Option um auf einen anderen Nginx zu verweisen? Wie würde das dann gehen wenn ich 3,4,5 Container bei Server 2 habe? Ich kann die Subdomains dann nicht alle zu Server 1 Weiterleiten da man 192.168.1.10:443 nur einmal weiterleiten kann oder?


x.treme schrieb:
Um's noch mehr abzusichern, richtest du für jede Docker App ein eigenes gemeinsames Docker Netzwerk mit NPM ein, damit z.B. eine kompromitierter Docker-Container nicht den unverschlüsselten Datenverkehr der anderen Container sniffen kann.
Das klingt auch gut, da wüsste ich aber garnicht wie ich vorgehen sollte.

Vielen Dank dir für den Input ich muss da nochmal gut drüber nachdenken, so 100% hab ich das alles nicht verstanden ist aber shcon ein wenig komplex das ganze.

Vielen Dank dir für die Hilfe!
 
Ich nutze jetzt nicht Unraid oder Synology, von daher kenne ich dort die Begrifflichkeiten nicht.

Aber eine Docker Bridge erstellt KEINE neue IP in deinem Heimnetzwerk.
Mit einer Docker Bridge wird ein eigenes Subnetz erstellt (e.g. 172.17.0.0/24) in dem Docker-Container untereinander verbunden werden. Ein solches Netzwerk kann auch als Internal definiert werden, dann können die Docker-Container nicht einmal mit dem Internet kommunizieren.
Vgl. hier: https://docs.docker.com/reference/cli/docker/network/create

Erreichbar im Heimnetzwerk machst du deiner Docker-Container dann via Port-Mapping. Aber du musst nur EINEN Docker-Container via Port-Mapping erreichbar machen, und das ist Nginx Proxy Manager. Das heißt alle Anfragen für alle Subdomains schlagen immer erst bei Nginx ein (via Port 443), und dieser leitet die Anfragen dann in die entsprechenden Docker Subnets weiter. Die eigentlichen Docker-Anwendungen, sind immer nur in Docker Subnetzen ohne Port-Mapping.

Ausnahme sind Apps via eben AdGuard/PiHole. Hier kannst du Nginx Proxy Manager nicht davorschalten (bzw. solltest es nicht), weil dann AdGuard nur die IP-Adresse von Nginx sieht (e.g. 172.17.0.2) aber nicht die des eigentlichen Clients (e.g. 192.168.0.210) von dem der DNS-Request ursprünglich gekommen ist.

In diesem Fall nutzt du dann Macvlan Network Driver ( https://docs.docker.com/network/drivers/macvlan/ ), damit ist dann AdGuard unter einer eigenen IP erreichbar. Zudem kannst du bei AdGuard selber ein DNS-Zertifikat einbinden, was du z.B. über Certbot generierst ...

Du kannst 192.168.1.10:443 natürlich dank Nginx für mehrere Docker Container nutzen, Nginx Proxy Manager erkennt die Subdomain (diese wird als HOST im HTTP Request Header mitgegeben) und leitet entsprechend der definierten Regeln dann zur richtigen Destination in den Subnetzen weiter.
 
x.treme schrieb:
Eben so kannst du auch eine Verbindung zwischen zwei Nginx Proxy Manager Instanzen via HTTPS herstellen, indem z.B. https://cloudbeaver.mydomain.com auf 192.168.1.10:443 geht (NPM auf Server 1) dies verschlüsselt auf https://192.168.1.20:443 weiterleitet (NPM auf Server 2), und dies dann auf http://cloudbeaver:8978 weiterleitet (innerhalb Docker Netzwerk 172.17.0.0/24). Bei der Variante 2 von oben würdest du also cloudbeaver.mydomain.com auf beiden Servern in NPM eintragen (und beide Server hätten ein gültiges Let's Encrypt Zertifikat für die HTTPS Verschlüsselung), jedoch eben mit angepassten Destinations.
Habe das mal versucht aber irgendwie klappt es nicht :/ ich habe zwei Container auf Server 2 welche ich beim 2 nginx weitergeleitet habe. Beim Server 1 habe ich ebenfalls eine Weiterleitung eingerichtet bei den Proxy Hosts aber egal ob Port 80 oder 443 wolle das alles nicht klappen :/

Muss ich denn noch irgendwas spezielles einstellen?


x.treme schrieb:
Erreichbar im Heimnetzwerk machst du deiner Docker-Container dann via Port-Mapping. Aber du musst nur EINEN Docker-Container via Port-Mapping erreichbar machen, und das ist Nginx Proxy Manager. Das heißt alle Anfragen für alle Subdomains schlagen immer erst bei Nginx ein (via Port 443), und dieser leitet die Anfragen dann in die entsprechenden Docker Subnets weiter. Die eigentlichen Docker-Anwendungen, sind immer nur in Docker Subnetzen ohne Port-Mapping.
Da muss ich auch nochmal schauen, bisher ist es so, dass ich immer bei jedem Container Zugriff auf die jeweilige Server IP + Port habe. Ich denke das liegt auch an der Firewall die es nicht gibt? Bei Synology hatte ich dann keinen Zugriff mehr wenn ich keine Portfreigabe erstellt habe, bei Unraid schon hmm. Ich kann bei Briding nicht sagen, dass er nur das interne Netz nutzt und kein Mapping macht. Es geht qausi nicht, oder ich finde es zumindest nich, das es nur ein 172.x.x.x docker netz gibt und ich nur ngingx nach außen mappe hmm sehr komisch :/

EDIT: Während des Schreibens der Antwort wollte ich doch noch rumprobieren :D
Tatsächlich ist es so, das bei Unraid immer eine Vorlage ausgefüllt werden muss und man nicht alle Portmappings rauswerfen kann. Man müsste dann die Werte komplett löschen und neue Variablen/Optionen hinzufügen, dann scheint es zu gehen. Reichlich umständlich. Wobei ich mich frage wenn man von LAN den Jellfin Server aufrufen kann sollte das Sicherheitstechnisch ja egal sein solange man sich immer über den Reverse Proxy anmeldet, besteht ja kein Problem oder?

x.treme schrieb:
Du kannst 192.168.1.10:443 natürlich dank Nginx für mehrere Docker Container nutzen, Nginx Proxy Manager erkennt die Subdomain (diese wird als HOST im HTTP Request Header mitgegeben) und leitet entsprechend der definierten Regeln dann zur richtigen Destination in den Subnetzen weiter.
Hmm das klappt alles irgendwie leider nicht mit meinen 2 Nginx Proxys :/
 
Zurück
Oben