Die Multihop-Situation:
+-------+ +----------+ +-----------+
| Laptop| <---> | Jumphost | <--> | FooServer |
+-------+ +----------+ +-----------+Ziel ist es, den FooServer vom Laptop per shh zu erreichen. Dabei gibt es viele Wege zum Ziel und verschiedene Befehle mit mehr oder weniger Aufwand und angenhmer Handhabung.
Manuell
Wir verbinden uns auf der Kommandozeile des Laptops erst mit dem Jumphost und dann über das Terminal des Jumphost mit dem FooServer:
ssh USER@JUMPHOST
ssh USER@FOOSERVERDas können wir vereinfachen.
Verkettung
Einfach hintereinander weg:
ssh -A -t -l USER JUMPHOST ssh -A -t -l USER FOOSERVER
-A übergibt den ssh-agent
-t erzeugt ein Pseudoterminal
-l ist das login
Quelle: https://blog.remibergsma.com/2013/05/28/creating-a-multi-hop-ssh-tunnel…
Es geht ebenso mit dem eingebauten Schalter -J:
ssh -J jumpuser1@jumphost1,jumpuser2@jumphost2,...,jumpuserN@jumphostN user@fooserverProxy Command
ssh -t -o ProxyCommand='ssh user@Jumphost nc FooServer 22' user@FooServer htopDas Kommando am Ende wird auf dem FooServer ausgeführt. Das -t am Anfang erzeugt ein Pseudoterminal auf FooServer.
Das Proxy-Command im Config-File hinterlegen
Die $HOME/.ssh/config Datei anlegen bzw. ändern und folgende Konfiguration hinterlegen:
Host FooSe
HostName FooServer
User RemoteUSERNAME
Port 22
ProxyCommand ssh USERNAME@Jumphost nc %h %p %r- Host FooSe : Bezeichner
- HostName FooServer : IP oder DNS-Name.
- User USERNAME : Der benutzername auf dem FooServer
- ProxyCommand ssh USERNAME@Jumphost nc %h %p : Dies ist das Kommando, um sich mit dem FooServer zu verbinden. %h : host name, %p port, %r remote user name. Weitere Optionen siehe man ssh_config.
Im folgenden kann dann die Verbindung kurz und bündig per Bezeichner hergesellt werden:
ssh FooSeScp kann dann folgendermassen ausgeführt werden, so dass vom Fooserver Dateien direkt kopiert werden können:
scp FooSe:filename /home/user... oder rsync mit Progressbar
rsync -avz -P FooSe:directory /home/userTunnel forwarding
Einen Dienst kann man nun auch auf den lokalen Rechner weiterleiten. Dazu dient der übliche Aufruf für ein loaklen Forward. Auf diese weise kann man einen auf dem Remote-Rechner lokal gebundenen Mysql-Server durch leiten:
ssh FooSe -L 3306:localhost:3306Auf dem lokalen Rechner sient man nun den Servive mittels netstat -tlpen auf 127.0.0.1 mit Port 3306 laufen und kan ihn entsprechend ansprechen.
sshfs mount mit server hop
Um per sshfs zu mounten braucht man zwei Befehle:
- die Port-Weiterleitung bzw. Verlinkung
- den sshfs-mount
ssh -f FooSe -L 2222:localhost:22 -N
sshfs -p 2222 REMOTEUSER@localhost: sshfsmnt/
Publickey verschlüsselt Kommando ausführen
Wir können das Multihop auch mit publickeys verschlüsselt ausführen und ein Kommando auf dem Zielrechner ausführen. Dazu erstellen wir für die Beteiligten Rechner auf unserem lokalen Rechner mit ssh-keygen jeweils einen Key. Dann verteilen wir jeweils einen Schlüssel auf den Jump- und Zielrechner, entweder perr ssh_id_copy oder eine andere Kopieraktion, und hinterlegen in ~/.ssh authorized_keys die öffentlichen Schlüssel. Die geheimen Schlüssel bleiben auf dem lokalen Rechner.
#!$(which bash)
#############################################
## VARS
# ssh connection
SSH_PORT_1="2222"
SSH_USER_1="anna"
SSH_HOST_1="jump.test"
SSH_PORT_2="22"
SSH_USER_2="britta"
SSH_HOST_2="target.remote"
# ssh secret-key name
SSH_ID_RSA_1="~/.ssh/id_rsa_jump"
SSH_ID_RSA_2="~/.ssh/id_rsa_target"
# ssh auszuführendes Kommando
SSH_CMD_2="whoami; pwd"
# askpass password Abfrage
export DISPLAY=":0"
export SSH_ASKPASS_REQUIRE="prefer"
export SSH_ASKPASS="/usr/bin/ksshaskpass"
## PROG
# ssh connect
ssh -tt -o ProxyCommand="ssh -i ${SSH_ID_RSA_1} ${SSH_USER_1}@${SSH_HOST_1} -p ${SSH_PORT_1} \
nc ${SSH_HOST_2} ${SSH_PORT_2}" -i ${SSH_ID_RSA_2} ${SSH_USER_2}@${SSH_HOST_2} ${SSH_CMD_2}
exit;
Im Proxy-Command muss jeweils der Schlüssel für die beteiligten Rechner und User explizit angegeben werden. -tt erzwingt ein Terminal auf der Gegenseite und ermöglicht farbigen Output über die Verbindung.