Démystifier le transfert de port SSH : Tunnels locaux, distants et dynamiques expliqués

Apprenez les transferts de port SSH local, distant et dynamique avec des commandes pratiques pour les bases de données, les applications web et les proxys SOCKS.

Démystifier le Transfert de Port SSH : Tunnels Local, Distant et Dynamique Expliqués

Le transfert de port SSH vous permet d'atteindre un service réseau via une connexion SSH cryptée au lieu d'exposer ce service directement. Vous l'utiliserez généralement lorsqu'une base de données, un tableau de bord ou un serveur de développement est accessible depuis un hôte SSH mais pas depuis votre ordinateur portable.

Les trois formes courantes sont le transfert local, le transfert distant et le transfert dynamique. Elles utilisent une syntaxe similaire, mais le port d'écoute se trouve à un endroit différent.

Ce que fait le Transfert de Port SSH

Le transfert de port SSH, également connu sous le nom de tunneling SSH, redirige le trafic d'un hôte et d'un port vers un autre hôte et un autre port via votre session SSH. La destination est résolue du côté qui établit la connexion finale. Pour le transfert local, le serveur SSH se connecte à la cible. Pour le transfert distant, votre client SSH se connecte à la cible.

Cela offre plusieurs avantages :

  • Sécurité : Crypte le trafic qui serait autrement non crypté entre votre client et le service cible.
  • Contrôle d'accès : Permet d'accéder aux services exécutés sur des réseaux privés ou derrière des pare-feu qui ne sont pas directement accessibles depuis votre emplacement actuel.
  • Pont entre réseaux : Connecte différents segments réseau de manière sécurisée.

Transfert de Port Local (-L)

Le transfert de port local est le type le plus courant. Il vous permet de transférer les connexions d'un port sur votre machine locale vers un port sur une machine distante, via un serveur SSH. Essentiellement, vous faites en sorte qu'un service exécuté sur le réseau distant apparaisse comme s'il était exécuté sur votre machine locale.

Comment cela fonctionne :

  1. Vous démarrez un client SSH sur votre machine locale.
  2. Vous spécifiez un port local (local_port) sur lequel SSH écoutera.
  3. Toute connexion établie sur local_port sur votre machine locale est transférée via la connexion SSH vers remote_host et remote_port.

Syntaxe :

ssh -L [local_bind_address:]local_port:remote_host:remote_port [user@]ssh_server_host
  • local_bind_address : Adresse facultative sur votre machine locale à lier. Si omise, OpenSSH se lie normalement aux adresses de boucle locale, sauf si votre configuration client indique le contraire.
  • local_port : Le port sur votre machine locale sur lequel SSH écoutera.
  • remote_host : Le nom d'hôte ou l'adresse IP de la machine cible à laquelle le serveur SSH se connectera.
  • remote_port : Le port sur le remote_host vers lequel le trafic sera dirigé.
  • user@ssh_server_host : Votre nom d'utilisateur et le nom d'hôte/l'adresse IP du serveur SSH auquel vous vous connectez.

Cas d'utilisation pratique : Accéder à un serveur de base de données exécuté sur l'adresse IP privée d'un serveur distant.

Imaginez un serveur de base de données (par exemple, PostgreSQL sur 192.168.1.100:5432) qui n'est accessible que depuis le réseau interne de votre entreprise. Vous pouvez utiliser le transfert de port local pour y accéder depuis votre ordinateur portable à la maison :

ssh -L 5433:192.168.1.100:5432 votre_utilisateur@votre_serveur_ssh.com
  • Cette commande vous connecte à votre_serveur_ssh.com.
  • Elle ouvre le port 5433 sur votre machine locale (localhost par défaut).
  • Toute connexion à localhost:5433 sera transférée via votre_serveur_ssh.com vers 192.168.1.100:5432.

Maintenant, vous pouvez configurer votre client de base de données local pour se connecter à localhost:5433, et le trafic sera tunnelisé en toute sécurité vers le serveur de base de données distant.

