La configuration
mkdir -m 700 ~/.ssh/cm
Host server
HostName example.com
User user
ControlMaster auto
ControlPath ~/.ssh/cm/%C
ControlPersist 10m
ControlMaster autoutilise une connexion existante s'il y en a une, et sinon en ouvre une nouvelle que les autres peuvent partager.ControlPathest le fichier socket que les sessions utilisent pour trouver la connexion.%Cest 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 10mgarde la connexion ouverte 10 minutes après la fin de la dernière session. Avecno, la valeur par défaut, la connexion vit dans le premiersshlancé, qui reste ouvert jusqu'à la fin de toutes les sessions qui l'utilisent. Avecyes, 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
| Commande | Ce qu'elle fait |
|---|---|
ssh -O check server | Affiche Master running (pid=1534), code de sortie 0 |
ssh -O conninfo server | Affiche les adresses et les algorithmes de la connexion |
ssh -O forward -L 8080:localhost:80 server | Ajoute une redirection de port à la connexion ouverte |
ssh -O cancel -L 8080:localhost:80 server | Retire cette redirection |
ssh -O stop server | N'accepte plus de nouvelles sessions, les sessions en cours continuent |
ssh -O exit server | Ferme la connexion et toutes les sessions qu'elle porte |
ssh -S none server | Ouvre 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.