Die Produktionsserver meiner Firma (FOO, BAR ...) befinden sich hinter zwei Gateway-Servern (A, B). Um eine Verbindung zum Server FOO herzustellen, muss ich mit meinem Benutzernamen JOHNDOE eine SSH-Verbindung zu Server A oder B herstellen. Von A (oder B) aus kann ich dann auf jeden Produktionsserver zugreifen, der eine SSH-Verbindung mit einem Standardbenutzernamen herstellt (nennen wir ihn) WEBBY).
Also muss ich jedes Mal etwas machen wie:
ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server
Wie Sie sich vorstellen können, ist dies ein Ärger, wenn ich scp
mehrere Verbindungen schnell öffnen muss.
Ich habe einen SSH-Schlüssel konfiguriert und verwende auch .ssh / config für einige Verknüpfungen.
Ich habe mich gefragt, ob ich eine Art SSH-Konfiguration erstellen kann, um zu tippen
ssh foo
und lassen Sie SSH alle Verbindungen für mich öffnen / weiterleiten. Ist es möglich?
Bearbeiten
Die Antwort von womble ist genau das, wonach ich gesucht habe, aber im Moment kann ich netcat nicht verwenden, da es nicht auf dem Gateway-Server installiert ist.
weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host
quelle
Sie können die ProxyCommand-Direktive in Ihrer ~ / .ssh / config-Datei verwenden, um beispielsweise netcat als Relay zu verwenden:
Das würdest du einfach mit 'ssh server2' machen. Die Manpage-Informationen für diese Direktive finden Sie in 'man ssh_config'.
quelle
Ich bevorzuge einen anderen Ansatz, der einen vorauthentifizierten Tunnel zum Gateway-Server aufrechterhält. In
~/.ssh/config
:Dann in
.bashrc
:So verbinden Sie sich mit foo:
Wenn Sie das erste Mal eine Verbindung herstellen, werden Sie mit "a" authentifiziert und ein dauerhafter SSH-Tunnel mit Hintergrund wird geöffnet. Nachfolgende Aufrufe von "s" werden fast augenblicklich durch den vorauthentifizierten Tunnel geöffnet.
Funktioniert super.
quelle
Diese Art von Funktionalität ist in neueren Versionen von OpenSSH vorhanden und kann auf diese Weise verwendet werden
Wo
server2
ist Ihr beabsichtigtes Ziel undserver1
ist Ihr Proxy-Host. Sie können dies vereinfachen, indem Sie dieProxyCommand
Option in Ihrer ssh-Konfiguration verwenden, etwa:quelle
Wenn
netcat
der Proxy nicht verfügbar ist, probieren Sie diesen Trick:Dann sollten Sie in der Lage sein
ssh foo
.Wenn Sie eine aktuelle Version von ssh auf a haben (dh mit dem
-W
Befehl zum Weiterleiten der Standardeingabe und -ausgabe), können Sie möglicherweise Folgendes verwenden:Schließlich, nur weil ich es cool fand (und nicht, weil es in Ihrem speziellen Fall aufgrund von Benutzernamenunterschieden funktioniert), zeigt der Blog-Beitrag eines Freundes , wie man solche Dinge dynamisch macht und rekursiv SSH-Proxys verkettet (zusammen mit einigen Dingen) das funktioniert nicht gut):
Und dann
ssh machine1/machine2
solltest du dir eine Granatemachine2
zulegen, die durchtunnelt istmachine1
.Ich frage mich, ob Sie benutzerdefinierte
sed
Befehle anstelle von verwendendirname
undbasename
das Problem möglicherweise nicht mit anderen Benutzernamen lösen.quelle
Dies kann dadurch erreicht werden
ssh -At johndoe@a ssh webby@foo
. Der-A
Befehl leitet Ihren ssh-Agenten weiter (sodass Sie keine erneute Authentifizierung am Proxy vornehmen müssen), während-t
sichergestellt wird, dass auf dem Proxy ein Terminal vorhanden ist. Die folgende Bash-Funktion kann nützlich sein:quelle
Netcat ist nicht installiert
a
. Wenn Sie ausführenssh host "command arg"
,command
wird auf ausgeführthost
, nicht auf Ihrem lokalen Computer.quelle
Seit OpenSSH 7.3 (2016-08-01) sind die
ProxyJump
Option und das entsprechende-J
Befehlszeilenflag verfügbar, um eine einfachere Indirektion durch eine oder mehrere SSH-Bastionen oder "Sprunghosts" zu ermöglichen.Dadurch wird die Abhängigkeit vom externen
nc
Befehl, wie sie in der Womble-Lösung zu finden ist, aufgehoben .a
baut als Benutzer johndoe eine SSH-Verbindung von Ihrer Workstation zum Gateway-Server auf und tunnelt die SSH-Sitzung, um foo für den Benutzer Webby darüber zu hosten.Um dies zu vereinfachen, erstellen Sie Hostdefinitionen für Ihre
~/.ssh/config
und die, die Sie einfach ausführen könnenssh foo
quelle