Reverse Proxy oder mehrere Dienste mit gleicher IP-Adresse und gleichem Port

Alles begann vor einigen Jahren, als eine kleine Website mit Anleitungen für die Kollegen auch von zuhause erreichbar sein sollte. Dazu war schnell eine Portweiterleitung im Router eingerichtet, die alle http-Anfragen an die externe IP-Adresse unseres Internetzugangs intern an den gewünschten Server schickt. Auch der Umstand, dass unser Internetzugang keine statische IP-Adresse hat, konnte mit Hilfe eines DynDNS-Dienstes behoben werden. Unser Router meldet diesem Dienst nach jeder täglichen Zwangstrennung die neue IP-Adresse unseres Internetzugangs. Somit war die Website immer unter dem gleichen Namen erreichbar.

Die unter http://intranet.meineSchule.de erreichbare Website wird vom Router intern an 192.168.0.11 weitergeleitet.
Die unter http://intranet.meineSchule.de erreichbare Website wird vom Router intern an 192.168.0.11 (Port 80) weitergeleitet.

Diese Situation hat sich außer der Umstellung von http auf https und somit von Port 80 auf Port 443 über Jahre nicht verändert. Aber dann entstand die Idee, einen eigenen Cloud-Speicherdienst anzubieten. Aus Sicherheitsgründen sollte der natürlich ebenfalls verschlüsselt – also auf Port 443 – angeboten werden. Somit war die im Titel dieses Beitrags benannte Situation entstanden: zwei/mehrere Dienste sollen unter gleicher IP-Adresse und unter gleichem Port erreichbar sein.

Da mir zwar das Problem klar war, aber die Fachbegriffe eines möglichen Lösungsansatzes fremd waren, zog sich die Recherche – wie üblich – zunächst etwas in die Länge. Aber allmählich kristallisierte sich ein Begriff heraus, der für Abhilfe sorgen kann: ein Reverse Proxy.

Wird eine Internet-Adresse aufgerufen, dann wird diese normalerweise über eine entsprechende DNS-Anfrage in eine IP-Adresse übersetzt. Damit kann der Zielserver angesprochen werden und die gewünschten Inhalte abgerufen werden. Ein Reverse Proxy ist nun eine zusätzliche Instanz, die auf der Inhalte ausliefernden Seite zwischengeschaltet ist. Er erhält statt des internen Webservers die interne IP-Adresse, die in der Portweiterleitung im Router angegeben ist. Erhält er eine Anfrage, so verlässt er sich nicht nur auf die IP-Adresse, sondern analysiert die verwendete URL. Anhand dieser leitet er die Anfrage an den gewünschten Server weiter.

Die externe Anfrage an https://intranet.meineSchule.de wird vom Reverse Proxy analysiert und aufgrund der Adresse an den passenden Server 192.168.0.12 (Port 443) weitergeleitet.
Die externe Anfrage an https://intranet.meineSchule.de wird vom Reverse Proxy analysiert und aufgrund der Adresse an den passenden Server 192.168.0.12 (Port 443) weitergeleitet.

Für die Umsetzung der beschriebenen Situation habe ich Nginx gewählt. Diese Server-Lösung eignet sich nicht nur als Webserver, sondern kann eben auch als Reverse Proxy eingesetzt werden. Im Vergleich zu anderen Projekten ist dieses trotz seiner vielfältigen Möglichkeiten relativ schlank und schont somit die Ressourcen. Bei der Realisierung halfen mir besonders die unter [1] und [2] angeführten Artikel.

Ein kleiner Nebeneffekt der Verwendung eines Reverse Proxy ist eine höhere Sicherheit. Von außen ist hier zunächst nur der Proxy selbst erreichbar. Nur die in seiner Konfiguration explizit eingerichteten Dienste auf anderen Servern sind dann aufrufbar. Alles andere läuft in die Leere.

Auf diese Weise konnte ich erreichen, dass trotz der Verwendung einer einzigen (dynamischen) externen IP-Adresse unter https://intranet.meineSchule.de und https://cloud.meineSchule.de zwei Dienste mit dem gleichen Port (443) erreichbar sind. Damit ist aber auch die Grundlage für weitere Dienste geschaffen. Wer weiß, welche Begehrlichkeiten sich hier in Zukunft noch auftun?

Interessante Links:

[1] nginx unter Debian als Reverse-Proxy nutzen

[2] Nginx als Reverse Proxy für statische Inhalte vor Apache

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.