Remote Port Weiterleitung mit SSH

Lokale Dienste im Internet verfügbar machen

Ein Problem vieler Heimarbeiter ist, wie man lokal verfügbare Dienste, wie zum Beispiel eine in Entwicklung befindliche Website, für einen Kunden im Internet verfügbar machen kann. Dieser Artikel zeigt, wie man dies mit einer nur auf SSH basierenden Lösung erreicht.

Gefangen im lokalen Netz

Die Situation kennt jeder Entwickler: Üblicherweise entwickelt man seine Programme oder eine Website auf dem heimischen Rechner, egal ob es sich dabei um ein Laptop, Desktop oder einen Server im Keller handelt. Dieser Rechner befindet sich in einem lokalen Netzwerk, aus dem heraus zwar Verbindungen ins Internet hergestellt werden können, nicht jedoch auf umgekehrten Weg.

Dies verhindert die "Netzwerkaddressenübersetzung" oder "Network Address Translation" (NAT) im heimischen Router, der auch die Verbindung ins Internet herstellt. Dabei wird eine Adresse aus dem Internet allen Rechnern im lokalen Netz zur Verfügung gestellt, sobald diese eine Verbindung ins Internet aufbauen. Im lokalen Netzwerk arbeiten die Rechner mit Adressen, die im Internet nicht verarbeitet werden.

Der Vorteil dieser Technik, dass nicht alle Rechner im lokalen Netzwerk mit einer Adresse aus dem Internet ausgestattet werden müssen, ist dadurch gleichzeitig ihr größter Nachteil: sie sind aus dem Internet nicht ohne weiteres erreichbar.

Portfreigaben und dynamisches DNS

Die Standardlösung in diesem Fall ist es, am Router sogenannte Portfreigaben einzurichten. Damit können Verbindungsanfragen aus dem Internet, die an die Internet-Adresse des Routers gerichtet sind, von diesem auf bestimmte Rechner im Heimnetzwerk weitergeleitet werden.

Das Problem dabei ist, dass die Internet-Adresse des Routers sich ständig ändert, üblicherweise sogar täglich, was wiederum durch Dynamisches DNS (DDNS) gelöst werden kann. Dies kann aber bereits einigen Aufwand und auch Kosten verursachen, nämlich dann, wenn man eigene Domänennamen verwenden will und nicht die vom DDNS-Provider zur Verfügung gestellten.

Dieser Aufwand ist durch die Einführung von IPv6 alles andere als geringer geworden und teilweise - je nach Provider - sogar völlig vergeblich.

Ein weiterer Nachteil: Sollte man sich mit seinem Arbeitsplatzrechner mal in einem anderen als im Heimnetzwerk aufhalten, funktioniert diese Konstruktion nicht mehr.

Weiterleitungsdienste

Hier kommen Anbieter wie ngrok oder localtunnel ins Spiel. Anstatt eine starre Weiterleitung aus dem Internet über den heimischen Router an einen ganz bestimmten Rechner im Heimnetzwerk aufzubauen, wird hier eine Verbindung vom Arbeitsplatzrechner zum Dienstanbieter aufgebaut und offen gehalten, sodass diese auch für den umgekehrten Weg genutzt werden kann. Auf diese Weise kann man von überall eine solche Verbindung einrichten und nutzen.

Auch bei diesen Diensten gilt jedoch, dass die verwendeten Domänennamen nicht frei wählbar sind, es sei denn, man ist bereit für diesen Service zu bezahlen.

Wer das nicht möchte und auch ansonsten eine noch weitergehendere Lösung mit eigenen Mitteln einrichten will, findet in diesem und in den verwandten Artikeln eine Anleitung die hauptsächlich auf SSH basiert.

Voraussetzung ist allerdings, dass ein Rechner im Internet mit SSH-Zugang zur Verfügung steht, z.B. ein "Virtual Private Server" (VPS) wie Lightsail von Amazon Web Services, vServer von HostEurope oder ähnliche Produkte von anderen Anbietern.

Remote Port Weiterleitung mit SSH

In einem anderen Artikel dieses Blog wird die Local Port Weiterleitung als Lösung beschrieben, wenn man vom heimischen Rechner eine Verbindung zu einem Service auf einem Rechner im Internet herstellen will, der für diesen Service jedoch keine Verbindungsanfragen von außerhalb entgegennimmt.

Jetzt stellt sich das Problem genau andersherum: Wir wollen von einem Rechner im Internet den heimischen Rechner erreichen, z.B. eine Website, die auf dem lokalen Rechner läuft. Da von außen keine Verbindung aufgebaut werden kann, muss sie vom lokalen Rechner eingerichtet werden.

