Leiten Sie SSH-Datenverkehr über eine mittlere Maschine weiter

110

SSH-Tunneling ist für mich sehr verwirrend. Ich frage mich, ob ich das unter Linux machen kann.

Ich habe 3 Maschinen ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Also kann ich von A -> B und von B -> C SSH, aber nicht von A -> C.

Gibt es eine Möglichkeit, einen SSH-Tunnel von A bis B einzurichten? Wenn ich also andere SSH-Befehle ausführe, funktionieren diese nur von meinem lokalen Computer A aus. Ich versuche im Grunde, ein Git-Repo von der Arbeit nach Hause zu klonen (und ich kann Git nicht auf Maschine B installieren).

Auch einmal eingerichtet .. Wie würde ich es auch deaktivieren?


quelle
Ich glaube, es gibt irgendwo eine doppelte Frage, aber meine Suchmaschine ist heute schwach.
Quack Quijote
2
Mögliches Duplikat eines SSH-Tunnels über mehrere Hopfen
Geza Kerecsenyi
Wenn Sie Linux auf Computer A ausführen, verwenden Sie ein Tool namens sshuttle, mit dem Sie den gesamten Verkehr für C selektiv durch den A-> B-Tunnel weiterleiten können (vorausgesetzt, C ist von B aus sichtbar).
16.

Antworten:

128

.ssh/configFügen Sie dies in Ihre Datei auf hostA ein (siehe man 5 ssh_config für Details):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Jetzt wird der folgende Befehl automatisch durch hostB getunnelt

hostA:~$ ssh hostC

Möglicherweise möchten Sie Optionen wie -oCiphers=arcfourund hinzufügen, um die Verarbeitung -oClearAllForwardings=yeszu beschleunigen, da das Einschließen von sshInhalten sshrechenintensiver ist und der zusätzliche Aufwand und der Wrapper nicht so sicher sein müssen, wenn bereits verschlüsselter Datenverkehr getunnelt wird.


Wenn Sie OpenSSH vor 5.3 verwenden, ist die -WOption nicht verfügbar. In diesem Fall können Sie das Obige mit netcat ( nc) implementieren :

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB
vergänglich
quelle
1
Das ist brilliant! Danke. Dies löst ein Problem, das mich in den letzten zwei Tagen aufgefressen hat: HostC sitzt hinter einer Firewall und verfügt über Daten, auf die ich von HostA aus zugreifen möchte, einem Laptop, der sich überall auf der Welt befinden kann. hostB befindet sich ebenfalls hinter derselben Firewall wie hostC, verfügt jedoch über einen für die Welt offenen SSH-Port. Somit kann ich von hostC -> hostB ssh. Ich richte einen umgekehrten SSH-Tunnel zwischen hostC und hostB ein, damit ich auch von hostB aus ssh -> hostC (über localhost weitergeleitet) kann. Mit deinem Trick kann ich von HostA -> HostC! Es funktioniert nahtlos mit SCP & Fugu unter OSX! Danke!
AndyL
Die -WOption sollte anstelle der ncOption verwendet werden.
3.
Welches SSH sollte -Wnur das auf hostA (dem Ursprung) oder auch das auf hostB (dem mittleren Rechner) unterstützen?
Gioele
Wenn Sie mehrere Hosts haben, die Sie über denselben Server erreichen möchten hostB, können Sie darüber mehrere Host hostCZeilen deklarieren, ProxyCommandum den Zugriff auf mehrere Hosts über den mittleren Server zu vereinfachen.
fduff
7

Bearbeiten: Dies ist der falsche Ansatz. Siehe stattdessen die Antwort von ephemient . Diese Antwort wird funktionieren, ist aber möglicherweise weniger sicher und definitiv weniger beeindruckend.

Es hört sich so an, als wollten Sie eine Lösung wie die folgende:

ssh -L localhost:22:machinec:22 machineb

Das bringt dir eine Muschel auf machineb. Lass das in Ruhe; minimieren Sie das Terminalfenster.

Nun, wenn Sie eine SSH - Verbindung zu machen localhost, werden Sie tatsächlich zu verbinden machinecdurch machineb. Wenn Sie mit dem Tunnel fertig sind, schließen Sie einfach das Terminal, in dem Sie den obigen Befehl ausgeführt haben.

Beachten Sie, dass Sie Superuser-Berechtigungen benötigen, um den Befehl auszuführen.

