Créer des tunnels SSH

L'objectif de ce billet est d'apprendre à créer des tunnels SSH.

Cet article ne vise pas à expliquer ce qu'est un tunnel SSH mais à clarifier la mise en place et l'utilisation de cet outil.

Il existe trois modes de tunnels :

  • le mode local ;
  • le mode distant ;
  • le mode dynamique (basé sur l'utilisation d'un serveur SOCKS).

Ce billet traitera des deux premiers. Pour chaque mode, nous étudierons deux cas.

Et pour chaque cas, il sera expliqué comment créer des tunnels, dans un premier temps en ligne de commandes (ex : sur Linux), et dans un second à l'aide de Putty (ex: sur Windows).

Prérequis

  • La machine qui crée les tunnels doit être équipée de SSH (par défaut sur Linux), ou équipée d'un client SSH graphique (Putty, Penguinet...).
  • La machine sur laquelle on se connecte en SSH doit autoriser des connexions SSH (machine B pour les tunnels locaux, machine A pour les tunnels distants).

Création d'un tunnel SSH local (option -L).

Cas n°1

Soit la configuration suivante :

cas1.png

Nous avons deux machines reliées à Internet : une machine A et une machine B hébergeant une base de données qui écoute sur le port 4141.

Nous voulons que la machine A accède de manière sécurisée à la base de données se situant sur la machine B. Nous décidons donc de créer un tunnel SSH entre ces deux machines.

Création d'un tunnel local en ligne de commande

Voici la commande à exécuter sur la machine A pour ouvrir un tunnel SSH vers la base de données :

ssh -L port_machine_A:localhost:port_machine_B machine_B -f -N
où port_machine_A peut-être n'importe quel port libre de la machine A (ex : 1234).

soit :

ssh -L 1234:localhost:4141 machine_B -f -N

L'option -L indique la création d'un tunnel SSH local.
Les options -f et -N permettent d'exécuter le tunnel en tâche de fond.
localhost indique que la requête sera exécutée sur la machine B et non redirigée vers une autre machine.

Une fois la commande exécutée, il faudra s'authentifier sur la machine B.

Cette commande signifie que lorsque la machine A envoie une requête sur le port 1234, celle-ci est transmise via un SSH à la machine B et est redirigée sur le port 4141 de cette dernière.

La base de données sera donc accessible sur la machine A à l'adresse localhost:1234 et la connexion sera chiffrée.

Pour fermer le tunnel, récupérez l'identifiant du processus en tapant la commande suivante :

ps aux | grep ssh

puis tuez le processus :

kill -9 id_du_processus

Création d'un tunnel local avec Putty

Renseignez les champs comme ceci :

local1.png

local2-local.png

NB : le port source peut être n'importe quel port libre de la machine A (pas forcément 1234).
Cliquez sur "Add".

local3-local.png

Une fois les champs renseignés, cliquez sur "Open".
Vous devrez vous authentifier sur la machine B.

Une fois l'authentification réalisée, la machine A pourra accéder à la base de données de B à l'adresse localhost:1234.

Le tunnel restera ouvert tant que Putty sera connecté à la machine B.

Cas n°2

Soit la configuration suivante :

cas2.png

Une machine A connectée à Internet.
Un réseau local comprenant une machine B, reliée à Internet elle aussi, et une machine C comprenant une base de données non connectée à Internet.

Nous souhaitons que la machine A ait accès à la base de données sur la base C. Un moyen d'y parvenir est de créer un tunnel SSH entre la machine A et la machine B et de rediriger la requête vers la machine C.

Création d'un tunnel local en ligne de commande

Voici la commande à exécuter sur notre machine pour ouvrir un tunnel SSH vers la base de données :

ssh -L port_machine_A:machine_C:port_machine_C machine_B -f -N
où port_machine_A peut-être n'importe quel port libre de la machine A (ex : 1234).

soit :

ssh -L 1234:machine_C:4141 machine_B -f -N

L'option -L indique la création d'un tunnel SSH local.
Les options -f et -N permettent d'exécuter le tunnel en tâche de fond.
machine_C indique que la requête sera redirigée vers la machine C.

Une fois la commande exécutée, il faudra s'authentifier sur la machine B.

Cette commande signifie que lorsque la machine A envoie une requête sur son port 1234, celle-ci est transmise via un SSH à la machine B et est redirigée sur le port 4141 de la machine C.

