18
votes

Connexion au serveur WSL2 via le réseau local

Je développe une application de rails en utilisant WSL2 / Ubuntu sur ma machine Windows 10, ce qui est génial! Le problème est que je ne peux pas me connecter à mon serveur à partir d'un autre ordinateur du même réseau .

Pour plus de clarté, j'utilise un serveur Puma sur localhost: 3000

J'ai essayé ce qui suit:

  1. Connexion directe à l'adresse IP attribuée à l'adaptateur Ethernet vEthernet (WSL) -> 172.26.208.1:3000
  2. Connexion directe à l'adresse IPv4 de la machine hôte -> 192.168.0.115
  3. Ajouter une exception de pare-feu (avec Bitdefender)
  4. Liaison des IP au-dessus des rails s -b 172.26.208.1 -p 3000

Aucune des solutions ci-dessus n'a fonctionné jusqu'à présent ... Ce que j'aimerais faire, c'est:

  • Testez le site Web sur un autre ordinateur portable / tablette / téléphone
  • Utiliser VScode depuis un autre ordinateur

Y a-t-il quelque chose qui me manque pour au moins voir le site Web correctement? (et tout commentaire sur la partie VScode serait apprécié)


0 commentaires

9 Réponses :


-4
votes

Essayez -b 0.0.0.0 C'est ce qui fonctionne sur d'autres OS


0 commentaires

10
votes

Option 1: utiliser la redirection de port

Celui-ci a fonctionné pour moi:

  1. Exécutez la redirection de port par un script de xmeng1: https://gist.github.com/xmeng1/aae4b223e9ccc089911ee764928f5486

Les commandes de pare-feu de ce script ne fonctionnaient pas sur mon système. J'ai donc complètement désactivé le pare-feu Windows et utilisé la version dépouillée suivante. (Les utilisateurs finaux utiliseront de toute façon un pare-feu 3D Party, donc ce n'est pas grave).

sudo ip addr flush dev eth0
sudo dhclient eth0

Vous devrez peut-être "apt install net-tools" pour ifconfig dans le script. Il y a aussi une solution avec "ip addr" sur Internet quelque part qui n'a pas besoin d'ifconfig "dans un bon fil de discussion, je n'ai pas de lien pour ici et maintenant.

Caveat

Cela ne fonctionne que pour le trafic TCP. netsh interface portproxy ne prend pas en charge le port pour éviter le trafic UDP.

Option 2: mode pont

Solution: passer du mode NAT au mode Pont

WSL2 est livré par défaut en mode NAT. Là, le système wsl2 a une autre adresse IP dans un autre sous-réseau que l'hôte. Le PC provient de pairs externes uniquement visibles par l'IP de Windows et l'ip / net wsl2 est caché / interne. Donc, tout le trafic devrait être accepté par l'IP de Windows, puis transféré à l'IP wsl2 (redirection de port).

Il existe un autre mode appelé mode pont. En mode pont, votre carte d'interface réseau sera partagée avec le système wsl2, et il obtiendra son propre IP / Net dans wsl2. Donc, en fait, votre carte réseau est partagée avec les deux systèmes (windows / wsl2) et aura deux adresses IP, comme si vous aviez deux systèmes avec chacun leur propre carte réseau. Chose sympa: vous n'aurez jamais de conflits de port lorsque Windows utilise également le même port que votre application wsl2 (comme 111).

Activer le mode pont

Ouvrez Hyper-V Manager en tant qu'administrateur

Sélectionnez votre PC, ouvrez Virtual Switch Manager

Sélectionnez WSL

Définir sur un réseau externe

Sélectionnez la carte réseau que traverse le trafic

Puis connectez-vous au terminal wsl2 et configurez une adresse IP. Par exemple

sudo ip addr add 192.168.0.116/24 dev eth0

