Wie kann ich A über B in einem Befehl mit SSH bearbeiten?

103

Ich möchte auf einen Computer zugreifen, z. B. auf Computer A, der sich im Netzwerk meiner Universität befindet. Auf diesen Computer kann jedoch nur über das interne Netzwerk der Universität zugegriffen werden. Daher kann ich SSH nicht für diesen Computer von zu Hause aus direkt verwenden.

Folgendes mache ich jetzt:

  1. Melden Sie sich bei einem anderen Universitätscomputer an, z. B. Computer B

    (Auf diesen Computer B kann über SSH von meinem Heimcomputer aus zugegriffen werden.)

  2. Verwenden Sie SSH auf B, um eine Verbindung zu A herzustellen.

Gibt es eine Möglichkeit, das schneller zu machen? Verwenden Sie nur einen ssh-Befehl.

Nikosdi
quelle
Verwandt: SSH über mehrere Hosts
Trevor Boyd Smith

Antworten:

97

Ja, ProxyCommandin deiner SSH-Konfiguration verwenden.

Erstellen Sie eine SSH-Konfigurationsdatei in Ihrem Ausgangsverzeichnis (es sei denn, Sie möchten dies systemweit vornehmen) ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

Jetzt können Sie Maschine A direkt über erreichen

ssh user@internalmachine

Beachten Sie auch, dass Sie jetzt einen einzigen SSH-Host-Zielnamen dafür haben und diesen auch in anderen Anwendungen verwenden können. Z.B:

  • SCP zum Kopieren von Dateien.

    scp somefile user@internalmachine:~/
    
  • In Ihren GUI-Anwendungen:

    Verwendung sftp://user@internalmachine/als Standort auf der Maschine zu suchen.

    KDE-basiert (Dolphin): verwenden fish://user@internalmachine/

Anmerkungen

Ändern Sie hostname.or.IP.address.internal.machineund den Port ( 22) zu der Maschine, die Sie erreichen möchten, als würden Sie von der unibrokerMaschine.

Abhängig von den Netcat-Versionen auf dem Unibroker-Host muss die -q0Option weggelassen werden. In Bezug auf die Authentifizierung; Sie richten im Grunde genommen zwei SSH-Verbindungen von Ihrer Workstation aus ein. Dies bedeutet, dass sowohl der Unibroker-Host als auch der Host der internen Maschine nacheinander überprüft / authentifiziert werden (sowohl für die Schlüsselpaar- / Kennwort- als auch die Hostschlüsselüberprüfung).

Erläuterung

Dieser Ansatz der Verwendung von ProxyCommandund 'Netcat' ist nur eine Möglichkeit, dies zu tun. Dies gefällt mir, weil mein SSH-Client direkt mit dem Zielcomputer kommuniziert, sodass ich den Hostschlüssel von meinem Client aus überprüfen und meine Authentifizierung mit öffentlichem Schlüssel verwenden kann, ohne einen anderen Schlüssel für den Broker zu verwenden.

Jedes Hostdefiniert den Beginn eines neuen Host-Abschnitts. Hostnameist der Ziel-Hostname oder die IP-Adresse dieses Hosts. Userist das, was Sie als Benutzer angeben würden ssh user@hostname.

ProxyCommandwird als Pipe zum Zielrechner verwendet. Durch die Verwendung von SSH auf dem ersten Computer und die direkte Einrichtung eines einfachen 'netcat' ( nc) für das Ziel von dort ist dies im Grunde genommen nur ein Klartext, der vom Broker an den internen Computer weitergeleitet wird. Sie haben die -qMöglichkeit, alle Ausgaben stummzuschalten (nur eine persönliche Präferenz).

StellenInstallieren Sie netcat-openbsd Sie sicher, dass Sie netcat auf dem Broker installiert haben (normalerweise standardmäßig unter Ubuntu verfügbar) - entweder netcat-openbsd oder netcat-traditionalInstallieren Sie netcat-traditional .

Beachten Sie, dass Sie hier immer noch zweimal SSH mit Verschlüsselung verwenden. Während der Netcat-Kanal Klartext ist, richtet Ihr SSH-Client auf Ihrem PC einen weiteren verschlüsselten Kanal mit dem endgültigen Zielcomputer ein.

gertvdijk
quelle
4
Ich musste die Option -q0 entfernen, da sie von dem verwendeten Computer nicht unterstützt wurde. Ansonsten hat alles geklappt. Dies ist ein fantastischer Tipp. Ich danke dir sehr. :)
Gerry
Ich bin auf ein Problem gestoßen, Ihre Antwort funktioniert vom Terminal aus einwandfrei, aber ich kann sie nicht über das GUI-SFTP ausführen. Es heißt: Unbehandelte Fehlermeldung, Zeitüberschreitung beim Anmelden.
Vikash B
@ VikashB Nun, es sollte wirklich funktionieren. Erwägen Sie, eine NEUE Frage zu erstellen, um mit Ihrer spezifischen Situation fertig zu werden.
gertvdijk
Ich habe hier die Frage: askubuntu.com/questions/688567/…
Vikash B
1
Als Ergänzung zu @gertvdijk gibt es ein großartiges Wikibook zum Thema SSH- Proxies und Jump-Hosts , das als Referenz von unschätzbarem Wert dienen kann.
Travis Clarke
51