Wesley
quelle
+1 Danke, Wesley. Dies ist die eigentliche Antwort auf das SSH-Tunneling. Hier ist ein Artikel darüber: securityfocus.com/infocus/1816
Larry K
3
Im Großen und Ganzen ist das ziemlich böse ... aber ich musste dies mit alten Versionen von OpenSSH oder anderen ssh-Clients tun. Sie könnten einen hohen Port wie 8022 auswählen: Auf diese Weise stört es keinen ssh-Dienst auf localhost und erfordert keine Ausführung als root. Ergänzen -p 8022Sie einfach Ihre ssh-Befehle. Und mit git ist es denkbar einfach: Verwenden Sie die URI ssh://localhost:8022/path/to/repo.git.
Ephemient
3

Klingt so, als ob Sie einen Shell-Alias ​​auf A haben möchten, der dazu führt, dass ssh auf C auftritt

  1. Ich gehe davon aus, dass Sie auf A ssh me @ b "ssh me @ c hostname" eingeben und "C" zurückholen können.
  2. Erstelle einen Alias ​​sshc, der sshc foo zu ssh me @ b "ssh me @ c foo" erweitert
  3. Die genaue Syntax zum Erstellen des Alias ​​finden Sie unter superuser.com
Larry K
quelle
1
Sie können hinzufügen müssen , -tum die äußere ssh Optionen , wenn Sie eine interaktive Shell wollen, da sshdavon ausgegangen , -Twenn es einen Befehl gegeben hat.
Vergänglich
1

Für die interaktive Shell können Sie diesen einfachen Befehl verwenden:

ssh -J <user>@<hostB> <user>@<hostC>

Die Option -J ist für den Sprung .

ssasa
quelle
0

Wenn Ihr Arbeitgeber ein VPN bereitstellt, würde ich empfehlen, dieses stattdessen zu verwenden.

Auf diese Weise müssen Sie keine Anwendungen speziell konfigurieren (auch nicht ssh), und Sie können jeden Computer hinter der Firewall sehen. Darüber hinaus wird der gesamte Datenverkehr von der VPN-Software verschlüsselt, wodurch versehentlich oder absichtlich unverschlüsselter Datenverkehr sicherer wird.

Andrew Wagner
quelle
6
Manchmal ist es das VPN, das der Grund ist, warum wir diese Tricks brauchen ...
Louis
0

YASS Noch eine einfache Lösung

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Öffnen Sie mit dem ersten Befehl eine SSH- Verbindung zu HostB und weisen Sie HostB an, Verbindungen von localhost: 2222 an HostC: 22 weiterzuleiten .
  • Der -fParameter weist SSH an, nach dem Verbindungsaufbau in den Hintergrund zu wechseln
  • Der zweite Befehl öffnet einfach eine Client-Verbindung zu localhost: 2222
  • Option HostKeyAlias sind nicht erforderlich, können jedoch dazu beitragen, die Verbindung zu einem falschen Host zu verhindern
  • Hinweis: Der Befehl sleep 10wird benötigt, um die Verbindung aufrechtzuerhalten, bis der zweite Befehl ssh den weitergeleiteten Port verwendet. Dann wird die erste SSH geschlossen, wenn die zweite SSH den weitergeleiteten Port verlässt.

Sie können jetzt nachfolgende ssh-Sitzungen ausführen:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Variante:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Nachfolgende SSH-Sitzungen können geöffnet werden, indem Sie Folgendes ausführen:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Der Hauptvorteil der Verwendung von -M- und -S-Parametern besteht darin, dass nur eine Verbindung von HostA zu HostC geöffnet ist, die nachfolgende Sitzung sich nicht erneut authentifiziert und viel schneller ausgeführt wird.

F. Hauri
quelle
0

Sonderfall gemischte nix Plattformen:

  HostA (Linux) -> HostB (Solaris) -> HostC (Linux)

Benötigen Sie eine X-Anwendung auf HostC und der Zwischen-Hop ist auf Solaris-Box ... In diesem Fall fand ich das Netcat (nc), das auf dem ProxyCommand benötigt wird, folgendermaßen:

hostA: ~ $ vi .ssh / config:

Host hostC
    ProxyCommand ssh hostB nc% h% p # wobei nc netcat ist

Dann funktioniert das automatische Tunneln:

hostA: ~ $ ssh hostC

nsysdcw
quelle