Vous devez utiliser une autre adresse IP gratuite (pas votre adresse IP Windows). Si votre réseau dispose d'un serveur DHCP, votre wsl peut en obtenir un en:

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if ($found)
{
  $remoteport = $matches[0];
} else {
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
$ports=@(123,456);

#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";

for ($i = 0; $i -lt $ports.length; $i++)
{
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

#Then so something, e.g.
#bash.exe -c "cd /g-inverter; ./start_docker.sh"

Caveat

Je n'ai pas encore précisé comment faire fonctionner DNS dans ce scénario au cas où vous voudriez toujours pouvoir accéder à Internet (apt, etc.). Il y a de la documentation de MS écrite dans /etc/resolv.conf et peut-être que l'exécution de ce qui y est écrit et l'installation de resolvconf (avant toutes les étapes ci-dessus, car vous n'avez pas Internet une fois que vous avez commencé à faire le pont) pourrait faire l'affaire.


4 commentaires

Mise à jour: Cette approche est devenue fastidieuse et les fils sur Internet s'allongent de plus en plus là où les gens ont du mal avec. Nous avons décidé que WSL2 n'était pas suffisamment mature pour un hébergement de serveur stable et avons finalement décidé d'installer tous les serveurs sur Windows. Les instances de docker WSL2 placent les fichiers dans des dossiers Windows, qui sont ensuite hébergés avec des serveurs Windows. Cela signifiait que nous devions obtenir une licence, installer et maintenir des produits tiers sur chaque PC. Mais nous ne sommes pas assez convaincus que WSL2 soit prêt pour l'industrie. Je suis sûr que cela ira mieux dans quelques années. Nous sommes maintenant stables à 100% à long terme.


Le mode Bridge semble être une bonne solution, mais ma machine exécutant WSL2 n'a pas l'extension Windows Hyper-V activée, et la lecture de la documentation Hyper-V fait craindre que cette fonctionnalité puisse causer des problèmes.


@Roelof Eh bien, l'option 1 ne fonctionne pas en fait: après avoir exécuté le script ci-dessus (exactement comme il a été publié), je ne vois aucune règle supplémentaire au pare-feu Windows et la redirection de port ne fonctionne pas. J'ai également essayé de désactiver complètement le pare-feu Windows - toujours sans effet. Une aide s'il vous plaît? Merci!


«Les scripts de pare-feu ne fonctionnaient pas pour moi, donc j'ai complètement désactivé le pare-feu» est un terrible conseil. Les scripts de pare-feu ont fonctionné pour moi, alors laissez vos pare-feu intacts!



0
votes

Malheureusement, pour moi, il s'agit d'un cas simplifié car mon réseau domestique est défini par mon routeur. Étant donné que mes appareils domestiques ne communiquent pas en utilisant la connexion dos à dos et que mon réseau est protégé par le pare-feu du routeur, je dois respecter la configuration du routeur.

  1. Il existe une liste de DNS - 8.8.8.8, 8.8.4.4, 9.9.9.9 qui soutiennent mon DNS FAI. Cela signifie que resolv.conf doit être conçu. nslookup reflète la configuration correcte.
  2. Il est possible de configurer le relais DHCP sur DHCP externe
  3. Je peux définir et configurer comment les périphériques obtiennent une adresse IP dynamique, y compris le bail statique. Cela suppose que le périphérique utilise la bonne adresse IP DHCP.
  4. Je peux bien sûr configurer la redirection de port pour les périphériques de routeur connus.

0 commentaires

0
votes
  1. installer le serveur ssh sur WSL

  2. Trouvez un client ssh sur Windows

  3. Exécuter sous Windows: (IP de Windows avec 192.168.xx et IP WSL avec 172.28.xx)

    ssh -L 192.168.xx:3000:172.28.xx:3000 someuser@172.28.xx

si cela ne fonctionne pas, essayez d'utiliser un autre port local tel que (192.168.xx: 3001 : 172.28.xx: 3000)


0 commentaires

0
votes

En ce qui concerne le mode pont - Windows empêcherait de modifier le commutateur virtuel WSL (erreur d'accès refusé) lorsqu'une distribution Linux est en cours d'exécution. D'un autre côté, le commutateur WSL est créé au démarrage de la première distribution Linux. J'ai fait comme suit:

  1. Démarré WSL
  2. Quitter le shell wsl et vérifier que toutes les distributions sont arrêtées (wsl -l -v)
  3. Commutateur virtuel WSL modifié
  4. J'ai redémarré WSL

0 commentaires

11
votes

Regardez cette vidéo, cela m'a aidé:

https://www.youtube.com/watch?v=yCK3easuYm4

netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=172.30.16.3

par exemple

netsh interface portproxy add v4tov4 listenport=<port-to-listen> listenaddress=0.0.0.0 connectport=<port-to-forward> connectaddress=<forward-to-this-IP-address>

N'oubliez pas de mettre des commentaires après.


5 commentaires

Merci, cela fonctionne très bien. Pour ceux qui ne veulent pas regarder toute la vidéo, ce doit être exécuté dans une élévation rapide Powershell, pas de WSL, le connectaddress devrait être votre WSL IP, et vous aurez probablement besoin pour permettre le port à travers les fenêtres pare - feu. Note latérale, c'est la même chose que le script dans la réponse du haut, mais c'est bien de voir simplement la commande nécessaire plutôt que le script entier.


Cela ne fonctionne pas pour moi malheureusement. J'essaie de me connecter à mon serveur Web local avec mon iPhone (pour tester la version mobile d'un site Web). Mon code s'exécute dans une machine WSL et ouvre un serveur après le npm start sur le port 1337 . J'ai donc tapé cette netsh interface portproxy add v4tov4 listenport=1337 listenaddress=0.0.0.0 connectport=1337 connectaddress=127.22.240.165 . Je pensais pouvoir essayer sur mon iPhone: 192.168.1.32:1337 mais peut-être ai-je mal compris la procédure .. Une aide?


Pouvez-vous atteindre votre serveur à partir de la machine locale? Cela devrait ressembler à: 127.22.240.165:1337, sinon, c'est votre problème lié à votre application serveur. Si oui, essayez de désactiver le pare-feu, ou peut-être que votre adresse IP wsl est fausse, vérifiez-la. Essayez le mode pont, car cette méthode est destinée à des utilisations temporaires, car l'adresse IP change à chaque fois que vous redémarrez l'hôte.


Oui, je peux accéder à l'application depuis Windows via http://127.22.240.165:1337 . J'ai essayé de désactiver le pare-feu Windows et de tester à nouveau sur le téléphone, mais il ne répond toujours pas. D'un autre côté, la commande netsh ... n'a rien produit; Je m'attendais à ce que cela réveille le pare-feu du premier coup, mais non. Peut-être que le "portproxy" n'a eu aucun effet. Comment puis-je vérifier quels proxys sont configurés sur Powershell?


Je pouvais voir quels proxys étaient configurés en utilisant l' netsh interface portproxy show v4tov4 et ils étaient tous configurés. J'ai également essayé de tous les nettoyer et de les tester à nouveau, et j'ai toujours pu accéder à l'application via http://127.22.240.165:1337 sous Windows (même sans proxy de port), mais je ne peux certainement pas rejoindre mon application depuis mon iPhone 😥 Cela pourrait peut-être provenir de ma box Internet?



2
votes

Faire en sorte que votre distribution WSL2 se comporte comme n'importe quel autre client de votre réseau

Sur la base de la suggestion n ° 2 de Roelofs, voici ce qui a tout fait fonctionner dans mon cas. Je suis trop frais pour laisser un commentaire malheureusement.

Mon point de départ:
Gagnez 10 Pro
Ubuntu sous WSL2
(Docker avec des conteneurs Linux)

Mon but:
Obtenir un flux rtmp d'un client sur le réseau dans et en arrière d'un serveur nginx s'exécutant sur la machine Ubuntu.

Construire le pont

Dans mon cas, je n'ai pas pu obtenir Hyper-V pour configurer le pont correctement. Après avoir sélectionné Réseau externe pour le commutateur WSL dans la section Commutateur virtuel de Hyper-V Manager et avoir appuyé sur Appliquer, il a finalement échoué avec l'erreur 0x80070490. Je ne sais pas pourquoi et je n'ai pas eu le temps d'enquêter. WSL ne fonctionnait pas et le service Docker non plus.

Au lieu de cela, j'ai juste laissé le paramètre sur le réseau interne et j'ai ponté les interfaces de manière manuelle, sous Connexions réseau (run-> ncpa.cpl). Dans mon cas, la connexion WiFi et vEthernet (WSL) . Immédiatement après cela, j'ai perdu la connectivité Internet et il m'a fallu un temps embarrassant pour savoir qu'un redémarrage était nécessaire. (Windows pour une fois ne me l'a pas demandé!)

