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:
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:
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é)
9 Réponses :
Essayez -b 0.0.0.0
C'est ce qui fonctionne sur d'autres OS
Celui-ci a fonctionné pour moi:
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.
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.
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!
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.
installer le serveur ssh sur WSL
Trouvez un client ssh sur Windows
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)
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:
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.
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?
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.
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é!)
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
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.)
En tenant compte des solutions (correctes) ci-dessus, il s'agit d'une version simplifiée à une ligne qui fonctionne pour moi:
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.