Implémentation du transfert de port SSH local et distant pour le tunneling
SSH (Secure Shell) est le protocole indispensable à la gestion sécurisée des systèmes distants. Au-delà de sa fonction principale d'accès sécurisé au terminal, SSH offre une fonctionnalité puissante connue sous le nom de transfert de port, souvent appelée Tunneling SSH. Cette technique permet aux utilisateurs de créer des canaux sécurisés et chiffrés pour acheminer le trafic réseau arbitraire via la connexion SSH.
Le tunneling SSH est principalement utilisé pour contourner les pare-feux restrictifs, sécuriser les protocoles en texte brut (tels que HTTP ou les connexions de base de données) en les encapsulant dans le flux SSH chiffré, ou pour accéder à des ressources du réseau interne qui ne sont pas exposées publiquement. Comprendre la différence entre le transfert de port local et distant est essentiel pour déployer des solutions de tunneling efficaces et sécurisées dans des architectures réseau complexes.
Ce guide explore les mécanismes, la syntaxe et les applications pratiques du transfert de port SSH local et distant, en fournissant les connaissances nécessaires pour acheminer en toute sécurité votre trafic réseau à travers différentes frontières.
Comprendre les fondamentaux du tunneling SSH
Un tunnel SSH établit une connexion sécurisée point à point où un port spécifique sur une machine est mappé à un port spécifique sur une autre machine, en utilisant le serveur SSH comme point de relais. Toutes les données transitant par ce tunnel sont automatiquement chiffrées par le protocole SSH, garantissant la confidentialité et l'intégrité.
Il existe trois types principaux de transfert de port : Local, Distant et Dynamique (Proxy SOCKS). Cet article se concentre sur les deux méthodes de tunneling direct les plus courantes : Locale (-L) et Distante (-R).
1. Transfert de port local (tunnelisation L)
Le transfert de port local est la forme de tunneling la plus courante. Il permet à une machine cliente locale (où le tunnel est initié) d'accéder à un service sur un hôte de destination qui n'est accessible que par le serveur SSH.
Considérez le transfert local comme la sécurisation de l'accès vers un réseau distant.
Cas d'utilisation : Sécurisation de l'accès à la base de données
Imaginez que vous devez accéder à une base de données MySQL (port 3306) fonctionnant sur un réseau privé (10.0.0.5). Votre machine locale ne peut pas atteindre directement cette IP privée, mais le serveur SSH bastion (bastion.example.com) le peut. Le transfert local mappe un port sur votre machine locale au port de la base de données distante via le serveur bastion.
Syntaxe du transfert de port local (-L)
La structure de la commande est la suivante :
ssh -L [PortLocal]:[HoteDestination]:[PortDestination] [UtilisateurSSH]@[ServeurSSH]
| Paramètre | Description |
|---|---|
PortLocal |
Le port auquel vous vous connecterez sur votre machine locale. |
HoteDestination |
Le nom d'hôte/IP du service final auquel vous souhaitez accéder. |
PortDestination |
Le port du service final sur l'HoteDestination. |
ServeurSSH |
Le serveur intermédiaire qui gère le tunnel (le serveur bastion). |
Exemple pratique de transfert de port local
Pour accéder au serveur MySQL distant (10.0.0.5:3306) en vous connectant au port 9999 sur votre machine locale :
ssh -L 9999:10.0.0.5:3306 [email protected]
Une fois la connexion établie, toute connexion effectuée localement à localhost:9999 sera acheminée de manière sécurisée via bastion.example.com et arrivera sur 10.0.0.5:3306.
Pour vous connecter au service :
# Connectez votre application (par exemple, client MySQL) à :
Hôte : 127.0.0.1
Port : 9999
2. Transfert de port distant (tunnelisation R)
Le transfert de port distant est moins intuitif. Il permet à un serveur SSH distant d'accéder à un service fonctionnant sur la machine cliente locale où le tunnel a été initié.
Considérez le transfert distant comme rendant un service local accessible vers l'extérieur du réseau distant (via le serveur SSH).
Cas d'utilisation : Exposition d'un serveur de développement local
Supposons que vous exécutiez un serveur de développement web local sur le port 3000 sur votre ordinateur portable, mais que vous ayez besoin qu'un collègue (ou un service webhook) y accède via votre serveur SSH public (public.example.com).
Syntaxe du transfert de port distant (-R)
La structure de la commande est la suivante :
ssh -R [PortServeur]:[HoteDestination]:[PortDestination] [UtilisateurSSH]@[ServeurSSH]
| Paramètre | Description |
|---|---|
PortServeur |
Le port qui sera ouvert sur le serveur SSH. |
HoteDestination |
L'hôte du côté local (généralement localhost ou 127.0.0.1). |
PortDestination |
Le port du service local que vous souhaitez exposer. |
ServeurSSH |
Le serveur distant qui hébergera le port accessible publiquement. |
Exemple pratique de transfert de port distant
Pour exposer votre serveur web local fonctionnant sur le port 3000 via le port 8080 sur le serveur SSH public :
ssh -R 8080:localhost:3000 [email protected]
Une fois le tunnel établi, un utilisateur se connectant à public.example.com:8080 verra son trafic acheminé de manière sécurisée vers le port 3000 de votre machine locale.
Note de configuration serveur : GatewayPorts
Par défaut, la plupart des serveurs SSH n'écoutent les connexions de transfert distant que sur l'interface de bouclage (
127.0.0.1). Si vous avez besoin que le port transféré sur le serveur SSH soit accessible par des hôtes externes (c'est-à-dire rendre votre service local véritablement public), vous devez configurer le serveur SSH (sshd_config) pour activerGatewayPorts yeset redémarrer le service SSH. Sans ce paramètre, la connexion n'est utilisable que par d'autres applications s'exécutant directement sur le serveur SSH lui-même.
Bonnes pratiques pour le tunneling SSH
Pour garantir que vos tunnels soient fiables, sécurisés et fonctionnent efficacement, tenez compte de ces conseils opérationnels.
Exécution des tunnels en arrière-plan
Pour un fonctionnement continu, les tunnels doivent être détachés de la session terminal et exécutés silencieusement en arrière-plan. Utilisez les indicateurs suivants :
-N: N'exécutez aucune commande distante (utilisé strictement pour le transfert de port).-f: Demande à ssh de passer en arrière-plan juste avant l'exécution de la commande.
Exemple (Tunnel local en arrière-plan) :
ssh -Nf -L 80:internal.web.site:80 [email protected]
Utilisation de l'authentification par clé
Utilisez toujours des clés SSH au lieu des mots de passe, en particulier pour les tunnels automatisés ou de longue durée. Cela évite les problèmes de délai d'attente liés aux invites de mot de passe et est intrinsèquement plus sécurisé.
Contrôle de la durée de vie du tunnel
Si l'application utilisant le tunnel n'envoie pas de trafic fréquemment, la connexion peut être interrompue en raison de l'inactivité ou de problèmes réseau. Pour éviter cela, configurez le client pour envoyer périodiquement des messages "keep alive".
# Envoie un paquet nul toutes les 60 secondes pour maintenir la connexion ouverte
ssh -o ServerAliveInterval=60 -L 9999:host:port user@server
Considérations de sécurité
- Principe du moindre privilège : Ne transférez que les ports nécessaires. Ne créez pas de tunnels ouverts.
- Audit de
sshd_config: Lors de l'utilisation du transfert distant, soyez prudent avec le réglage deGatewayPorts yes, car cela expose les services internes publiquement. Assurez-vous que des règles de pare-feu appropriées protègent le serveur SSH. - Utilisateur de tunnel : Si possible, créez un compte utilisateur dédié et hautement restreint sur le serveur SSH spécifiquement pour le tunneling, en limitant leur accès shell (
/sbin/nologin).
Résumé des différences
La distinction fondamentale entre le transfert local et distant réside dans l'emplacement du port d'écoute et la direction du flux de trafic par rapport au serveur SSH.
| Caractéristique | Transfert local (-L) |
Transfert distant (-R) |
|---|---|---|
| Port d'écoute | Sur la machine cliente (Locale) | Sur le serveur SSH (Distant) |
| Objectif du trafic | Accéder à un service derrière le serveur. | Exposer un service local via le serveur. |
| Initiation | Le client se connecte à son propre port local. | L'hôte distant se connecte au port du serveur. |
| Direction (par rapport au serveur) | Le trafic circule du serveur vers l'hôte de destination. | Le trafic circule du serveur vers le client initiateur. |
Le transfert de port SSH offre une méthode robuste, chiffrée et hautement flexible pour naviguer en toute sécurité dans des environnements réseau complexes. En maîtrisant les indicateurs -L et -R, les administrateurs et les développeurs peuvent garantir la protection du trafic sensible tout en atteignant la connectivité réseau nécessaire.