Démystifier le transfert de port SSH : Explication des tunnels locaux, distants et dynamiques
Secure Shell (SSH) est une pierre angulaire de l'accès distant sécurisé, fournissant des canaux de communication chiffrés pour la gestion des serveurs et le transfert de fichiers. Au-delà de sa fonctionnalité principale, SSH offre une fonctionnalité puissante mais souvent sous-utilisée : le transfert de port (port forwarding). Cette technique vous permet de créer des tunnels sécurisés, étendant le chiffrement SSH à d'autres trafics réseau, permettant d'accéder à des services qui ne sont pas directement exposés à Internet, ou de relier des segments réseau en toute sécurité.
Cet article explore les subtilités du transfert de port SSH, en décomposant ses trois formes principales : local, distant et dynamique. Nous examinerons comment chaque type fonctionne, ses cas d'utilisation spécifiques, et fournirons des exemples pratiques pour vous aider à tirer parti de cette capacité SSH avancée pour une sécurité et une flexibilité réseau améliorées.
Comprendre les bases : Qu'est-ce que le transfert de port ?
À la base, le transfert de port SSH, également connu sous le nom de tunneling SSH, redirige le trafic réseau d'une interface réseau et d'un port vers un autre. Au lieu d'établir une connexion directe à un service sur une machine distante, vous établissez une connexion SSH, puis vous demandez à SSH de transférer le trafic envoyé à un port local vers un port de destination spécifique sur une machine distante (ou vice-versa), le tout au sein du canal SSH chiffré.
Ceci offre plusieurs avantages :
- Sécurité : Chiffre le trafic qui serait autrement non chiffré entre votre client et le service cible.
- Contrôle d'accès : Permet d'accéder à des services s'exécutant sur des réseaux privés ou derrière des pare-feu qui ne sont pas directement accessibles depuis votre emplacement actuel.
- Rapprochement de réseaux : Connecte différents segments réseau de manière sécurisée.
1. Transfert de port local (-L)
Le transfert de port local est le type le plus courant. Il vous permet de transférer des connexions depuis un port de votre machine locale vers un port sur une machine distante, via un serveur SSH. Essentiellement, vous faites apparaître un service s'exécutant sur le réseau distant comme s'il s'exécutait sur votre machine locale.
Comment ça marche :
- Vous démarrez un client SSH sur votre machine locale.
- Vous spécifiez un port local (
local_port) sur lequel SSH écoutera. - Toute connexion établie à
local_portsur votre machine locale est transférée via la connexion SSH versremote_hostetremote_port.
Syntaxe :
ssh -L [local_bind_address:]local_port:remote_host:remote_port [user@]ssh_server_host
local_bind_address: (Optionnel) L'adresse sur votre machine locale à laquelle lier le port d'écoute. La valeur par défaut estlocalhost.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 vers laquelle le serveur SSH se connectera.remote_port: Le port sur leremote_hostvers lequel le trafic sera dirigé.user@ssh_server_host: Votre nom d'utilisateur et le nom d'hôte/adresse IP du serveur SSH auquel vous vous connectez.
Cas d'utilisation pratique : Accéder à un serveur de base de données s'exécutant 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 your_user@your_ssh_server.com
- Cette commande vous connecte à
your_ssh_server.com. - Elle ouvre le port
5433sur votre machine locale (localhostpar défaut). - Toute connexion à
localhost:5433sera transférée viayour_ssh_server.comvers192.168.1.100:5432.
Vous pouvez maintenant configurer votre client de base de données local pour qu'il se connecte à localhost:5433, et le trafic sera acheminé de manière sécurisée 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 your_user@your_ssh_server.com
2. Transfert de port distant (-R)
Le transfert de port distant vous permet de transférer des connexions depuis un port sur le serveur SSH distant vers un port de votre machine locale ou une autre machine accessible depuis votre machine locale. Ceci est utile pour rendre accessible au serveur distant ou à son réseau un service s'exécutant sur votre machine locale.
Comment ça marche :
- Vous démarrez un client SSH sur votre machine locale.
- Vous spécifiez un port distant (
remote_port) sur le serveur SSH sur lequel SSH écoutera. - Toute connexion établie à
remote_portsur le serveur SSH est renvoyée via la connexion SSH vers votre machine locale, puis vers undestination_hostet undestination_portspécifiés.
Syntaxe :
ssh -R [remote_bind_address:]remote_port:destination_host:destination_port [user@]ssh_server_host
remote_bind_address: (Optionnel) L'adresse sur le serveur SSH à laquelle lier le port d'écoute. La valeur par défaut estlocalhost(ce qui signifie que seul le serveur SSH lui-même peut se connecter à ce port). Utilisez0.0.0.0ou*pour permettre à d'autres machines du 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 vers laquelle votre client SSH se connectera (souventlocalhostsi le service est sur votre machine locale).destination_port: Le port sur ledestination_hostvers lequel le trafic sera dirigé.user@ssh_server_host: Votre nom d'utilisateur et le nom d'hôte/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éveloppez une application web sur votre ordinateur portable et que vous souhaitez la présenter à un collègue qui n'a accès qu'au réseau interne de votre entreprise, et que vous disposez d'un serveur SSH (your_ssh_server.com) accessible depuis ce réseau.
Sur votre ordinateur portable, vous exécuteriez :
ssh -R 8080:localhost:3000 your_user@your_ssh_server.com
- Cette commande vous connecte à
your_ssh_server.com. - Elle demande à
your_ssh_server.comd'écouter sur le port8080. - Toute connexion à
your_ssh_server.com:8080sera renvoyée via le tunnel SSH vers votre ordinateur portable (localhost) sur le port3000(où votre serveur web s'exécute).
Votre collègue peut maintenant accéder à votre application web en naviguant vers http://your_ssh_server.com:8080 dans son navigateur. Le trafic va de son navigateur au serveur SSH, traverse le tunnel jusqu'à votre ordinateur portable, puis jusqu'à votre serveur web.
Attention : Par défaut, le remote_port est lié à localhost sur le serveur SSH. Pour permettre à d'autres machines du réseau distant d'accéder au port transféré, vous devez explicitement définir remote_bind_address sur 0.0.0.0 ou * et vous assurer que la configuration du serveur SSH (GatewayPorts yes dans sshd_config) l'autorise.
ssh -R 0.0.0.0:8080:localhost:3000 your_user@your_ssh_server.com
3. 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 tunneliser toute application prenant en charge les proxies 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 ça marche :
- Vous démarrez un client SSH sur votre machine locale.
- Vous spécifiez un port local (
local_port) sur lequel SSH écoutera en tant que proxy SOCKS. - Vous configurez vos applications (navigateur web, etc.) pour utiliser
localhost:local_portcomme proxy SOCKS. - Lorsqu'une application effectue une requête via ce proxy, SSH transfère le trafic vers le serveur SSH, qui établit alors la connexion à la destination finale au nom de votre application.
Syntaxe :
ssh -D [local_bind_address:]local_port [user@]ssh_server_host
local_bind_address: (Optionnel) L'adresse sur votre machine locale à laquelle lier le port d'écoute du proxy SOCKS. La valeur par défaut estlocalhost.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/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 acheminer tout votre trafic de navigation web via une connexion SSH chiffrée vers un serveur de confiance.
Sur votre ordinateur portable, exécutez :
ssh -D 1080 your_user@your_trusted_server.com
- Cette commande vous connecte à
your_trusted_server.com. - Elle ouvre le port
1080sur votre machine locale, agissant comme un proxy SOCKS.
Ensuite, configurez votre navigateur web (ou d'autres applications) pour utiliser un proxy SOCKS à localhost sur le port 1080.
Maintenant, toutes les requêtes Internet de votre navigateur seront envoyées à votre serveur SSH, qui récupérera les données et vous les renverra, le tout dans le tunnel SSH chiffré. Cela donne l'impression que votre trafic web provient de your_trusted_server.com.
Astuce : Vous pouvez combiner -D avec -C pour la compression, ce qui peut être bénéfique sur des liaisons réseau plus lentes.
ssh -C -D 1080 your_user@your_trusted_server.com
Considérations avancées et meilleures pratiques
- Configuration du serveur SSH (
sshd_config) : Certaines fonctionnalités de transfert de port, en particulier le transfert distant permettant des connexions externes (GatewayPorts), nécessitent des configurations spécifiques sur le serveur SSH. Assurez-vous queGatewayPorts yesest décommenté et défini dans/etc/ssh/sshd_configsi vous avez besoin que le transfert distant soit accessible depuis d'autres machines sur le réseau du serveur SSH. - Pare-feu : N'oubliez pas que les pare-feu 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 chiffre 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.
- Persistance : Pour les tunnels de longue durée, envisagez d'utiliser des outils comme
autosshqui peuvent surveiller et redémarrer automatiquement les tunnels SSH s'ils se déconnectent.
Conclusion
Le transfert de port SSH est un outil polyvalent qui étend considérablement l'utilité du protocole Secure Shell. En maîtrisant le transfert local, distant et dynamique, vous pouvez renforcer la sécurité, accéder à des ressources restreintes et créer des ponts sécurisés entre les réseaux. Que vous ayez besoin de sécuriser du trafic non chiffré, d'accéder à des services internes ou simplement de naviguer en toute sécurité sur un Wi-Fi public, le transfert de port SSH offre une solution élégante et puissante.
Expérimentez avec ces techniques pour les intégrer dans votre flux de travail quotidien pour des opérations réseau plus sûres et plus flexibles.