Besoin d’accéder à SSH sur un ordinateur Linux qui semble inaccessible ? Demandez-lui de vous contacter, et exploitez cette connexion pour établir votre propre session SSH à distance. Voici comment procéder.
Quand utiliser un tunnel SSH inversé
Parfois, il peut être difficile d’accéder à des ordinateurs distants. Le réseau sur lequel ils se trouvent peut avoir des règles de pare-feu très strictes, ou l’administrateur local a peut-être mis en place des règles complexes de Traduction d’adresses réseau (NAT). Comment accéder à un tel ordinateur lorsque vous avez besoin de vous y connecter ?
Clarifions quelques termes. Votre ordinateur est l’ordinateur local, car il est à proximité. L’ordinateur auquel vous devez vous connecter est l’ordinateur distant, car il est situé ailleurs.
Dans cet article, nous appellerons l’ordinateur distant « howtogeek » et il fonctionnera sous Ubuntu Linux (avec des terminaux violets). L’ordinateur local est appelé « Sulaco » et il fonctionne sous Manjaro Linux (avec des terminaux jaunes).
Normalement, vous initieriez une connexion SSH depuis l’ordinateur local pour vous connecter à l’ordinateur distant. Ce n’est pas une option dans le scénario de réseau que nous décrivons. Le problème de réseau précis importe peu. Cette méthode est utile chaque fois que vous ne pouvez pas utiliser SSH directement vers un ordinateur distant.
Cependant, si votre configuration réseau est simple, l’ordinateur distant peut se connecter à vous. Mais cela ne suffit pas, car cela ne vous donne pas une session en ligne de commande fonctionnelle sur l’ordinateur distant. Mais c’est un début. Une connexion est établie entre les deux ordinateurs.
La solution réside dans le tunnel SSH inversé.
Qu’est-ce qu’un tunnel SSH inversé ?
Un tunnel SSH inversé permet d’utiliser cette connexion pour établir une nouvelle connexion de votre ordinateur local vers l’ordinateur distant.
Puisque la connexion initiale provient de l’ordinateur distant, l’utiliser pour aller dans l’autre sens revient à l’utiliser « à l’envers ». Et puisque SSH est sécurisé, vous créez une connexion sécurisée dans une connexion sécurisée existante. Votre connexion à l’ordinateur distant agit donc comme un tunnel privé à l’intérieur de la connexion initiale.
D’où le nom de « tunnel SSH inversé ».
Comment ça marche ?
Le tunnel SSH inversé repose sur l’ordinateur distant qui utilise la connexion établie pour écouter les nouvelles demandes de connexion provenant de l’ordinateur local.
L’ordinateur distant écoute sur un port réseau de l’ordinateur local. S’il détecte une demande SSH vers ce port, il relaie cette demande de connexion vers lui-même, à travers la connexion établie. Cela permet d’établir une nouvelle connexion de l’ordinateur local vers l’ordinateur distant.
C’est plus facile à configurer qu’à expliquer.
Utiliser le tunneling SSH inversé
SSH sera déjà installé sur votre ordinateur Linux, mais vous devrez peut-être démarrer le démon SSH (sshd) si l’ordinateur local n’a jamais accepté de connexions SSH auparavant.
sudo systemctl start sshd
Pour que le démon SSH démarre à chaque redémarrage de votre ordinateur, utilisez cette commande :
sudo systemctl enable sshd
Sur l’ordinateur distant, utilisez la commande suivante :
L’option -R (reverse) indique à ssh que de nouvelles sessions SSH doivent être créées sur l’ordinateur distant.
« 43022:localhost:22 » indique à ssh que les demandes de connexion au port 43022 de l’ordinateur local doivent être redirigées vers le port 22 de l’ordinateur distant. Le port 43022 a été choisi car il est répertorié comme non attribué. Ce n’est pas un numéro spécial.
dave@sulaco.local est le compte d’utilisateur auquel l’ordinateur distant va se connecter sur l’ordinateur local.
ssh -R 43022:localhost:22 dave@sulaco.local
Vous pourriez recevoir un avertissement indiquant que vous ne vous êtes jamais connecté à l’ordinateur local auparavant. Ou, vous pourriez voir un avertissement lorsque les informations de connexion sont ajoutées à la liste des hôtes SSH connus. Ce que vous voyez dépend des connexions déjà établies entre l’ordinateur distant et l’ordinateur local.
Vous serez invité à entrer le mot de passe du compte utilisé pour vous connecter à l’ordinateur local.
Remarquez qu’une fois la connexion établie, l’invite de commande passe de dave@howtogeek à dave@sulaco.
Nous sommes maintenant connectés à l’ordinateur local depuis l’ordinateur distant. Nous pouvons lui envoyer des commandes. Utilisons la commande « who » pour voir les connexions sur l’ordinateur local.
who
Nous voyons que l’utilisateur dave s’est connecté à l’ordinateur local, et que l’ordinateur distant s’est connecté (avec les mêmes identifiants) depuis l’adresse IP 192.168.4.25.
Se connecter à l’ordinateur distant
Puisque la connexion depuis l’ordinateur distant est réussie, et qu’il écoute les connexions, essayons de nous connecter à l’ordinateur distant depuis l’ordinateur local.
L’ordinateur distant écoute sur le port 43022 de l’ordinateur local. Donc, de manière contre-intuitive, pour établir une connexion à l’ordinateur distant, nous demandons à ssh de se connecter à l’ordinateur local, sur le port 43022. Cette demande sera relayée vers l’ordinateur distant.
ssh localhost -p 43022
Nous sommes invités à entrer le mot de passe du compte utilisateur, puis nous sommes connectés à l’ordinateur distant depuis l’ordinateur local. Notre ordinateur Manjaro affiche joyeusement : « Bienvenue dans Ubuntu 18.04.2 LTS ».
Remarquez que l’invite de commande est passée de dave@sulaco à dave@howtogeek. Nous avons atteint notre objectif : établir une connexion SSH avec notre ordinateur distant difficile à atteindre.
Utiliser SSH avec des clés
Pour faciliter la connexion de l’ordinateur distant à l’ordinateur local, nous pouvons configurer des clés SSH.
Sur l’ordinateur distant, tapez cette commande :
ssh-keygen
Vous serez invité à entrer une phrase de passe. Vous pouvez appuyer sur Entrée pour ignorer les questions de phrase de passe, mais ce n’est pas recommandé. Cela signifierait que quiconque sur l’ordinateur distant pourrait établir une connexion SSH à votre ordinateur local sans avoir besoin d’un mot de passe.
Trois ou quatre mots séparés par des symboles constitueront une phrase de passe robuste.
Vos clés SSH seront générées.
Nous devons transférer la clé publique sur l’ordinateur local. Utilisez cette commande :
ssh-copy-id dave@sulaco.local
Vous serez invité à entrer le mot de passe du compte utilisateur auquel vous vous connectez, dans ce cas, dave@sulaco.local.
La première fois que vous effectuez une demande de connexion entre l’ordinateur distant et l’ordinateur local, vous devrez fournir la phrase de passe. Vous n’aurez plus besoin de la saisir pour les futures demandes de connexion, tant que cette fenêtre de terminal reste ouverte.
Tous les tunnels ne sont pas effrayants
Certains tunnels peuvent être sombres et sinueux, mais le tunnel SSH inversé n’est pas si difficile à appréhender si vous arrivez à visualiser la relation entre l’ordinateur distant et l’ordinateur local. Puis, inversez le tout.