SSH-Logins in Sekundenbruchteilen: ControlMaster, ControlPersist & ProxyJump
Mit ControlMaster, ControlPersist und ProxyJump kappst du den TCP- und Krypto-Handshake bei jedem ssh, scp und rsync — Logins werden zum Sekundenbruchteil, auch ueber Bastion-Hops.
Jeder ssh-, scp- oder rsync-Aufruf zahlt denselben Preis: TCP-Aufbau, Schluesseltausch, Auth (oft MFA/Agent). Bei vielen kurzen Verbindungen — Deploy-Skripte, Ansible-Loops, git ueber SSH — frisst das spuerbar Zeit. SSH-Multiplexing oeffnet die Verbindung einmal und schiebt alle weiteren Sessions ueber denselben Tunnel. Dazu zeigt dieses Tutorial, wie du Bastion-Hops per ProxyJump end-to-end-verschluesselt durchquerst. Fuer Admins und DevOps mit OpenSSH-Client (Multiplexing seit jeher, ProxyJump ab OpenSSH 7.3).
Multiplexing in der ~/.ssh/config aktivieren
- Lege ein Verzeichnis fuer die Control-Sockets an, das nur dir gehoert (sonst weigert sich SSH bzw. wird unsicher):
mkdir -p ~/.ssh/cm && chmod 700 ~/.ssh/cm - Trage in
~/.ssh/configeinen Block ein:
Host *
ControlMaster auto
ControlPath ~/.ssh/cm/%C
ControlPersist 10m
- ControlMaster auto — existiert keine Master-Verbindung, wird diese zur Master; existiert schon eine, wird sie wiederverwendet.
yeserzwingt immer Master (nie reuse),noist Default (nie Master). - ControlPath — Pfad zum Unix-Socket.
%Cist ein Hash aus Host, Port, User und lokalem Hostnamen, immer gleich lang — robuster als%r@%h:%pbei langen Hostnamen (Socket-Pfade sind auf ~104 Zeichen begrenzt). - ControlPersist 10m — der Master bleibt nach Schliessen der letzten Session noch 10 Minuten im Hintergrund offen.
yeshaelt ihn offen bis er explizit beendet wird; eine Zeit haelt mindestens so lange bzw. bis die letzte Session zu ist.
Verbinde dich einmal (ssh server), lasse das Fenster ruhig wieder zu — der naechste scp/rsync/ssh auf denselben Host nutzt den bestehenden Tunnel und ist sofort da.
Master-Verbindungen kontrollieren
Mit -O steuerst du den laufenden Master, ohne die Config zu aendern:
ssh -O check server— prueft, ob ein Master laeuft (gibt PID + Socket-Pfad zurueck).ssh -O stop server— sanftes Herunterfahren: keine neuen Sessions mehr, bestehende laufen aus, dann faellt der Master.ssh -O exit server— beendet den Master sofort und schliesst alle daran haengenden Sessions.
Vorsicht: ssh -O exit reisst laufende Sessions, Forwards und Transfers ueber diesen Master hart ab. Auf Produktiv-Hosts erst mit -O check nachsehen, was dranhaengt. Stuerzt eine Verbindung ab und der Socket bleibt als „stale" liegen, hilft ssh -O exit oder schlicht das Loeschen der Socket-Datei in ~/.ssh/cm/.
ProxyJump: durch die Bastion in einem Rutsch
Statt erst auf den Jump-Host zu hopsen und von dort weiter, tunnelt ProxyJump die Verbindung end-to-end: Der Bastion-Host leitet nur den verschluesselten Stream weiter und sieht weder deinen privaten Schluessel noch die entschluesselte Session.
- Ad hoc auf der Kommandozeile mit
-J:ssh -J user@bastion user@ziel-intern - Mehrere Hops kettest du komma-separiert:
ssh -J user@hop1,user@hop2 user@ziel - Sauber in der Config, sodass
scp/rsync/gites automatisch nutzen:
Host bastion
HostName bastion.example.net
User admin
Host ziel-intern
HostName 10.0.5.42
User deploy
ProxyJump bastion
Danach reicht ssh ziel-intern oder rsync -av ./build/ ziel-intern:/srv/app/ — der Hop passiert transparent.
ProxyJump und Multiplexing kombinieren
- Beide Mechanismen greifen unabhaengig: Multiplexing kann sowohl die Verbindung zur Bastion als auch die End-to-End-Verbindung zum Ziel wiederverwenden. Lass den
Host *-Block mitControlMastereinfach stehen — er gilt auch fuer ProxyJump-Ziele. - So zahlt nur die allererste Verbindung den vollen Handshake (inkl. MFA an der Bastion); jeder weitere Befehl auf das interne Ziel ist quasi instant.
- Fuer Ansible setze in der
ansible.cfgunter[ssh_connection]einssh_argsmit denselbenControlMaster=auto -o ControlPath=… -o ControlPersist=…-Optionen — so teilen sich alle Tasks eines Plays eine Verbindung.
Profi-Tipp: Reuse heisst auch: Aenderst du Optionen wie ForwardAgent, RemoteForward oder den User, wirken sie auf bestehende Sessions nicht — die erben die Parameter des Masters. Nach Config-Aenderungen den Master mit ssh -O exit host beenden und neu aufbauen. Auf instabilen Leitungen ergaenze pro Host ServerAliveInterval 30 und ServerAliveCountMax 3, damit ein toter Master nicht alle Sessions blockiert. Quellen: ssh_config(5), OpenSSH Cookbook: Multiplexing, Red Hat: ProxyJump.