Frage So konfigurieren Sie eine Verknüpfung für eine SSH-Verbindung über einen SSH-Tunnel


Meine Produktionsserver (FOO, BAR ...) befinden sich hinter zwei Gateway-Servern (A, B). Um eine Verbindung zum Server FOO herzustellen, muss ich eine SSH-Verbindung mit Server A oder B mit meinem Benutzernamen JOHNDOE öffnen, dann von A (oder B) aus kann ich auf jeden Produktionsserver zugreifen, der eine SSH-Verbindung mit einem Standard-Benutzernamen öffnet WEBBY).

Also muss ich jedes Mal etwas tun wie:

ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server

Wie Sie sich vorstellen können, ist dies ein Aufwand, wenn ich es brauche scp oder wenn ich schnell mehrere Verbindungen öffnen muss.

Ich habe einen ssh-Schlüssel konfiguriert, und ich verwende auch .ssh / config für einige Abkürzungen.

Ich habe mich gefragt, ob ich eine Art von ssh-Konfiguration erstellen kann, um zu tippen

ssh foo

und lass SSH alle Verbindungen für mich öffnen / weiterleiten. Ist es möglich?

Bearbeiten

Womble's Antwort ist genau das, was ich suchte, aber es scheint im Moment, ich kann netcat nicht verwenden, weil 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

22
2017-08-01 12:14


Ursprung




Antworten:


Als eine konkretere Version von Kyle's Antwort, was Sie in Ihre einfügen möchten ~/.ssh/config Datei ist:

host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

host a
  User johndoe

Wenn Sie dann "ssh foo" ausführen, versucht SSH, SSH zu johndoe@a, Lauf netcat (nc), dann führen Sie eine SSH zu webby@foo durch diesen Tunnel. Zauber!

Um dies zu tun, muss netcat natürlich auf dem Gateway-Server installiert sein; Dieses Paket ist für alle wichtigen Distributionen und Betriebssysteme verfügbar.


36
2017-08-01 13:23



Ausgezeichnet! Ich habe versucht, das herauszufinden, ich war noch nie in genau dieser Situation gelandet. Ich werde meine Antwort dort behalten, falls es jemand anderem mit einer weniger spezifischen Situation in der Zukunft helfen könnte. - Kyle Brandt♦
Ich habe meine ursprüngliche Frage einschließlich der ausführlichen Ausgabe meiner Verbindung aktualisiert. Es scheint, ich kann netcat nicht benutzen. Sollte es standardmäßig verfügbar sein? - Simone Carletti
Nicht immer, haben Sie die Macht, es zu installieren? Das könntest du vielleicht auch mit Telnet machen, das habe ich noch nie ausprobiert ... - Kyle Brandt♦
Sie können Netcat auch in Ihr Home-Verzeichnis herunterladen und dort kompilieren. Sie könnten dann einfach den vollständigen Pfad im Proxy-Befehl verwenden, also / home / userName / bin / nc - Kyle Brandt♦
Ich habe gerade die Systemeinstellungen überprüft. Unter Ubuntu scheint netcat standardmäßig verfügbar zu sein, leider werden die Gateway-Server von OpenSUSE betrieben. Ich werde darüber nachdenken, netcat auch auf den Gateway-Servern zu installieren. - Simone Carletti


Sie können die ProxyCommand-Direktive in Ihrer ~ / .ssh / config-Datei verwenden, um beispielsweise netcat als Relay zu verwenden:

host server2
    ProxyCommand ssh server1 nc server2 22

Sie würden einfach 'ssh server2' verwenden. Die Manpage Informationen für diese Direktive finden Sie in 'man ssh_config'


7
2017-08-01 12:50





Ich bevorzuge einen anderen Ansatz, der einen vorauthentifizierten Tunnel zum Gateway-Server führt. Im ~/.ssh/config:

Host a
    ControlMaster auto
    ControlPath ~/.ssh/control-master/%r@%h:%p

Dann in .bashrc:

s () {
        if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
        then
                ssh -t a ssh $1
        else
                if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
                then
                        echo "Deleting stale socket..."
                        rm ~/.ssh/control-master/insyte@a:22
                fi
                echo "Opening master session..."
                if ssh -Nf a
                then
                         ssh -t a ssh $1
                fi
        fi
 }

Also mit foo verbinden:

s foo