Die Lösung ist in diesem Fall eine Remote Port Weiterleitung, die genauso mit SSH eingerichtet werden kann, wie die Local Port Weiterleitung, nur dass anstelle des Parameters -L der Parameter -R verwendet wird, dessen Wert die folgende Form annimmt:

[REMOTEHOST:]REMOTEPORT:LOCALHOST:LOCALPORT

Zu beachten ist, dass hier der REMOTEPORT auf dem REMOTEHOST nicht bereits belegt sein darf, so wie bei der Local Port Weiterleitung der LOCALPORT des LOCALHOST nicht bereits belegt sein darf.

Im hier verwendeten Beispiel läuft auf dem entfernten Rechner bereits ein Web-Server, der Anfragen auf Port 80 entgegen nimmt. Daher wird als REMOTEPORT der Port 8080 verwendet.

Wenn also eine lokale Website, die auf dem lokalen Rechner auf dem Standardport 80 erreichbar ist, auf einem entfernten Rechner auf Port 8080 verfügbar gemacht werden soll, wäre die Port Weiterleitung wie folgt einzuleiten:

$ ssh -f -N -R 8080:localhost:80 VPS

Hiermit wird jede Anfrage, die auf dem entfernten Rechner an den Port 8080 gerichtet wird, durch die mit SSH aufgebaute Verbindung zum heimischen Rechner und Port 80 "getunnelt".

Die nachfolgende Abbildung zeigt dies schematisch: Auf direktem Weg über den Router ist der Port 80 des Home-PC links für den Client rechts nicht erreichbar. Startet man jedoch auf dem Home-PC eine Remote Port Weiterleitung zum VPS, ist der Port 80 des Home-PC auf dem VPS als Port 8080 ansprechbar.

Remote Port Weiterleitung

Ein offenes Gateway wird benötigt

Einen Haken hat diese Weiterleitung jedoch: Die Betonung im vorletzten Absatz liegt auf "Anfrage, die auf dem entfernten Rechner (VPS) an den Port 8080 gerichtet wird". Von außerhalb des VPS ist dieser Port nämlich nicht erreichbar.

Das lässt sich sehr gut sehen, wenn man sich auf dem VPS die offenen Ports anschaut, z.B. mit dem Befehl netstat:

$ sudo netstat -ltpn
tcp     0   0 127.0.0.1:8080       0.0.0.0:*         LISTEN   27651/sshd: uwe
tcp6    0   0 ::1:8080             :::*              LISTEN   27651/sshd: uwe
$

Wie man sieht, ist der SSH-Server, der auf Port 8080 Anfragen entgegen nimmt, nur über die lokale Netzwerkschnittstelle 127.0.0.1 erreichbar, also von innerhalb des VPS, und nicht von außerhalb.

Man müsste also den Browser auf dem VPS starten, um über die Adresse http://localhost:8080/ die Website auf dem heimischen Rechner zu erreichen. Dies ist normalerweise nicht gewollt und auch nicht praktikabel. Vielmehr will man ja, dass von einem ganz anderen Rechner, zum Beispiel vom Arbeitsplatzrechner eines Kunden, dieser mit dem Umweg über den VPS auf den heimischen Rechner zugreifen kann.

Der Server im Internet müsste daher ein sogenanntes "offenes Gateway" bilden und weitergeleitete Ports auch von außen zugänglich machen, aber die Standardkonfiguration eines SSH-Servers verbietet dies mit der Option GatewayPorts no.

Um die Verwendung des SSH-Servers als Gateway zu erlauben, muss in der entsprechenden Konfigurationsdatei (normalerweise /etc/ssh/sshd_config) die Option GatewayPorts auf yes geändert werden.

Nach einem Neustart des SSH-Servers zeigt der Befehl netstat folgende Ausgabe:

$ netstat -ltpn
tcp     0   0 0.0.0.0:8080         0.0.0.0:*         LISTEN   27651/sshd: uwe
tcp6    0   0 :::8080              :::*              LISTEN   27651/sshd: uwe
$

Jetzt ist es also von überall möglich, den ssh-Tunnel zu nutzen.

Alternative Lösungen

Die Öffnung jeglicher weitergeleiteten Ports für alle Rechner im Internet stellt ein gewisses Sicherheitsrisiko dar und ist daher in der Standardkonfiguration eines SSH-Servers nicht ohne Grund deaktiviert. Darüberhinaus hat man möglicherweise auf dem VPS nicht die Möglichkeit, etwas an der SSH-Serverkonfiguration zu verändern. Daher stellt sich die Notwendigkeit, auch alternative Lösungen in Betracht zu ziehen.

Zwei Möglichkeiten, die ohne die Konfiguration des SSH-Servers als offenes Gateway auskommen, sind entweder die Kombination aus Remote und Local Port Weiterleitung oder die Verwendung eines Webservers als Reverse Proxy.

Top