SSH über mehrere Hosts mit ProxyCommand?


11

Ich habe einen Eintrag in ~ / .ssh / config auf meinem Computer zu Hause, der folgendermaßen aussieht:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

Wo gateway.example.comarbeitet ein Server, der sowohl mit dem öffentlichen Internet als auch mit einem internen Netzwerk verbunden ist? Das Gateway-Feld löst foo und bar mithilfe von Einträgen in / etc / hosts auf.

Mein Problem ist, dass ich eine Box erreichen muss, die sich auf der anderen Seite befindet foo. Nennen wir es "baz". Der "baz" -Host befindet sich in einem anderen privaten Netzwerk, mit dem foo verbunden ist, aber nicht mit dem, mit dem "gateway" verbunden ist.

Ich habe versucht, dies zu verwenden:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22

Aber das funktioniert nicht und ich bin ein bisschen überfordert. Wie mache ich das?

Ich denke nicht, dass es wichtig sein sollte, aber ich mache das in Ubuntu 10.

Antworten:


13

Einfach.

Nehmen Sie das folgende Netzwerk-Setup an:

Beispiel für ein Netzwerk-Setup

Sie sollten in der Lage sein, eine ~ / .ssh / config-Datei zu verwenden, die ungefähr so ​​aussieht:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22

Die Idee hier ist, dass Ihr SSH weiß , wie man zu "foo" kommt, so dass ein SSH dort erfolgreich sein wird. Und von dort aus können Sie "nc" zu baz. Und wenn sich neben "baz" noch andere Hosts im internen privaten Netzwerk befinden, können Sie diese einfach zur Zeile "host baz" hinzufügen.

Dies behandelt den Host "foo" grundsätzlich als das Gateway zu "baz", genauso wie "gateway" das Gateway zu "foo" ist.

Klar?


13

In Bezug auf Ghotis Antwort: Anstatt netcat ( "ssh ... nc %h 22") zu verwenden, können Sie dies ab OpenSSH 5.4 direkt tun mit : "ssh -W %h:22 ...". Auf diese Weise müssen Sie sich keine Gedanken darüber machen, ob netcat am richtigen Ort installiert ist.


1
Toller Punkt, danke. Dies ist eine alte Frage, aber ich könnte genauso gut klarstellen, dass während ich Ubuntu auf meiner Workstation ausführte, der Server "Gateway" ein altes Busybox Linux mit OpenSSH 5.3 war und die Server "foo" und "baz" FreeBSD (OpenSSH) waren 5.4). Ich hätte also sowieso mindestens einen Netcat gebraucht.
Graham

@ Abraham Nein. Es ist nur der Client, der 5.4 oder höher sein muss, um -Warbeiten zu können. Es basiert auf dem Portweiterleitungscode auf der Serverseite, der viel älter ist.
Kasperd

1

Geben Sie diesen Befehl mit privaten Schlüsseln ein, die auf Ihrem lokalen Computer gespeichert sind, und geben Sie die privaten Schlüsselpfade, Shell-Benutzernamen und Hostnamen / IP-Adressen ein, die in die Anforderungen Ihres lokalen-> Gateways-> Ziel-SSH geändert wurden.

Beachten Sie, dass ProxyCommand der Agentenweiterleitung vorgezogen wird, um das Risiko einer Beeinträchtigung der Authentifizierung mit privatem Schlüssel zu verringern (Verwendung des Gateways und der lokalen SSH-Agentenverbindung, um weitere Hosts zu gefährden, als ob der Hijacker den privaten Schlüssel hätte), wenn ein Gateway / eine Jumperbox als Root entführt wird.

Einzelbefehl zum Proxy von SSH an einen Server (beide privaten Schlüssel auf dem lokalen Computer behalten):

sudo ssh -i dest_private_key.pem -o "ProxyCommand ssh -W %h:%p -i gate_private_key.pem gate_user@gate_IP" dest_user@dest_IP 

0

Dies ist, was ich tue, um aus einem geschützten Netzwerk ins Internet zu springen.

Ich benutze meinen Laptop, um beim Erstellen mit Code zu arbeiten . Da der Build auf den Internetzugang beschränkt ist, muss ich zuerst in die Toolbox springen , die auch keinen Internetzugang hat , um ein Repo von github.com zu klonen . Aber es kann auf GW zugreifen , das über Internet verfügt.

So was:

SSH-Sprungschema

Mein .ssh/configOn Build :

Host gw
  ProxyCommand ssh -A -W %h:%p toolbox

Host github.com
  ProxyCommand ssh -A -W %h:%p gw

Erläuterung.

  1. Die Sichtweise ist von Build . Auf anderen Servern gibt es keine Konfigurationen.
  2. Zunächst erkläre ich, dass Sie dies über die Toolbox tun müssen, um zu GW zu gelangen .
  3. Zweitens erkläre ich, dass Sie dies über gw tun müssen, um zu github.com zu gelangen . Intern verwendet SSH die vorherige Regel.
  4. Letztendlich git clone git@github.com:aRepo/Therefunktioniert es einfach!

Klar?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.