Hop in one go

Eine naheliegende Alternative zum ProxyCommand-Ansatz, den ich in meiner anderen Antwort angegeben habe , ist das direkte "Springen " zum Zielcomputer:

ssh -t user@machineB ssh user@machineA

Beachten Sie den -tbeim ersten sshBefehl. Ohne es wird es scheitern:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

Dadurch wird die Zuweisung eines echten TTY erzwungen

Der Nachteil ist, dass jetzt die gesamte Konfiguration, Überprüfung und Authentifizierung auf Maschine B stattfindet, was mir aus Sicherheitsgründen in meiner Situation nicht gefällt. Ich mag mein Schlüsselpaar auf meinem eigenen PC und authentifiziere und verifiziere den endgültigen Zielcomputer von meinem eigenen PC aus. Außerdem können Sie die interaktive Shell nur für SSH verwenden, sodass andere Tools wie SCP oder die Verwendung Ihres GUI-Dateimanagers hiervon nicht betroffen sind.

Aus all den oben genannten Gründen empfehle ich dringend den ProxyCommand-Ansatz , aber für eine schnelle Verbindung funktioniert dies einwandfrei .

gertvdijk
quelle
Warum haben Sie nicht eine Antwort sowohl mit der "One Off" -Lösung als auch mit der permanenten Lösung?
demure
5
@demure So funktionieren StackExchange-Sites ... Siehe: Wie lautet die offizielle Etikette für die zweimalige Beantwortung einer Frage? sagt: "Es ist besser, zwei verschiedene Antworten zu posten, als sie in eine Antwort zu setzen." . Und ich halte das nicht für die gleiche Lösung. Permanent / vorübergehend ist meiner Meinung nach nicht das, was diesen Ansatz anders macht.
Gertvdijk
Andere Anleitungen geben an, zusätzlich den Schalter -A zu verwenden, weisen jedoch darauf hin, dass dies Auswirkungen auf die Sicherheit hat. Wissen Sie, was es bedeutet, die Authentifizierungsagentenverbindung weiterzuleiten oder nicht?
Diagon
@gertvdijk Super Ninja hier! Sie haben die besten ZWEI Lösungen. das habe ich noch nie gesehen. Super cool. viel besser als eine megalange Lösung mit N Lösungen zu erstellen (was ich normalerweise sehe).
Trevor Boyd Smith
Dies ist viel praktischer als das Einrichten einer Konfiguration, die auch andere SSHs behindert.
Nikhil Sahu
37

Sie können die -JBefehlszeilenoption verwenden:

ssh -J user@machineB user@machineA

Von man ssh:

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

Es wurde in OpenSSH Version 7.3 (veröffentlicht im August 2016) eingeführt. Es ist in Ubuntu 16.10 und höher verfügbar.

Erik Sjölund
quelle
3
+1, da dies auch dann funktioniert, wenn Sie die Schlüsseldatei für machineA
Grief
1
+1, dies ist die bessere Version im Vergleich zu meiner ProxyCommand-Antwort, wenn auf allen Hosts eine OpenSSH-Version ausgeführt wird, die aktuell genug ist.
Gertvdijk
In diesem Fall sollte der OpenSSH-Server sowohl auf A- als auch auf B-Rechnern installiert sein. Habe ich recht verstanden?
Mikhail
17

Versuchen Sie es mit

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

in Ihrer ~ / .ssh / config und erledigen Sie alles auf einmal mit Schlüsseln, die sich nur auf Ihrem Computer befinden.

SSH-Hilfe
quelle
1
Dies ist sauberer als die Einführung von Netcat in den Mix. Außerdem muss der private SSH-Schlüssel auch nicht auf dem BComputer vorhanden sein.
Danemacmillan
1

Dies ist ein sehr hilfreicher Vorschlag. Nachdem ich stundenlang herumgespielt hatte, fand ich diese Notiz und bestätigte, dass dies genauso funktioniert wie dokumentiert. So stellen Sie von der entfernten Maschine aus eine Verbindung zwischen Maschine A und Maschine B her:

zB: [xuser @ machineC ~] ssh -t MachineA ssh MachineB

