Tipp: SSH-Multiplexing

von Hubert Schmid vom 2013-02-24

Viele Software-Entwickler setzen den SSH-Client ein, um auf entfernte Test- oder Produktionssysteme zuzugreifen – verwenden dabei allerdings nur einen minimalen Teil der angebotenen Funktionalität. Dabei befinden sich unter den zahlreichen Konfigurationseinstellungen auch viele, die für die tägliche Arbeit nützlich sind. Besonders interessant finde ich das kaum bekannte Multiplexing, auf das ich im Folgenden eingehe.

Der Verbindungsaufbau von SSH ist gefühlt ziemlich langsam. Mit einer Paketumlaufzeit von ungefähr 63 Millisekunden benötigt der folgende Befehl bei mir über 0,95 Sekunden. Das ist zu viel – insbesondere wenn wiederholt Aufrufe über SSH abgesetzt werden sollen.

$ ssh test@example.org date

Multiplexing ist eine Lösung für dieses Problem. Es bedeutet im Wesentlichen, dass der SSH-Client eine bereits bestehende SSH-Sitzung verwenden kann, wodurch der teure Handshake für die zweite Verbindung entfällt. Dieses Verhalten lässt sich über die beiden Optionen ControlMaster und ControlPath steuern.

Der erste Befehl erzeugt eine SSH-Sitzung, deren Verbindung von anderen SSH-Sitzungen mit dem gleichen Ziel mitbenutzt werden kann. Der zweite Befehl nutzt die bestehende Verbindung nach Möglichkeit. Besteht die erste Verbindung noch, so benötigt der zweite Befehl in meinem Fall statt den ursprünglichen 0,95 Sekunden nur noch 0,14 Sekunden – ein sehr gutes Ergebnis bei einer Latenz von 63 Millisekunden.

$ ssh -o ControlMaster=yes -o ControlPath=/tmp/control test@example.org$ ssh -o ControlPath=/tmp/control test@example.org date

Für den typischen SSH-Einsatz reicht dieses Vorgehen noch nicht aus, da es nur greift, solange eine Master-Verbindung existiert. Zwei weitere Maßnahmen schließen diese Lücke:

Die Optionen packt man am Einfachsten an den Anfang der Konfigurationsdatei ~/.ssh/config. Damit wirken sie sich automatisch auf alle neuen SSH-Verbindungen aus, und man wird überrascht sein, wie schnell sich der Verbindungsaufbau von SSH plötzlich anfühlt.

Host * ControlMaster auto ControlPath ~/.ssh/control-%r@%h:%p ControlPersist 300