Mettre la machine virtuelle en forme

Après le redémarrage, j'avais maintenant accès à Internet depuis l'hôte, le pont était réglé sur DHCP et avait hérité de l'IP de l'interface WiFi (192.168.1.246). Génial.

Cependant, la VM obtenait toujours l'adresse IP du commutateur virtuel (ou quelle que soit la manière dont vous souhaitez l'afficher, l'adresse aléatoire 172.xxx que Windows semble attribuer au commutateur ainsi qu'à la VM).

En lançant Ubuntu, j'ai décidé de faire un:

Create a file: /etc/wsl.conf.
Put the following lines in the file

[network]
generateResolvConf = false

In a cmd window, run wsl --shutdown
Restart WSL2
Create a file: /etc/resolv.conf. If it exists, replace existing one with this new file.
Put the following lines in the file

nameserver 8.8.8.8

Or the IP of whatever DNS server you want to use, repeat step 3 and 4.

Poursuivant avec:

sudo ip route add default via 192.168.1.1 dev eth0

m'a jeté une poignée d'erreurs depuis que j'utilisais la distribution Ubuntu vanille de Windows Store, pas de systemd , pas de plaisir. Malgré cela, il a réussi à ajouter l'adresse IP du pont à eth0. Comme ce n'était pas très pratique, je me suis débarrassé de cela avec:

