Chez moi, j’ai un NAS que j’utilise comme un serveur de production pour mes serveurs docker. Pour faire des tests, j’aime bien utiliser Docker directement sur mon ordinateur personnel en passant par WSL, le truc qui permet d’avoir Linux malgré le fait que l’on soit sous Windows.
Problème
Avec mon NAS, qui est déjà sous Linux, si je veux accéder à un conteneur avec n’importe quel appareil de mon réseau, il suffit de mettre l’ip et le port dans l’URL. 192.168.x.x:mon_port
Sauf qu’avec Windows, en utilisant WSL2, WSL2 créer son propre réseau. C’est un peu comme si chez vous, tous vos appareils sont relier sur le même routeur et que tout va bien, sauf que là vous ajoutez un second routeur sur le quel vous reliez votre serveur. Comme votre serveur est sur un autre routeur, il est sur un autre réseau et c’est tout à fait normal que les autres appareils ne puissent pas communiquer avec.
Mon objectif n’est pas de faire un cours de réseaux, mais j’aime bien expliquer les choses afin que tout le monde puisse comprendre et que ce soit clair.
Solution
Sur l’image précédente, vous pouvez voir que « PC1 » est relier sur le même routeur (Routeur 1) que « PC3 », ils peuvent donc communiquer entre eux directement, sans aucun soucis. (Simple précision, ici je n’ai mis que des ordinateurs relié par câbles, mais avec les téléphones et autres c’est la même logique, c’est juste qu’à la place de passer par des câbles, on utilise le WIFI)
Par contre, « PC2 », bien que d’une certaine manière il est relié aux autres, il est sur un routeur différent. « Routeur 1 » ne peut donc pas lui parler directement, il doit d’abord communiquer avec « Routeur 2 » qui va lui transmettre l’information. Ça me semblait important d’imager la chose.
Maintenant que nous savons ça, nous allons suivre quelques étapes.
Avec cet outil, tu peux facilement switcher d’un terminal à un autre sans te prendre la tête.
Étape 1
On fait cette commande pour récupérer l’IP qu’on a sur WSL2. (Pour connaître l’IP que « Routeur 2 » a donné à « PC 2 » si c’est plus simple pour toi de comprendre)
ip addr | grep eth0
Tu devrais recevoir un truc dans ce genre là :
Ici, seul le contenu de « eth0 » nous intéresse, on peut voir les IP « 172.30.76.170 » et « 172.30.79.255 ».
Ce n’est pas un cours de réseau, mais la deuxième IP n’est pas ce que nous cherchons vu qu’elle finit par « 255 », mon IP sur WSL2 est donc bien « 172.30.76.170 ». Si tu veux faire le test, je suppose que sur ton PC tu faisais « localhost:le_port » pour accéder à ton conteneur. Il te suffit de remplacer « localhost » par l’IP donnée par WSL2, soit pour moi : 172.30.76.170:le_port
Étape 2
Maintenant, il faut exécuter cette commande dans le terminal « Windows PowerShell » en administrateur : /!\ Il faut modifier les valeurs « PORT » et « WSL_IP » par les votres
L’objectif de cette commande, c’est de faire en sorte que lorsque l’on utilise l’IP physique de votre machine (192.168.x.x) et un certain port, ça redirige la demande vers l’IP de votre WSL2, vers le port que vous choisissez. Ce qui donne accès à vos autres appareils aux conteneurs de votre ordinateur.
listenport : C’est le port que vous ouvrez sur votre ordinateur pour faire passer la communication. De manière plus imagée, c’est pour que « Routeur 1 » communique avec « Routeur 2 ».
connectaddress : C’est votre IP WSL2, celle que nous avons vue précédemment.
connectport : C’est le port du conteneur Docker que vous voulez rendre accessible aux autres appareils.
Étape 3 - (optionnelle)
Pour arrêter la redirection du port de votre ordinateur vers le port de WSL2, il faut faire cette commande : /!\ Encore une fois, veuillez à remplacer « PORT » par le port que vous avez utilisez dans le « listenport » de la commande précédente.
Ou pour retirer toutes les redirections sans avoir à préciser de port :
netsh interface portproxy reset
Étape 4
C’est relou, mais maintenant il faut préciser à Windows qu’on autorise d’autres appareils à se connecter (pour ajouter de la sécurité je suppose). Il y a donc deux autres commandes à faire dans le terminal (Windows PowerShell).
Pour autoriser les connexions entrantes, c’est à dire autoriser les appareils externes à se connecter sur notre machine :
Autoriser les connexions sortantes, c’est à dire autoriser votre machine à se connecter à des appareils externes. Par exemple, si vous ne le faites pas, le conteneur n’aura pas accès à internet.
/!\ Ces commandes ajoutent ce qu’on appel des règles de pare-feux. Chaque règle doit avoir son propre nom, qui est définit ici par « name ». Vous n’êtes pas obliger d’appeler la règle « Allow Port 8000 » par exemple, vous pouvez l’appeler « 1234 », ce sera la même chose, mais ce sera plus compliquer de comprendre quelle règle fait quoi. En tout cas, vous devez faire attention et donner des noms différents à chaque fois. /!\ N’oubliez pas de modifier la valeur de « localport » à la fin de la commande.
Étape 5 - (optionnelle)
Pour supprimer les autorisations de connexion entrantes du pare-feux :
netsh advfirewall firewall delete rule name="Allow Port VOTRE_PORT"
Pour supprimer les autorisations de connexion sortantes du pare-feux :
netsh advfirewall firewall delete rule name="Allow Port VOTRE_PORT Out"
Pour voir la liste des règles de votre ordinateur, vous pouvez aller dans les paramètres de Windows, mais cette fois je vous laisse chercher. 😛 Sinon, vous pouvez faire cette commande… :
Dans ce cas, le port 10000 de mon ordinateur est utilisé pour être redirigé vers le port 8400 de mon WSL2. Le port 8400 représente ici le port de mon conteneur Jellyfin, que j’utilise pour faire des tests. Maintenant, si je veux arrêter la redirection :
Tant que vous ne stoppez pas la redirection de port, les appareils de votre réseau peuvent accéder aux conteneurs de votre ordinateur en passant par l’IP physique de votre ordinateur, par exemple : 192.168.1.120:10000
/!\ Pour que tout fonctionne correctement, assurez vous que votre ordinateur et vos appareils soient connecter sur le même réseau. Si vous voulez vous connecter à partir de votre téléphone alors que vous êtes en 4G, ça ne fonctionnera pas.