Astuce : Utilisez ssh -N pour créer un tunnel sans exécuter de commande distante. Ceci est utile pour les tunnels en arrière-plan.

ssh -N -L 5433:192.168.1.100:5432 votre_utilisateur@votre_serveur_ssh.com

Transfert de Port Distant (-R)

Le transfert de port distant vous permet de transférer les connexions d'un port sur le serveur SSH distant vers un port sur votre machine locale ou une autre machine accessible depuis votre machine locale. Ceci est utile pour rendre un service exécuté sur votre machine locale accessible au serveur distant ou à son réseau.

Comment cela fonctionne :

  1. Vous démarrez un client SSH sur votre machine locale.
  2. Vous spécifiez un port distant (remote_port) sur le serveur SSH sur lequel SSH écoutera.
  3. Toute connexion établie sur remote_port sur le serveur SSH est transférée via la connexion SSH vers votre machine locale, puis vers un destination_host et un destination_port spécifiés.

Syntaxe :

ssh -R [remote_bind_address:]remote_port:destination_host:destination_port [user@]ssh_server_host
  • remote_bind_address : (Facultatif) L'adresse sur le serveur SSH à laquelle lier le port d'écoute. Par défaut, localhost (ce qui signifie que seul le serveur SSH lui-même peut se connecter à ce port). Utilisez 0.0.0.0 ou * pour permettre à d'autres machines sur le réseau distant de se connecter.
  • remote_port : Le port sur le serveur SSH sur lequel SSH écoutera.
  • destination_host : Le nom d'hôte ou l'adresse IP de la machine cible à laquelle votre client SSH se connectera (souvent localhost si le service est sur votre machine locale).
  • destination_port : Le port sur le destination_host vers lequel le trafic sera dirigé.
  • user@ssh_server_host : Votre nom d'utilisateur et le nom d'hôte/l'adresse IP du serveur SSH auquel vous vous connectez.

Cas d'utilisation pratique : Exposer un serveur web local à un réseau distant.

Supposons que vous développiez une application web sur votre ordinateur portable et que vous souhaitiez la montrer à un collègue qui n'a accès qu'au réseau interne de votre entreprise, et que vous ayez un serveur SSH (votre_serveur_ssh.com) accessible depuis ce réseau.

Sur votre ordinateur portable, vous exécuteriez :

