Multiplexage SSH avec ControlMaster et ControlPersist

Ajoutez ControlMaster auto, ControlPath ~/.ssh/cm/%C et ControlPersist 10m à un bloc Host de ~/.ssh/config, et créez le dossier avec mkdir -m 700 ~/.ssh/cm. Le premier ssh ouvre la connexion, les suivants la réutilisent sans se reconnecter. ssh -O check server indique si elle tourne et ssh -O exit server la ferme.

Mis à jour le . Client OpenSSH 10.0 vers OpenSSH 10.0 sur Debian 13 dans des conteneurs jetables.

La configuration

mkdir -m 700 ~/.ssh/cm
Host server
  HostName example.com
  User user
  ControlMaster auto
  ControlPath ~/.ssh/cm/%C
  ControlPersist 10m
  • ControlMaster auto utilise une connexion existante s'il y en a une, et sinon en ouvre une nouvelle que les autres peuvent partager.
  • ControlPath est le fichier socket que les sessions utilisent pour trouver la connexion. %C est un hachage de l'hôte local, de l'hôte distant, du port, de l'utilisateur et de l'hôte de rebond, ce qui évite de mélanger des connexions différentes.
  • ControlPersist 10m garde la connexion ouverte 10 minutes après la fin de la dernière session. Avec no, la valeur par défaut, la connexion vit dans le premier ssh lancé, qui reste ouvert jusqu'à la fin de toutes les sessions qui l'utilisent. Avec yes, elle reste ouverte jusqu'à ce que vous la fermiez.

Dans notre test, entre deux conteneurs sur une même machine, le premier ssh server true a pris 74 ms et le second 3 ms. Le second saute l'échange de clés et l'authentification : vous n'avez donc pas non plus de nouvelle demande de mot de passe ou de phrase secrète. Sur un vrai réseau, la première connexion est plus lente et l'écart est donc plus grand.

Le même bloc peut contenir les autres réglages de l'hôte. Pour aller plus loin, voyez des exemples de fichier de configuration SSH.

Contrôler la connexion

CommandeCe qu'elle fait
ssh -O check serverAffiche Master running (pid=1534), code de sortie 0
ssh -O conninfo serverAffiche les adresses et les algorithmes de la connexion
ssh -O forward -L 8080:localhost:80 serverAjoute une redirection de port à la connexion ouverte
ssh -O cancel -L 8080:localhost:80 serverRetire cette redirection
ssh -O stop serverN'accepte plus de nouvelles sessions, les sessions en cours continuent
ssh -O exit serverFerme la connexion et toutes les sessions qu'elle porte
ssh -S none serverOuvre une connexion séparée et ignore celle qui est partagée

Quand rien ne tourne, -O check se termine avec le code 255 :

Control socket connect(/home/user/.ssh/cm/936446a2...): No such file or directory

Limites et pièges

Toutes les sessions partagent le même sort

Si la connexion meurt, toutes les sessions qu'elle porte meurent. Dans notre test, ssh -O exit a terminé une session en cours avec le code 255. La séquence d'échappement ~. termine aussi toutes les sessions de la connexion, comme ssh l'indique lui-même dans sa liste ~?.

Le serveur limite les sessions par connexion

MaxSessions dans sshd_config vaut 10 par défaut. Nous avons ouvert 12 sessions à la fois, et les 2 dernières ont échoué avec :

mux_client_request_session: session request failed: Session open refused by peer

Ces commandes ont échoué net. Elles n'ont pas basculé sur une nouvelle connexion : les scripts qui lancent beaucoup de commandes en parallèle ont donc besoin d'une limite plus haute ou de -S none.

Le chemin du socket peut être trop long

Les chemins de sockets Unix ont une limite de longueur courte. Un chemin trop long empêche la connexion :

unix_listener: path "/very/long/path/..." too long for Unix domain socket

Un dossier court avec %C évite le problème. Le hachage a une longueur fixe, contrairement à %r@%h:%p.

Le socket donne accès sans connexion

Quiconque peut utiliser le fichier socket peut ouvrir des sessions sur votre connexion sans mot de passe. Gardez-le dans un dossier où vous seul pouvez écrire, c'est pourquoi ~/.ssh/cm est en mode 700. Le manuel en avertit aussi.

Les tunnels de longue durée doivent avoir leur propre connexion

Une redirection lancée via une connexion partagée appartient au maître. Dans notre test, avec le multiplexage actif, un second ssh -f -N -o ExitOnForwardFailure=yes -R 2222:localhost:22 server sur un port déjà utilisé a renvoyé le code 0. Sans multiplexage, la même commande a affiché une erreur et renvoyé 255. Pour un tunnel dont des scripts dépendent, ajoutez -S none.

Un maître tué laisse un socket périmé

Après un kill -9 sur le maître, le fichier socket reste et -O check signale Connection refused. Le ssh server normal suivant a fonctionné dans notre test, et il a remplacé le socket. Si cela se bloque un jour, supprimez le fichier dans ~/.ssh/cm.

Questions

Le multiplexage SSH est-il sûr ?

Oui, si le socket est dans un dossier où vous seul pouvez écrire, comme ~/.ssh/cm en mode 700. Toute personne qui peut utiliser le socket peut ouvrir des sessions sur votre connexion sans s'authentifier.

ControlMaster fonctionne-t-il avec le client OpenSSH de Windows ?

Le client OpenSSH fourni avec Windows ne prend pas en charge ControlMaster, car il repose sur des sockets de domaine Unix. Il fonctionne dans WSL.

Comment fermer une connexion SSH partagée ?

Lancez ssh -O exit avec le nom de l'hôte. Cela ferme la connexion et toutes ses sessions. ssh -O stop refuse les nouvelles sessions et laisse finir celles en cours.

Sources

Autres guides : Configuration et nombreux serveurs

Tous les guides