Les tunnels SSH

Un tunnel SSH est un procédé très puissant qui permet de chiffrer toutes les communications transitant par des ports TCP. Le principe des tunnels SSH, également appelés ports forwarding, pour redirection de ports en français, est de permettre d'atteindre des machines auxquelles vous n'avez normalement pas accès. On encapsule donc des données d'un protocole réseau au sein d'un autre, situé dans la même couche du modèle en couches, ou dans une couche du niveau supérieur.

Le principe

Le SSH

Prenons comme exemple une réseau privé connecté à internet via un routeur & firewall (Image ci-dessous). Les machines C et D n'ont pas accès à internet.

Image 1

Si l'utilisateur de la machine A veut se connecter sur C, il dois se connecter sur B puis se connecter deupuis cette dernière sur C :

user@machine_A:~$ ssh user@machine_B   #Connexion en rouge sur l'image 1
user@machine_B:~$ ssh user@machine_C   #Connexion en vert sur l'image 1
user@machine_C:~$ 
Le port noté 123XX est atribué arbitrairement par la machine établisant la connexion.

Le cas du tunnel

Le principe d'un tunnel SSH est de faire transiter toutes ces données au travers d'un port autorisé. Le tunnel encapsule ces informations et les fait transiter sans soucis vers le serveur distant. Nous allons donc pouvoir utiliser notre tunnel comme porte de sortie du firewall et y faire circuler tout ce qui relève du protocole TCP. Le principe de la création d'un tunnel SSH est le même qu'une simple connexion (probablement car c'est le même protocole).

warning Un tunnel peut être une TRÈS GROSSE FAILLE DE SÉCURITÉ, n'oubliez pas de le refermer à la fin de son utilisation. warning

warning Un tunnel est un moyen de contourner le firewall : son utilisation dans un réseau se dois d'être temporaire. Si vous voulez qu'un port d'une machine soit accèssible par intenet, MODIFIEZ LES RÈGLES DU FIREWALL warning

Vous êtes prévenus.

Reprenons notre architecture précédente. L'utilisateur veut se connecter au serveur web sur la machine D, mais cette dernière n'est pas accesible depuis internet (sans déconner). La solution serai de configurer un tunnel (en vert sur l'image ci-dessous) entre la machine B et D: prenons le port 2048 sur la machine B (il y a peut être déjà un serveur web dessus). L'utilisateur va dans son navigateur et entre l'url : http://machine_B:2048/index.html et devrait accéder au serveur web de la machine D.

Et le firewall dans tout ça! Il y a de forte chance que le port que nous avons choisit soit bloqué par le firewall (si les admins précédents on bien fait leur travail). La solution est donc de créer un deuxième tunnel (en orange) entre le port 2048 de la machine B et un port sur celle de l'utilisateur (prenons le port 8080). L'utilisateur va dans son navigateur et entre l'url : http://localhost:8080/index.html et la page web de la machine D s'affiche.

Quand vous choisissez le port sur lequel vous comptez établir votre tunnel, vérifiez bien que ce dernier n'est pas déjà utiliser (pour éviter une quelconque erreur 45 : ICC)

Image 2

La pratique

Établisment d'un tunnel

Imaginons que l'utilisateur jack veut établir un tunnel entre le port 80 de son serveur web WEB01P et le port 2048 son serveur de rebond ssh SSH01P.

adm_jack@SSH01P:~$ ssh -Nfq -L2048:SSH01P:80 adm_jack@WEB01P sleep 600 #l'option sleep permet au tunnel de se fermet au bout de 10 min (600s) d'inactivité
Puis entre le port 2048 de WEB01P et le port 8080 de son pc PC_JACK
adm_jack@PC_JACK:~$ ssh -Nfq -L8080:localhost:2048 adm_jack@SSH01P sleep 600

L'ordre de création des tunnels n'est pas important.

Fermeture d'un tunnel

Ce n'est parce que nous avons fait en sorte que le tunnel se ferme après 10 min d'inactivité que cela nous empèche de le fermer manuellement. Cela se fait en trois étapes : afficher les tunnels ouvert, relever son PID, puis kill le processus ssh du tunnel :

adm_jack@PC_JACK:~$ lsof -i #Afficher les tunnels ouvert
adm_jack@PC_JACK:~$ kill -9 15XX #PID du tunnel

Un peut d'automatisation

Ajoutez le code ci-dessous à la fin de votre fichier .bashrc.

tunnel()
{
	echo -e "\n###Tunnel sur le port $1 vers $2###\n";
	ssh -Nfq -L$1:localhost:$2 $USER@$3 sleep 600 #Ajouter l'option "-i MyVeryPrivateKey.key" pour vous connecter avec votre clé privée
}
Si Jack veut créer un tunnel du port 2048 de la machine SSH01P vers le port 8080 de son PC, il doit entrer la commande suivante :
adm_jack@PC_JACK:~$ tunnel 8080 2048 SSH01P

Références

N'hésitez pas à consulter la page sur la connexion SSH