sudo ip addr add 192.168.1.50/24 dev eth0

mais pas avant de jeter un coup d'œil à la table de routage:

user@vm:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Après avoir supprimé l'ancienne adresse IP, j'en ai ajouté une unique en dehors de ma plage DHCP:

sudo ip addr del 192.168.1.248/24 dev eth0

J'ai vérifié à nouveau la table de routage et la première entrée avait disparu. À ce stade, je pourrais cingler LAN mais pas WAN.

Ajout de l'entrée avec:

sudo dhclient eth0

Le ping des adresses IP WAN était désormais possible, mais pas de résolution DNS. LMGTFM: Ajout de DNS permanent Au cas où la solution manquerait, la voici, crédit à non statique :

sudo ip addr flush dev eth0

Donc, pour conclure, vérifiez votre routage et configurez correctement votre DNS-conf. Malheureusement, les paramètres IP sont rétablis chaque fois que vous redémarrez WSL. Si vous n'êtes pas d'accord pour le faire manuellement à chaque fois, il y a des discussions sur la façon de l'automatiser ici et ici . Je n'ai pas eu le temps de trouver mon préféré.

Meilleures salutations Alexander


0 commentaires

1
votes

Voici une solution peut-être plus simple que la plupart des autres qui ont été proposées. Vous avez besoin d'une instance WSL1 avec socat installé en plus de l'instance WSL2 que vous utilisez.

Sur l'instance WSL1, démarrez socat comme ceci:

socat -d TCP-LISTEN:3000,reuseaddr,fork TCP:localhost:3000

Lorsque vous démarrez socat de cette manière, Windows vous demandera si vous souhaitez autoriser l'accès réseau au port. Confirmer.

Assurez-vous que votre puma se lie au port 3000 sur toutes les interfaces.

Vous pourrez désormais accéder à votre serveur de développement à partir du LAN. Ce qui se passe ici, c'est que socat transfère les requêtes vers 3000 sur votre port Ethernet vers le port 3000 sur localhost, qui seront comme par magie transférées par Windows vers WSL2.

(J'utilise actuellement cette configuration exacte pour accéder à mon serveur de développement Django sur WSL2 à partir d'une application iOS sur mon LAN.)


0 commentaires

0
votes

En tenant compte des solutions (correctes) ci-dessus, il s'agit d'une version simplifiée à une ligne qui fonctionne pour moi:

  1. Utilisez "ifconfig" pour trouver votre adresse IP publique wsl2. Gardez à l'esprit que l'adresse IP du commutateur Hyper-V change à chaque fois que Windows redémarre, de sorte que l'adresse IP publique dans wsl2 change également. entrez la description de l'image ici
  1. Exécutez la commande suivante à l'aide de l'adresse IP trouvée à l'étape précédente dans le paramètre connectaddress:

    netsh interface portproxy add v4tov4 listenport= listenaddress=0.0.0.0 connectport= connectaddress=172.24.26.277

Explication des paramètres:

  • listenport : le port que Windows écoutera

  • listenaddress : l'adresse que votre Windows écoutera. Habituellement, 0.0.0.0 devrait faire l'affaire.

  • connectport : le port que votre Linux Distro via wsl2 écoutera.

  • connectaddress : l'adresse IP publique de votre instance Linux wsl2 (trouvée à l'étape 1)

Utilisez cmd ou PowerShell en tant qu'administrateur pour exécuter la commande ci-dessus.


0 commentaires