· Julien PENASSOU · Deep dive · 7 minutes de lecture
Les Tunnels SSH
Libérez tout le potentiel de SSH pour créer des tunnels réseaux sécurisés !

Introduction
L’intérêt du tunneling
Le tunneling est une technique qui permet de faire transiter des communications entre deux machines à travers un canal sécurisé, appelé tunnel. Concrètement, ce tunnel encapsule les échanges réseau afin de les protéger et de les faire passer là où une communication directe serait normalement impossible, soit pour des raisons techniques (segmentation réseau, NAT, filtrage de ports, absence de routage), soit pour des raisons de sécurité (restriction d’accès, cloisonnement, exposition limitée des services).
Cette méthode présente plusieurs avantages : elle est relativement simple à mettre en place, elle limite fortement l’exposition des services sur Internet et elle améliore la sécurité en évitant l’ouverture inutile de ports accessibles publiquement.
Le tunneling est notamment utilisé pour accéder à des ressources qui ne sont pas directement exposées, ou pour rediriger des ports d’une machine à une autre. Selon le besoin, les flux peuvent être redirigés de différentes manières :
- d’un port local vers une autre port local
- d’un port local vers un port distant
- d’un port distant vers un port local
Exemples d’utilisation concrets :
- Accéder à une interface web interne (routeur, application, outil d’administration) sans rendre le service public.
- Administrer un cluster, un serveur ou une base de données via un canal chiffré.
- Tester un service protégé par un pare-feu sans modifier la configuration réseau.
- Faire transiter son trafic Internet via un réseau distant grâce à un proxy.
Pourquoi SSH ?
SSH (Secure SHell) est un protocole réseau permettant d’établir des connexions chiffrées entre deux ordinateurs pour avoir un accès distant sécurisé. Si vous ne connaissez pas SSH, je vous invite à lire la page wikipédia.
Il s’agit d’un outil indispensable pour un administrateur et il est donc présent sur quasiment sur tous les serveurs. En plus d’être installé quasiment partout, SSH est très simple d’utilisation et offre toutes les options pour faire du tunneling et de la redirection de port.
Les concepts
Avant d’entrer dans le détail du fonctionnement du tunneling SSH, il est important de prendre le temps de comprendre quelques concepts clés qui serviront de base pour la suite.
Proxy SOCKS
Un proxy SOCKS (SOCKet Secure) est un serveur intermédiaire chargé de faire transiter le trafic réseau à votre place. Plutôt que de communiquer directement avec un service distant, votre application (navigateur web, outil en ligne de commande, etc.) envoie ses requêtes au proxy, qui se charge ensuite de les relayer vers la destination appropriée.

Les cas d’usage sont multiples, par exemple :
- Contourner des contraintes réseau (filtrage de ports, pare-feu, segmentation, absence de routage direct)
- Accéder à des services internes depuis un poste distant, sans les exposer publiquement
- Masquer l’origine des connexions lors de phases de tests, d’administration ou d’analyse
Redirection de port / port forwarding
Comme son nom l’indique, la redirection de port sert à rediriger le trafic réseau d’un port source vers un autre port. Ce port de destination peut être local ou sur une machine distante.
Dans l’exemple ci-dessous quand un utilisateur va contacter host 1 sur le port 80, host 1 va rediriger le trafic vers host 2 sur le port 8080 et afficher mon application.

Les différents types de tunnels SSH
Redirection de port local / Local Forwarding
Permet de rediriger un port local vers un service distant à travers une connexion SSH.

Dans l’exemple ci-dessus, mon host 1 veut accéder au port 80 de mon host 2 mais le pare-feu ne le permet pas. Peu importe, le port 22 (SSH) lui est autorisé. Ainsi, quand host 1 va sur http://127.0.0.1:8080 celui ci va être redirigé vers le port 80 de host 2 en passant par le tunnel SSH ouvert précédemment avec la commande :
ssh user@serveur -L <port_local>:<hôte_cible>:<port_cible>Redirection de port distant / Remote Forwarding
Permet d’ouvrir un port sur un serveur distant redirigeant vers un port de notre serveur local. C’est très utile pour la majorité des pare-feu qui bloquent le trafic entrant mais autorise le trafic sortant.

