Tunnel SSH permanent sous Linux

L'IP publique de mon PC devient celle de mon serveur puisque tout le trafic du PC transite par le serveur.

Note : ceci est un vieux schéma…

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

Je vous passe le cours théorique sur les tunnels. D’autres l’ont déjà très bien fait…

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
N’hésitez pas à mettre un mot de passe fort !

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 ''
Ici un trousseau de clés RSA de 4096 bits, stockées dans ~/.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 !

Twitter Facebook Google Plus email