Derzeit verwende ich Windows 10 und WSL2 mit Ubuntu 20.04 für die Entwicklung. In den meisten Fällen funktioniert das hervorragend, abgesehen von einem Problem. In der Netzwerkschicht zwischen Windows/WSL2 scheint etwas kaputt zu sein. Wenn ich Angular mit „ng serve“ bediene, kann ich von Windows aus nicht darauf zugreifen.
Nur wenn Sie das Terminal in VS Code verwenden und den Browser über den Link in der Terminalausgabe öffnen, öffnet Windows es – es öffnet jedoch nicht „localhost:4200“, sondern 127.0.0.1:„random port“, was von unserem Proxy nicht zugelassen wird, was bedeutet, dass die Angular-Anwendung zwar angezeigt wird, aber nicht verwendet werden kann. Danach ist die Anwendung unter localhost:4201 verfügbar – aber nie, bevor sie von VS Code aus geöffnet wurde. Das bedeutet, dass ich keine anderen Terminals (wie das neue Windows Terminal oder ConEmu) verwenden kann, um die Anwendungen zu starten.
Soweit ich das beurteilen kann, handelt es sich hierbei eher um ein Windows-Problem als um ein Problem mit der Linux-Installation selbst, aber ich habe keine Möglichkeit gefunden, den Windows-Teil von WSL2 neu zu installieren, ohne alle Daten auf der Linux-Installation zu verlieren. Für Hinweise wäre ich dankbar.
Antwort1
Meine Antwort basiert auf dem Artikel Ausführen eines öffentlichen Servers von WSL 2, wobei die Theorie darin besteht, dass Windows einen virtuellen Adapter erstellt, der nicht richtig mit dem Internet-Netzwerkadapter verbunden ist.
Der Artikel wirft folgende Punkte auf:
Stellen Sie in WSL sicher, dass Ihr Server IPv4 verwendet
Wenn Sie eine Firewall in WSL verwenden, lassen Sie den entsprechenden Port (3390) zu.
Leiten Sie in Windows Ihren Port in der Eingabeaufforderung oder Powershell mit Administratorrechten vom öffentlichen IP-Port an den WSL-Port weiter:
netsh interface portproxy add v4tov4 listenport=$PORT listenaddress=0.0.0.0 connectport=$PORT connectaddress=127.0.0.1
Lassen Sie in Windows den Port mithilfe einer neuen eingehenden Regel durch die Windows-Firewall.
Für den Zugriff aus dem Internet richten Sie eine Portweiterleitung für den Port im Router ein.
Ein YouTube-Video, das den Vorgang mit einigen kleinen Unterschieden beschreibt, ist WSL 2 Netzwerk.
Antwort2
Damit dies funktioniert, brauchte ich drei Dinge:
- Aktualisieren Sie auf die neueste Windows-Version
wsl --shutdown
- Einstellungen > Netzwerk & Internet > Netzwerk zurücksetzen alshier beschrieben
Antwort3
Ich bin auch auf dieses Problem gestoßen. Das hier ist meine Lösung:WSL2-PortForward.cmd
Es kümmert sich für Sie um die Port-Proxy- und Firewall-Regeln und räumt hinterher auf.
@ECHO OFF
SET LXDISTRO=MyWSL2vm & SET WSL2PORT=3399 & SET HOSTPORT=3398
NETSH INTERFACE PORTPROXY RESET & NETSH AdvFirewall Firewall delete rule name="%LXDISTRO% Port Forward" > NUL
WSL -d %LXDISTRO% -- ip addr show eth0 ^| grep -oP '(?^<=inet\s)\d+(\.\d+){3}' > IP.TMP
SET /p IP=<IP.TMP
NETSH INTERFACE PORTPROXY ADD v4tov4 listenport=%HOSTPORT% listenaddress=0.0.0.0 connectport=%WSL2PORT% connectaddress=%IP%
NETSH AdvFirewall Firewall add rule name="%LXDISTRO% Port Forward" dir=in action=allow protocol=TCP localport=%HOSTPORT% > NUL
ECHO WSL2 Virtual Machine %IP%:%WSL2PORT%now accepting traffic on %COMPUTERNAME%:%HOSTPORT%
Führen Sie den Befehl aus:
.\WSL2-PortForward.cmd
Ergebnis:
WSL2 Virtual Machine 172.17.109.95:3399 now accepting traffic on MYCOMPUTER:3398
Antwort4
Folgendes hat mein Problem gelöst:
Öffnen Sie den Hyper-V-Manager als Administrator
Wählen Sie Ihren PC aus und öffnen Sie den Virtual Switch Manager
WSL auswählen
Auf externes Netzwerk einstellen
Wählen Sie die Netzwerkkarte aus, über die der Datenverkehr läuft
Melden Sie sich dann beim WSL2-Terminal an und konfigurieren Sie eine IP-Adresse. Beispiel:
sudo ip addr flush dev eth0
sudo dhclient eth0
Hier habe ich es gefunden:https://stackoverflow.com/a/62438375/10853017