La base de données sera donc accessible à l'adresse localhost:1234. Cependant, la connexion sera seulement chiffrée entre la machine A et la machine B. Pour aussi chiffrer la connexion entre les machines B et C, il faudrait créer un second tunnel.

Création d'un tunnel local avec Putty

Renseignez les champs comme ceci :

local1.png

local2-C.png

Cliquez sur "Add".

local3-C.png

Une fois les champs renseignés, cliquez sur "Open".
Vous devrez vous authentifier sur la machine B.

Une fois l'authentification réalisée, la machine A pourra accéder à la base de données de C à l'adresse localhost:1234.

Le tunnel restera ouvert tant que Putty sera connecté à la machine A.

Création d'un tunnel SSH distant (option -R).

Dans les exemples précédents, le tunnel SSH a été créé à partir de la machine A.
Il est possible, pour que la machine A ait accès à la base de données, de créer un tunnel SSH à partir de la machine B.
Pour ce faire, on utilise l'option -R (pour "remote") :

Cas n°1

cas1.png

Pour rappel, nous souhaitons que la machine A accède à la base de données de la machine B de manière sécurisée.

Création d'un tunnel distant en ligne de commande

Nous exécutons donc la commande suivante sur la machine B :

ssh -R port_machine_A:localhost:port_machine_B machine_A -f -N
où port_machine_A peut-être n'importe quel port libre de la machine A (ex : 1234).

soit :

ssh -R 1234:localhost:4141 machine_A -f -N

L'option -R indique la création d'un tunnel SSH distant.

Une fois la commande exécutée, il faudra s'authentifier sur la machine A.

Comme précédemment, la machine A peut accéder à la base de données à l'adresse localhost:1234.
La seule différence est que le tunnel est maintenu par la machine B.

Création d'un tunnel distant en ligne avec Putty

Renseignez les champs comme ceci :

distant1.png

distant2-local.png

Cliquez sur "Add".

distant3-local.png

Une fois les champs renseignés, cliquez sur "Open".
Vous devrez vous authentifier sur la machine A.

Une fois l'authentification réalisée, la machine A pourra accéder à la base de données de B à l'adresse localhost:1234.

Le tunnel restera ouvert tant que Putty sera connecté à la machine A.

Cas n°2

cas2.png

Nous voulons donc que la machine A accède à la base de données sur la machine C en passant par la machine B.
Le tunnel est à créer à partir de la machine B.

Création d'un tunnel distant en ligne de commande

Voici la commande à exécuter sur la machine B :

ssh -R port_machine_A:machine-C:port_machine_C machine_A -f -N
où port_machine_A peut-être n'importe quel port libre de la machine A (ex : 1234).

soit :

ssh -R 1234:machine_C:4141 machine_A -f -N

L'option -R indique la création d'un tunnel SSH distant.

Une fois la commande exécutée, il faudra s'authentifier sur la machine A.

La machine A peut accéder à la base de données à l'adresse localhost:1234.
Comme pour le tunnel local, seule la liaison entre les machines A et B sera chiffrée.

Création d'un tunnel distant en ligne avec Putty

Renseignez les champs comme ceci :

distant1.png

distant2-C.png

Cliquez sur "Add".

distant3-C.png

Une fois les champs renseignés, cliquez sur "Open".
Vous devrez vous authentifier sur la machine A.

Une fois l'authentification réalisée, la machine A pourra accéder à la base de données de C à l'adresse localhost:1234.

Le tunnel restera ouvert tant que Putty sera connecté à la machine A.

Conclusion

Vous avez maintenant les bases pour créer des tunnels SSH.

Pour résumer, les tunnels SSH locaux sont a créer sur la machine qui a besoin d'accéder à la ressource, et les tunnels distants sur la machine distante.

Enfin, il ne faut pas oublier de fermer le tunnel une fois qu'il n'est plus utilisé :

  • en lignes de commandes : en récupérant l'id du processus (ps aux | grep ssh) et en le tuant (kill -9 id_du_processus) ;
  • avec Putty : en fermant la console.

Un commentaire

  1. encode.com.a

    Hello friend. My partner and i truly love this article and the webpage all in all! The write-up is extremely plainly composed and also without difficulty understandable. The WordPress theme is wonderful as well! Would definitely be fantastic to…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.