Dans l’exemple ci-dessus, host 2 n’a pas accès par défaut en SSH à host 1 (car surement bloqué par le pare-feu ou derrière du NAT). Mais l’inverse fonctionne donc nous allons partir de ça ! host 1 se connecte en SSH à host 2 avec l’option -R 2222:127.0.0.1:22 pour ouvrir le port distant 2222 (sur host 2). Quand host 2 va lancer la commande ssh -p 2222 user@127.0.0.1, il sera redirigé vers le port 22 de host 1 et aura donc un terminal sur celui-ci.
ssh user@serveur -R <port_distant>:<hôte_local>:<port_local>
# Depuis l'host 2
ssh -p 2222 user@127.0.0.1Redirection de port dynamique (proxy SOCKS)
Le dynamic forwarding (ou proxy SOCKS), permet de transformer une connexion SSH en proxy réseau dynamique. Contrairement au port forwarding classique, on ne redirige pas un port vers un service précis : c’est l’application (navigateur, outil CLI, …) qui décide dynamiquement où envoyer le trafic.

En pratique, on ouvre un port local SOCKS (par exemple 1080) via SSH, on configure ensuite notre application pour l’utiliser. Tout le trafic passe alors par le tunnel chiffré SSH et semble provenir du serveur distant, ce qui est idéal pour tester des accès réseau, contourner des restrictions ou naviguer via un autre point de sortie sans déployer un VPN complet.
ssh user@serveur -D <port_local>Pour aller plus loin
Port Knocking + OTP pour SSH
L’utilisation des tunnels SSH est souvent temporaire. Nous n’avons donc pas forcément besoin d’avoir ce port ouvert en permanence. Et si je vous disais qu’il y a un moyen d’ouvrir le port SSH sur demande ? C’est le port Knocking !
Dans le principe, il faut voir ça comme une porte fermée nécessitant de toquer à la porte avec une certaine combinaison pour qu’on nous ouvre. Si ce n’est pas la bonne combinaison, il ne se passe rien !
Ici, pour la combinaison, nous allons faire des demandes de connexion sur une suite de ports spécifiques dans un laps de temps donné pour demander l’ouverture.
Le port SSH est fermé par défaut. Une séquence précise de connexions sur plusieurs ports déclenche temporairement l’ouverture de notre port via une règle iptables temporaire. La limite du port knocking, c’est qu’une fois la suite de port connu, tout le monde peut avoir accès au port 22.
Si l’on souhaite encore renforcer la sécurité on peut ajouter de l’OTP (One-Time Password). Cela permet de définir une suite de port de façon dynamique qui change chaque minute !
OTP est un mécanisme d’authentification utilisant un code à usage unique, généré dynamiquement pour une session ou une action donnée et permettant de renforcer la sécurité en ajoutant un second facteur d’authentification en plus du mot de passe.
Un fichier de configuration pour ses connexions SSH
Vous en avez marre de mémoriser les informations SSH de vos serveurs (utilisateur, port, clef SSH, tunnel, …)?
Le fichier ~/.ssh/config permet de centraliser et structurer toutes ses options de connexion SSH dans un seul endroit. Cela nous permet de faire des “alias”
# Commande d'origine
ssh dev@dev.exemple.com -p 2222
# Commande avec l'alias
ssh serveur-devQuelques exemples de base pour votre fichier de configuration :
# Connexion simple à mon serveur de dev
Host serveur-dev
HostName dev.exemple.com
User dev
Port 2222
# Connexion via clés SSH
Host serveur-prod
HostName prod.exemple.com
User prod
IdentityFile ~/.ssh/id_ed25519_prod
# Connexion à un serveur interne via proxyjump
Host bastion
HostName bastion.exemple.com
User admin
Host serveur-interne
HostName 10.0.1.15
User user
ProxyJump bastionSuivez-nous
Cet article vous a plu ?
Rejoignez-nous sur nos différents réseaux sociaux pour suivre notre actualité ! Nous y partageons nos nouveautés, nos réalisations, ainsi que des retours d’expérience sur les projets que nous menons au quotidien.
Vous pouvez également suivre notre blog via notre flux RSS, afin de ne manquer aucune publication. De nouveaux articles seront publiés régulièrement, avec pour objectif de vous présenter nos réalisations, de promouvoir les bonnes pratiques de l’ingénierie logicielle, et de décrypter l’actualité technique et numérique.
