Zum Hauptinhalt springen
  1. Braindump/

SSH-Port-Tunnel für den Zugriff auf Services

2 min
Marcel Ryser
Autor
Marcel Ryser
Softwarearchitekt und Tech-Enthusiast aus Bern

Oft ist es sehr praktisch, per Tunnel auf Services zu Hause oder auf einem Server zuzugreifen.

Beispiel: Du betreibst auf einem Server, den du per SSH verwaltest, eine MySQL-Instanz. Sie ist nicht ins Internet exponiert und lauscht nur auf localhost. Jetzt willst du mit deinem SQL-Lieblingstool auf die Datenbank zugreifen.

Klar, das ginge per VPN – aber die sind nicht leicht korrekt einzurichten. Da du den Server ohnehin über SSH verwaltest, hast du bereits ein einfaches Werkzeug zur Hand: einen Port-Tunnel durch SSH. Das ähnelt dem Port-Forwarding, das du vielleicht vom Heim-Router kennst. Ziel ist ein Port auf deiner Maschine, der auf einen Port einer entfernten Maschine weitergeleitet wird.

Das geht so:

$ ssh -f user@mydomain.com -L <port>:<remote host>:<remote port> -N
Parameter:
-f                 Führt den Befehl im Hintergrund aus, blockiert deine
                   Terminal-Session also nicht.
                   Achtung: Der Tunnel bleibt offen, solange du das Netzwerk
                   nicht trennst oder den SSH-Prozess killst.
                   Ohne diesen Parameter schliesst du die Verbindung mit
                   <Ctrl>+C und beendest damit den SSH-Tunnel.
user@mydomain.com  Benutzername und Host deines SSH-Servers.
-L                 Erzeugt den Tunnel statt einer normalen SSH-Session.
<port>             Lokaler Port auf deiner Maschine, der aufs entfernte System
                   weitergeleitet wird.
<remote host>      Host des Services, mit dem du dich verbinden willst; kann der
                   SSH-Host sein, meist aber der Host der MySQL-Instanz.
<remote port>      Port auf dem entfernten Host, zu dem der Tunnel verbindet.
                   Bei MySQL wäre das 3306.
-N                 Wir wollen auf dem entfernten System nichts ausführen, nur
                   einen Tunnel aufbauen.

Für einen PostgreSQL-Server sähe das so aus:

$ ssh -f marcel@metawave.ch -L 5432:localhost:5432 -N

und bei einem MySQL-Server:

$ ssh -f marcel@metawave.ch -L 3306:localhost:3306 -N

Nach Eingabe des Passworts steht die Tunnel-Verbindung. Jetzt greifst du auf den entfernten Service zu, als liefe er auf deiner lokalen Maschine. In deinem SQL-Tool gibst du als Hostname localhost ein und verbindest dich wie auf dem entfernten System.

Nebenbei verbessert das die Server-Sicherheit: Statt zu viel nach aussen zu exponieren, verbindest du dich über einen sicheren SSH-Tunnel und greifst von dort auf deine Services zu.