Dans mon travail quotidien, je me connecte très souvent à une multitude de serveurs, que ce soit pour aller sur le serveur de logs, pour faire une mise en production ou faire de la maintenance système. Je me connecte également très souvent (sans le savoir) aux serveurs de github à chacune de mes actions git pull
et git push
.
Il se trouve que ssh
est un outil très complet, très configurable si on prend le temps de bien lire la documentation. J’ai ainsi découvert comment accélérer considérablement ma connexion à tous ces serveurs, passant d’un délai moyen compris entre 2 et 3 secondes à une connexion quasi instantannée (de mon point de vue humain).
Toutes les modification dont on va parler seront locales à un utilisateur, en éditant le fichier ~/.ssh/config
.
Completion des noms de serveurs
Tout d’abord, il est possible d’avoir la completion des noms de serveurs depuis la ligne de commande. Ainsi, on peut taper ssh user@mons <TAB>
et le shell nous remplit pour nous le reste (ssh user@monseveur.com
). Par défaut, dans les distributions dérivées de debian, cette option est désactivée
~/.ssh/config
:
HashKnownHosts no
Je vous recommande de supprimer votre fichier ~/.ssh/known_hosts
après cela.
Accélérer la vitesse de connexion
Ensuite, pour accélérer la vitesse de connexion, il est très utile de désactiver le protocole kerberos
lorsque vous tentez de vous connecter à vos serveurs.
~/.ssh/config
:
GSSAPIAuthentication no
GSSAPIKeyExchange no
GSSAPIRenewalForcesRekey no
Rien qu’avec cela, vous devriez obtenir des vitesses de connexion beaucoup plus rapides (c’est ici que vous gagnez vos 2/3 secondes)
Compression des données
Pour un petit surcoût en CPU (côté client et côté serveur mais négligeable), vous pouvez également activer la compression des données pour toutes vos communications entre vous et votre serveur. J’ai choisi pour ma part de mettre le curseur au maximum en configurant un niveau de compression à 9.
~/.ssh/config
:
Compression yes
CompressionLevel 9
Garder les connexions ouvertes
Enfin, il est possible de garder ses connexions ouvertes pendant un certain temps. Ssh peut ainsi garder des sockets ouvertes pendant la durée désirée. En outre, si vous établissez plusieurs connexions avec un même serveur, votre client ssh
va réutiliser la socket existante et faire du multiplexage : autant dire que vos connexions seront instantannées. Ici, un paramétrage pour garder les connexions ouvertes pendant 1/2h :
~/.ssh/config
:
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
ControlPersist 30m
Vous pouvez lister le contenu de votre répertoire ~/.ssh
dans lequel vous verrez des sockets dont le nom sera de la forme utilisateur@serveur:port
.
Attention cependant si vous êtes sur un réseau wifi et que vous perdez votre connexion, ssh
tentera d’utiliser la socket et vous ne pourrez pas vous connecter. Dans ce cas, vous pouvez diminuer cette durée ou demander à ssh
de fermer cette connexion :
ssh -O close user@monseveur.com
Dire à ansible d’utiliser ce paramétrage
Ansible utilise déjà par défaut cette option ControlMaster
mais paramétrée différement (lieu et durée de stockage des sockets). Si vous voulez réutiliser les mêmes sockets et pour une même durée en travaillant avec ansible, il faut le lui dire !
Ainsi, mon fichier ~/.ansible.cfg
ressemble à ceci :
[ssh_connexion]
ssh_args = -o ControlMaster=auto -o ControlPersist=30m
control_path=~/.ssh/%%r@%%h:%%p
Et vous, quelles sont vos options pour votre client ssh qui améliorent votre vie ?
- Mon fichier
~/.ssh/config
complet :
# allow server name completion
HashKnownHosts no
# faster connexion
GSSAPIAuthentication no
GSSAPIKeyExchange no
GSSAPIRenewalForcesRekey no
# compress data to the max
Compression yes
CompressionLevel 9
# keep connexions open
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
ControlPersist 30m