Tunnel SSH permanent sous Linux
Je travaille en ce moment en R&D et aujourd’hui dans mes recherches j’ai du mettre en place des tunnels SSH entre différentes machines CentOS. Comme je bricole pas mal, la connexion entre mes machines n’est pas forcément stable et donc mes tunnels non plus. J’ai donc cherché un moyen à peu près efficace de m’assurer que mon tunnel existe toujours et comme j’ai trouvé, je partage !
Idée générale de la solution
L’idée ici c’est d’avoir un utilisateur dédié à notre tunnel pour lequel on va générer un trousseau de clés afin que celui-ci puisse établir notre tunnel en toute sécurité. Un simple script bash, couplé à une tâche Cron s’assurera du bon fonctionnement du tunnel.
Création de l’utilisateur et des clés
La première étape consiste donc à créer notre utilisateur. Créez-le sur les deux machines. Appelons cet utilisateur ‘tunnel’.
sudo useradd -d /home/tunnel tunnel sudo passwd tunnel |
Nous allons ensuite prendre la peau de notre utilisateur pour lui générer un trousseau de clés. Générez le trousseau sur la machine à partir de laquelle vous aller initier votre tunnel. Appelons-la ‘MachineA’.
[tunnel@machineA ~]# su - tunnel [tunnel@machineA ~]$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -P '' |
~/.ssh/id_rsa
et ~/.ssh/id_rsa.pub
, sans passphrase.
Enfin, il ne reste plus qu’à exporter la clé publique de ‘tunnel’ sur ‘MachineA’ vers ‘MachineB’.
[tunnel@machineA ~]$ ssh-copy-id -i ~/.ssh.id_rsa.pub tunnel@machineb |
Normalement à partir de ce moment, ‘tunnel’ sur ‘MachineA’ devrait pouvoir ouvrir un tunnel vers ‘MachineB’.
[tunnel@machineA ~]$ ssh -vfNq -L 2222:localhost:22 tunnel@machineB OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013 |
lsof -i | grep tunnel
peut vous apporter plus de précision…
On peut donc scripter son comportement !
Mise en place du script et de la tâche Cron
Je vous préviens c’est du basique… Placez-le dans /home/tunnel/autotunnel.sh
par exemple.
createTunnel() { /usr/bin/ssh -fNq -L8140:127.0.0.1:8140 -L2224:127.0.0.1:22 tunnel@machineB if [[ $? -eq 0 ]]; then echo Tunnels to machineB has been created successfully else echo An error occurred creating a tunnel to machineB RC was $? fi } # Pour vérifier que le tunnel existe on essaye d'y faire passer la commande ls # Si rien n'est retourné, on recrée le tunnel /usr/bin/ssh -p 2224 tunnel@127.0.0.1 ls if [[ $? -ne 0 ]]; then echo Creating new tunnel connection createTunnel fi |
Dans mon exemple, deux tunnels sont créés : un pour le port 8140 (je travaille sur Puppet) et un autre qui redirige le 2224 local vers le 22 (SSH) distant. De cette manière vous pouvez normalement gérer autant de tunnels que vous voulez.
Il ne reste plus que la tâche Cron, à ajouter dans /etc/crontab
2 * * * * tunnel bash /home/tunnel/autotunnel.sh |
Et voilà le travail !
Source : brandonchecketts.com.
Cet article vous a plu ? Partagez-le sur les réseaux sociaux !




23/07/2014 @ 11:28
Autossh fais la même chose il me semble
23/07/2014 @ 12:09
Génial je ne connaissais pas ! autossh fait exactement ce qu’il faut, mon script n’a aucun intérêt ^^
Merci du coup 🙂
22/03/2016 @ 20:31
Autre solution : utiliser Mosh…
https://mosh.mit.edu/