Das "-t" ist kritisch, ssh schlägt fehl, wenn es nicht vorhanden ist. Sie werden zweimal aufgefordert, zuerst das Kennwort für MachineA und dann das zweite Mal für MachineB einzugeben. Beachten Sie außerdem, dass Sie auf allen drei Computern den Benutzer "xuser" definiert haben. Wenn nicht, verwenden Sie einfach die ssh-Syntax: "yuser @ MachineA ...". Beachten Sie auch, dass Sie bei Bedarf gepunktete Quad-Raw-IP-Adressen verwenden können. Dies ist nützlich, wenn Sie eine Verbindung über ein privates lokales Netz herstellen, das IPs verwendet, die nicht der Welt ausgesetzt sind - d. H. nicht in Ihrer lokalen Host-Datei oder einem DNS. Um eine Datei von MachineB zu Remote-MachineC zu übertragen, können Sie von MachineB zu MachineA und dann von MachineA zu Remote-MachineC scp. (ZB kann die entfernte MaschineC MaschineA anpingen, aber nicht MaschineB.) Vorsichtsmaßnahme: Ich habe Fedora und WindowsXP getestet. MaschineA ist eine XP-Box, auf der ICS (Internet Connection Sharing) ausgeführt wird. während MachineB und Remote MachineC Fedora-Linux-Boxen sind. Dieser Vorschlag löste ein Schlüsselproblem für mich - dh. eingeschränkter, überwachter Remote-Zugriff auf mein Remote-Site-LAN Beachten Sie auch, dass beim "Abmelden" von ComputerB zwei "Verbindung zu xxx.xxx.xxx.xxx geschlossen" angezeigt werden sollten. Mitteilungen.

Mcl
quelle
Wenn Sie die Authentifizierung mit öffentlichem Schlüssel einrichten und konfigurieren, müssen Sie sich nicht um die Eingabe Ihrer Kennwörter kümmern. Wird -taber noch benötigt.
Felipe Alvarez
@FelipeAlvarez Sie müssen sich immer noch um die Eingabe des zweiten Passworts kümmern, wenn Sie Maschine B nicht vertrauen, um sich passwortlos bei A anzumelden!
Michael
1

ProxyCommand ist eine saubere Lösung für den Fall, dass Sie den Shell-Zugriff auf beiden Systemen zulassen. Wir wollten Remotebenutzern über einen Broker (B) Zugriff auf einen internen Computer (A) gewähren, ohne dem Benutzer aus Sicherheitsgründen einen Shell-Zugriff auf B zu gewähren. Das hat funktioniert:

Ersetzen Sie die Anmeldeshell

Ersetzen Sie die Login-Shell (verwenden chsh) für extuserden Broker durch das folgende Skript (in einer Datei gespeichert):

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A

Sofern in extuser @ B für den Remote-Benutzer und in internaluser @ A für extuser @ B kein Kennwort-Login eingerichtet wurde, wird der Remote-Benutzer durch Ausführen des folgenden Befehls direkt zu A weitergeleitet

ssh extuser@B

Tipp : Erstellen Sie das erforderliche Setup für die Anmeldung ohne Kennwort authorized_keys in extuser @ B, bevor Sie zur benutzerdefinierten Anmeldeshell wechseln. Nach der Änderung kann nur ein sudoer @ B Änderungen an der Datei authorized_keys vornehmen, indem er sie direkt bearbeitet, da auf dieses Konto über eine Shell für niemanden zugegriffen werden kann.

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

In der letzten Zeile wird die Anzeige des Anmeldebanners von B unterdrückt, sodass der Remote-Benutzer einen transparenten Zugriff auf A hat.

Sunthar
quelle
Sehr interessanter Ansatz. Die Hauptnachteile davon sind jedoch: 1) Die Verwendung ist auf die Standard-SSH-Nutzung beschränkt (keine SFTP / SCP-Unterstützung). 2) Ein Benutzer kann keine andere Zielhost andere als die einzelnen auswählen (weil in Login - Shell einprogrammiert) 3) Host - Schlüsselvalidierung kann nicht von Arbeitsstation zu der endgültigen Ziel - Host (da die Verwendung des Broker SSH binär gemacht werden) . 4) Private Schlüssel, mit denen Benutzer auf den endgültigen Zielhost zugreifen können, befinden sich nicht beim Benutzer, sondern beim Broker. Dies ermöglicht den Identitätswechsel des Benutzers durch einen Administrator (was normalerweise nicht möglich ist).
Gertvdijk
Alle Punkte stimmen, danke für die Ausarbeitung. Der primäre Zweck besteht jedoch darin, einem vertrauenswürdigen Benutzer ssh-Zugriff auf A zu gewähren, ohne sich bei B anzumelden. Da nur der Administrator den öffentlichen Schlüssel des vertrauenswürdigen Benutzers auf B hinzufügen kann (über sudo, ohne Anmeldung), bedeutet dies bereits, dass der Benutzer ( admin) Zugriff auf den privaten Schlüssel von extuser @ B (nicht von dem vertrauenswürdigen Benutzer außerhalb) und hat ihn an erster Stelle eingerichtet!
Sunthar
1

Du meinst du brauchst mehrere Jumper :)

Vor kurzem habe ich dieses Problem mit Jumper1 Jumper2 und meiner letzten Maschine, wie für mein Sol getroffen

lokales Skript:

#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh

Dann habe ich auf dem 1. Jumper (das ist mein Router) ein Skript namens Y00.sh platziert:

ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final

Sie können diese mit Ihrer IP und Ihren Passwörtern ersetzen, viel Glück!

Z-Y00
quelle