Wenn Sie das erste Mal eine Verbindung herstellen, authentifizieren Sie sich gegen "a" und öffnen einen persistenten, backgrounded SSH-Tunnel. Nachfolgende Aufrufe von "s" werden fast sofort durch den vorautonierten Tunnel geöffnet.

Funktioniert super.


5
2017-08-01 18:10





Diese Art von Funktionalität existiert in neueren Versionen von OpenSSH und kann dadurch verwendet werden

ssh -W server2 server1

Woher server2 ist dein beabsichtigtes Ziel und server1 ist Ihr Proxy-Host. Sie können dies vereinfachen, indem Sie die ProxyCommand Option in Ihrer SSH-Konfiguration, etwas wie:

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

2
2017-12-28 01:00



An dieser Stelle muss OpenSSH 5.4+ an allen drei Standorten installiert sein: Desktop, Intermediate, Destination. (Nun, der erste und der letzte, sicherlich). - Steve Bennett
@SteveBennett: Ich benutze diese Methode schon seit einiger Zeit, es funktioniert ziemlich gut. Ich musste auf einigen RHEL5-Systemen auf die Netcat-Methode zurückgreifen, was nervig war. - Scott Pack


Wann netcat ist nicht auf dem Proxy verfügbar, versuchen Sie diesen Trick:

host foo
  User webby      
  ProxyCommand ssh a 'exec 3<>/dev/tcp/foo/22; cat <&3 & cat >&3;kill $!'

host a
  User johndoe

Dann sollten Sie es können ssh foo.

Auch wenn Sie eine aktuelle Version von ssh auf a haben (d. H. Mit dem -W Befehl zum Weiterleiten der Standardeingabe und -ausgabe), können Sie möglicherweise Folgendes verwenden:

host foo
  User webby
  ProxyCommand ssh -W foo:%p a

host a
  User johndoe

Schließlich, nur weil ich es cool fand (und nicht, weil es in Ihrem speziellen Fall aufgrund von Benutzernamenunterschieden funktioniert), Blogpost eines Freundes weist darauf hin, wie man diese Art von Dingen dynamisch und rekursiv SSH-Proxys ketten kann (zusammen mit einigen Dingen, die nicht gut funktionieren):

host */*
  ProxyCommand ssh ${$(dirname %h)/\%%/@} nc ${$(basename %h)#*%%} %p

Und dann ssh machine1/machine2 sollte dir eine Shell geben machine2, durchtunnelt machine1.

Ich frage mich, ob es Brauch ist sedBefehle statt dirname und basename möglicherweise das Problem mit verschiedenen Benutzernamen nicht lösen?


2
2017-08-23 18:48





Dies kann durch Ausführen erreicht werden ssh -At johndoe@a ssh webby@foo. Das -A Befehl leitet Ihren ssh-Agenten weiter (so können Sie vermeiden, sich erneut auf dem Proxy authentifizieren zu müssen), während der -t stellt sicher, dass ein Terminal auf dem Proxy existiert. Die folgende Bash-Funktion kann nützlich sein:

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}

2
2017-08-01 15:58



Dies ist bei weitem die einfachste Lösung. Jetzt braucht es nur noch 35 upvotes. (Übrigens macht das -A nichts für mich.) - Steve Bennett


weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

Netcat ist nicht installiert a. Wenn du rennst ssh host "command arg", command wird ausgeführt am hostnicht auf Ihrem lokalen Rechner.


0
2017-08-01 21:52



Ja, ich weiß. Dies ist genau das, was ich in einem Kommentar zu Womble's Antwort berichtet habe. :) - Simone Carletti


Seit OpenSSH 7.3 (2016-08-01) hat die ProxyJump Option und entsprechend -J Befehlszeilen-Flags sind verfügbar, um eine einfachere Indirektion durch eine oder mehrere SSH-Bastionen oder "Sprung-Hosts" zu ermöglichen.

Das entfernt die Abhängigkeit vom Äußeren nc Befehl wie in gefunden Womble's Lösung.

ssh -J johndoe@a webby@foo 

stellt eine SSH-Verbindung von Ihrer Workstation zum Gateway-Server her a Als Benutzer johndoe und tunnel die SSH-Sitzung, um foo für Benutzer Webby darüber zu hosten.

Um das zu vereinfachen, erstellen Sie Hostdefinitionen für beide in Ihrem ~/.ssh/config und das kannst du einfach ausführen ssh foo

Host a
    User johndoe

Host foo
    User Webby 
    ProxyJump a

0
2018-04-12 12:47