ssh -R 8080:localhost:3000 votre_utilisateur@votre_serveur_ssh.com
  • Cette commande vous connecte à votre_serveur_ssh.com.
  • Elle indique à votre_serveur_ssh.com d'écouter sur le port 8080.
  • Toute connexion à votre_serveur_ssh.com:8080 sera renvoyée via le tunnel SSH vers votre ordinateur portable (localhost) sur le port 3000 (où votre serveur web est en cours d'exécution).

Maintenant, votre collègue peut accéder à votre application web en naviguant vers http://votre_serveur_ssh.com:8080 dans son navigateur. Le trafic va de son navigateur au serveur SSH, via le tunnel vers votre ordinateur portable, puis vers votre serveur web.

Avertissement : Dans les configurations OpenSSH typiques, le remote_port n'est accessible que depuis le serveur SSH lui-même. Pour permettre à d'autres machines sur le réseau distant d'accéder au port transféré, définissez explicitement remote_bind_address sur 0.0.0.0 ou * et assurez-vous que le serveur SSH le permet avec un paramètre GatewayPorts tel que clientspecified ou yes.

ssh -R 0.0.0.0:8080:localhost:3000 votre_utilisateur@votre_serveur_ssh.com

Transfert de Port Dynamique (-D)

Le transfert de port dynamique crée un proxy SOCKS sur votre machine locale. C'est sans doute le type le plus flexible, car il vous permet de tunnelliser n'importe quelle application prenant en charge les proxys SOCKS via votre connexion SSH. Au lieu de transférer un port spécifique, SSH écoute sur un port local et agit comme un serveur proxy SOCKS.

Comment cela fonctionne :

  1. Vous démarrez un client SSH sur votre machine locale.
  2. Vous spécifiez un port local (local_port) sur lequel SSH écoutera en tant que proxy SOCKS.
  3. Vous configurez vos applications (navigateur web, etc.) pour utiliser localhost:local_port comme proxy SOCKS.
  4. Lorsqu'une application fait une requête via ce proxy, SSH transfère le trafic vers le serveur SSH, qui établit ensuite la connexion vers la destination finale pour le compte de votre application.

Syntaxe :

ssh -D [local_bind_address:]local_port [user@]ssh_server_host
  • local_bind_address : (Facultatif) L'adresse sur votre machine locale à laquelle lier le port d'écoute du proxy SOCKS. Par défaut, localhost.
  • local_port : Le port sur votre machine locale sur lequel SSH écoutera en tant que proxy SOCKS.
  • user@ssh_server_host : Votre nom d'utilisateur et le nom d'hôte/l'adresse IP du serveur SSH auquel vous vous connectez.

Cas d'utilisation pratique : Naviguer sur le web en toute sécurité depuis un Wi-Fi public.

Lorsque vous êtes connecté à un réseau Wi-Fi public non fiable, votre trafic est vulnérable. Vous pouvez utiliser le transfert de port dynamique pour tunnelliser tout votre trafic de navigation web via une connexion SSH cryptée vers un serveur de confiance.

Sur votre ordinateur portable, exécutez :

ssh -D 1080 votre_utilisateur@votre_serveur_de_confiance.com
  • Cette commande vous connecte à votre_serveur_de_confiance.com.
  • Elle ouvre le port 1080 sur votre machine locale, agissant comme un proxy SOCKS.

Ensuite, configurez votre navigateur web ou une autre application pour utiliser un proxy SOCKS à localhost sur le port 1080. Si l'application dispose d'une option DNS distant SOCKS5, utilisez-la lorsque vous ne souhaitez pas que les requêtes DNS aient lieu sur votre réseau local.

Le trafic de votre navigateur est envoyé à votre serveur SSH, qui se connecte ensuite au site de destination. HTTPS reste important ; le tunnel SSH protège le chemin vers votre serveur SSH, pas chaque saut après.

Astuce : Vous pouvez combiner -D avec -C pour la compression, ce qui peut être bénéfique sur les liaisons réseau plus lentes.

ssh -C -D 1080 votre_utilisateur@votre_serveur_de_confiance.com

Considérations Avancées et Bonnes Pratiques

  • Configuration du Serveur SSH (sshd_config) : Certaines fonctionnalités de transfert nécessitent une autorisation côté serveur. Vérifiez AllowTcpForwarding, PermitOpen, PermitListen et GatewayPorts avant de supposer qu'un tunnel peut écouter ou se connecter n'importe où.
  • Pare-feux : N'oubliez pas que les pare-feux sur le client, le serveur ou les réseaux intermédiaires peuvent bloquer les connexions SSH ou les ports utilisés pour le transfert. Assurez-vous que les ports nécessaires (généralement 22 pour SSH lui-même) sont ouverts.
  • Sécurité : Bien que le transfert de port crypte le trafic, la sécurité du tunnel dépend de la sécurité de votre serveur SSH. Utilisez des clés SSH fortes, désactivez l'authentification par mot de passe et maintenez votre serveur SSH à jour.
  • Fiabilité : Pour les scripts, ajoutez -o ExitOnForwardFailure=yes pour que SSH se ferme s'il ne peut pas créer le transfert demandé. Pour les tunnels de longue durée, envisagez autossh ou un service supervisé.

À Retenir

Utilisez -L lorsque votre ordinateur portable doit atteindre un service distant privé. Utilisez -R lorsqu'un hôte distant doit atteindre quelque chose près de votre ordinateur portable. Utilisez -D lorsque vous avez besoin d'un proxy SOCKS via un serveur SSH de confiance. Gardez les liaisons serrées, vérifiez la politique du serveur et traitez chaque tunnel comme une ouverture réseau temporaire.