Tunnels SSH : accès à distance sécurisé et redirection de port
SSH est un protocole de communication qui nous permet d’accéder à des hôtes distants et de transférer en toute sécurité des données sur des réseaux non sécurisés, grâce à des connexions cryptées. En utilisant la technique de tunneling SSH, nous pouvons transférer le trafic TCP depuis et vers une machine locale, en contournant les restrictions du pare-feu. Dans ce tutoriel, nous apprenons la différence entre les tunnels SSH locaux et distants, et comment les créer.
Dans ce tutoriel, vous allez apprendre :
- Quelle est la différence entre un tunnel SSH local et un tunnel SSH distant ?
- Comment créer des tunnels SSH locaux et distants
Création d’un tunnel SSH local
En utilisant un tunnel SSH local, nous pouvons transférer tout trafic d’un port TCP donné sur la machine locale, vers une adresse et un port d’hôte distant donnés. Cela peut être utile lorsque nous voulons accéder à un service qui n’est pas directement accessible depuis notre réseau, mais qui est accessible depuis une autre machine. Voici un exemple : supposons qu’il existe une instance de serveur Apache fonctionnant sur une machine qui n’est pas accessible depuis le réseau extérieur, mais uniquement depuis d’autres hôtes à l’intérieur de son propre réseau privé. L’adresse IP locale de cette machine est 192.168.1.6. Sur celui-ci, le serveur web Apache est à l’écoute sur le port 80.
Bien que nous ne puissions pas accéder à la machine directement via Internet, nous pouvons établir une connexion SSH à une autre machine qui se trouve dans le même réseau privé et qui est accessible de l’extérieur à l’aide du nom de domaine complet serverone.mydomain.com :
En créant un tunnel SSH local, nous pouvons accéder à la page web servie par Apache sur la machine distante, comme si elle fonctionnait sur notre machine, et écoutait sur le port 8000. Pour créer le tunnel local, nous appelons le client ssh avec l’option -L, et passons les mappages d’hôtes en argument, en utilisant la syntaxe suivante :
[local-address]:local-port:remote-address:remote-portL’adresse locale est facultative : si nous n’en fournissons pas, le port redirigé sera disponible sur toutes les interfaces. Dans ce cas, nous serons explicites et utiliserons 192.168.0.39. Pour créer le tunnel, nous exécutons :
ssh -N -L 192.168.0.39:8000:192.168.1.6:80 user@serverone.mydomain.comVous pouvez remarquer que nous avons utilisé l’option -N dans la commande ci-dessus : cela est nécessaire pour spécifier que nous ne voulons exécuter aucune commande, mais que nous voulons simplement établir une connexion avec le serveur distant. Une fois la connexion établie, nous pourrons accéder au contenu servi par Apache sur le serveur privé distant, en ouvrant notre navigateur Web et en naviguant jusqu’à http://192.168.0.39:8000.
Création d’un tunnel SSH distant
Un tunnel SSH distant, ou « inverse », fonctionne dans la direction opposée d’un tunnel local. En utilisant un tunnel SSH distant, nous pouvons spécifier que les connexions à une adresse distante et à un port TCP donnés doivent être redirigées vers un hôte et un port locaux. Dans quelle situation peut-on vouloir créer un tunnel SSH distant ?
Supposons que nous développons un site web, c’est-à-dire que nous avons une instance du serveur web Apache qui s’exécute sur notre ordinateur portable, à l’écoute sur le port 80. L’adresse IP locale de notre machine est, encore une fois : 192.168.0.39. Étant donné que la machine se trouve derrière un pare-feu NAT, elle n’est pas accessible depuis le monde extérieur. Néanmoins, de temps en temps, nous voulons être en mesure de montrer comment notre projet évolue à un tiers, sans exposer directement le service. Comment pouvons-nous atteindre notre objectif ? Nous pourrions créer un tunnel SSH distant !
Nous nous connectons via SSH au serveur accessible au public, qui, en plus du port 22, expose également le port 8888 au monde extérieur. Avec le tunnel SSH distant, nous transférons tout le trafic TCP qui se produit sur ce port, vers le port 80 de notre machine, qui est le port écouté par notre serveur Web Apache local. Le client tiers pourra voir les pages servies par notre instance de serveur web local à l’http://serverone.mydomain.com:8888 :
Étant donné que nous voulons permettre aux clients externes d’accéder à un port redirigé via SSH, pour que notre tunnel fonctionne, nous devons nous assurer que l’option GatewayPorts est définie sur « yes » dans la configuration du serveur SSH. La directive est généralement commentée à la ligne 88 du fichier /etc/ssh/sshd_config :
#AllowTcpForwarding yes
GatewayPorts yes
#X11Forwarding noPour que le changement soit effectif, nous devons redémarrer le service ssh :
sudo systemctl restart sshdMaintenant, pour créer le tunnel SSH distant, sur notre machine locale, nous exécutons ssh avec l’option -R, et passons les mappages hôte-port :
[remote-address]remote-port:local-address:local-portOù « remote-address » et « remote-port » sont, respectivement, l’adresse et le port auxquels le client pourra accéder au service, tandis que « local-address » et « local-port » sont l’adresse et le port locaux que le serveur écoute. Pour créer le tunnel distant, nous exécutons :
ssh -N -R serverone.mydomain.com:8888:192.168.0.39:80 user@serverone.mydomain.comRéflexions finales
Dans ce tutoriel, nous avons appris la différence entre les tunnels SSH locaux et distants, et nous avons vu comment les créer sous Linux. Les tunnels locaux sont utiles lorsque nous voulons accéder à un service qui n’est pas directement accessible sur Internet ; En utilisant des tunnels distants, nous pouvons laisser quelqu’un d’autre accéder à un service fonctionnant sur notre machine locale, même s’il se trouve derrière un pare-feu NAT.


