Ich liebe es, solche Dinge durch Visualisierung zu erklären. :-)
Stellen Sie sich Ihre SSH-Verbindungen als Röhren vor. Große Röhren. Normalerweise greifen Sie durch diese Röhren, um eine Shell auf einem Remotecomputer auszuführen. Die Shell läuft in einem virtuellen Terminal (tty). Aber du kennst diesen Teil schon.
Stellen Sie sich Ihren Tunnel als eine Röhre in einer Röhre vor. Sie haben immer noch die große SSH-Verbindung, aber mit der Option -L oder -R können Sie eine kleinere Röhre darin einrichten.
Jede Röhre hat einen Anfang und ein Ende. Die große Röhre, Ihre SSH-Verbindung, hat mit Ihrem SSH-Client begonnen und endet auf dem SSH-Server, mit dem Sie verbunden sind. Alle kleineren Röhren haben dieselben Endpunkte, mit der Ausnahme, dass die Rolle von "Start" oder "Ende" davon abhängt, ob Sie sie verwendet -L
oder -R
(bzw.) erstellt haben.
(Das haben Sie nicht gesagt, aber ich gehe davon aus, dass der "entfernte" Computer, den Sie erwähnt haben, der sich hinter der Firewall befindet, über Network Address Translation (NAT) auf das Internet zugreifen kann. Dies ist also ziemlich wichtig Bitte korrigieren Sie diese Annahme, wenn sie falsch ist.)
Wenn Sie einen Tunnel erstellen, geben Sie eine Adresse und einen Port an, auf die er antwortet, sowie eine Adresse und einen Port, an die er übermittelt wird. Die -L
Option weist den Tunnel an, auf der lokalen Seite des Tunnels (dem Host, auf dem Ihr Client ausgeführt wird) zu antworten. Die -R
Option weist den Tunnel an, auf der Remote-Seite (dem SSH-Server) zu antworten.
Also ... Um aus dem Internet in eine Maschine hinter einer Firewall SSH zu können, muss die betreffende Maschine eine SSH-Verbindung zur Außenwelt herstellen und einen -R
Tunnel einschließen, dessen "Eintrittspunkt" die "entfernte" Seite von ist seine Verbindung.
Von den beiden oben gezeigten Modellen möchten Sie das rechts.
Vom Firewall-Host:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Dies weist Ihren Client an, einen Tunnel mit einem -R
Emote-Einstiegspunkt einzurichten. Alles, was an Port 22222 am anderen Ende des Tunnels angeschlossen ist, erreicht tatsächlich "localhost port 22", wobei "localhost" aus der Perspektive des Ausgangspunkts des Tunnels (dh Ihres ssh-Clients) ist.
Die anderen Optionen sind:
-f
Weist ssh an, sich nach der Authentifizierung im Hintergrund zu bewegen, damit Sie nicht auf dem Remote-Server herumstehen müssen, um den Tunnel am Leben zu erhalten.
-N
gibt an, dass Sie eine SSH-Verbindung benötigen, jedoch keine Remotebefehle ausführen möchten. Wenn Sie nur einen Tunnel erstellen, sparen Sie durch das Einschließen dieser Option Ressourcen.
-T
Deaktiviert die Pseudo-Tty-Zuordnung. Dies ist angemessen, da Sie nicht versuchen, eine interaktive Shell zu erstellen.
Es wird eine Passwortabfrage geben, es sei denn, Sie haben DSA- oder RSA-Schlüssel für eine passwortlose Anmeldung eingerichtet.
Es wird DRINGEND empfohlen, ein Wegwerfkonto (nicht Ihr eigenes Login) zu verwenden, das Sie nur für diesen Tunnel / Kunden / Server eingerichtet haben.
Stellen Sie nun von Ihrer Shell aus über den Tunnel eine Verbindung zum Firewall-Host her:
ssh -p 22222 username@localhost
Sie erhalten eine Host-Schlüssel-Herausforderung, da Sie diesen Host wahrscheinlich noch nie zuvor getroffen haben. Dann erhalten Sie eine Passwortabfrage für das username
Konto (es sei denn, Sie haben Schlüssel für die passwortlose Anmeldung eingerichtet).
Wenn Sie regelmäßig auf diesen Host zugreifen, können Sie den Zugriff auch vereinfachen, indem Sie Ihrer ~/.ssh/config
Datei ein paar Zeilen hinzufügen :
host remotehostname
User remoteusername
Hostname localhost
Port 22222
Anpassen remotehostname
und anpassen remoteusername
. Das remoteusername
Feld muss mit Ihrem Benutzernamen auf dem Remote-Server übereinstimmen. Es remotehostname
kann sich jedoch auch um einen beliebigen Hostnamen handeln, der zu Ihnen passt. Es muss nichts Auflösbares enthalten.
(Um den Reverse-Endpunkt auf einer nicht lokalen Host- IP verfügbar zu machen , lesen Sie diesen Beitrag. )