Freigeben über


Zugreifen auf Netzwerkanwendungen mit WSL

Beachten Sie beim Arbeiten mit Netzwerk-Apps und WSL einige Überlegungen. WSL verwendet standardmäßig eine NAT-basierte Architektur, und wir empfehlen, den neuen Gespiegelten Netzwerkmodus zu testen, um die neuesten Features und Verbesserungen zu erhalten.

Identifizieren der IP-Adresse

Es gibt zwei Szenarien, die beim Identifizieren der IP-Adresse zu berücksichtigen sind, die für eine Linux-Distribution verwendet wird, die über WSL ausgeführt wird.

Szenario 1: Aus Sicht des Windows-Hosts möchten Sie die IP-Adresse einer Linux-Verteilung abfragen, die über WSL2 ausgeführt wird, damit ein Programm auf Windows-Host eine Verbindung mit einem Serverprogramm herstellen kann, das innerhalb der Verteilung (Instanz) ausgeführt wird.

Der Windows-Host kann Befehl verwenden:

wsl -d <DistributionName> hostname -I

Wenn Sie die Standardverteilung abfragen, kann dieser Teil des Befehls, der die Verteilung angibt, weggelassen werden: -d <DistributionName>. Achten Sie darauf, dass Sie eine Großbuchstaben--I verwenden und nicht ein Kleinbuchstaben--i.

Im Hintergrund startet der Hostbefehl wsl.exe die Zielinstanz und führt den Linux-Befehl hostname -I (kurzform für --all-ip-addresses) aus. Mit diesem Befehl wird dann die IP-Adresse der WSL-Instanz in STDOUTgedruckt. Der STDOUT Textinhalt wird dann zurück an wsl.exeweitergeleitet. Schließlich zeigt wsl.exe diese Ausgabe an der Befehlszeile an.

Eine typische Ausgabe könnte folgendermaßen aussehen:

172.30.98.229

Szenario 2: Ein Programm, das in einer Linux-Verteilung über WSL2 (Instanz) ausgeführt wird, möchte die IP-Adresse des Windows-Hosts kennen, damit ein Linux-Programm eine Verbindung mit einem Windows-Hostserverprogramm herstellen kann.

Der WSL2 Linux-Benutzer kann Befehl verwenden:

ip route show | grep -i default | awk '{ print $3}'

Eine typische Ausgabe könnte folgendermaßen aussehen:

172.30.96.1

Daher ist die 172.30.96.1 die Host-IP-Adresse für Windows in diesem Beispiel.

Anmerkung

Diese oben genannten IP-Adressabfrageaktionen sind in der Regel erforderlich, wenn WSL2 mit dem standardmäßigen NAT-Netzwerkmodusausgeführt wird. Wenn WSL2 mit dem neuen gespiegelten Modusausgeführt wird, kann der Windows-Host und die WSL2-VM mithilfe von localhost (127.0.0.1) als Zieladresse eine Verbindung herstellen, sodass der Trick bei der Verwendung der IP-Adresse eines Abfragespeers nicht erforderlich ist.

Standardnetzwerkmodus: NAT

WSL verwendet standardmäßig eine NAT-basierte Architektur (Network Address Translation) für Netzwerke. Beachten Sie beim Arbeiten mit einer NAT-basierten Netzwerkarchitektur die folgenden Überlegungen:

Zugreifen auf Linux-Netzwerk-Apps von Windows (localhost)

Wenn Sie eine Netzwerk-App (z. B. eine App, die auf einem NodeJS- oder SQL-Server ausgeführt wird) in Ihrer Linux-Verteilung erstellen, können Sie über eine Windows-App (z. B. Ihren Edge- oder Chrome-Internetbrowser) über localhost (genau wie gewohnt) darauf zugreifen.

Zugreifen auf Windows-Netzwerk-Apps von Linux (Host-IP)

Wenn Sie über Ihre Linux-Verteilung (dh Ubuntu) auf eine Netzwerk-App zugreifen möchten, die unter Windows ausgeführt wird (z. B. eine App, die auf einem NodeJS oder SQL-Server ausgeführt wird), müssen Sie die IP-Adresse Ihres Hostcomputers verwenden. Obwohl dies kein gängiges Szenario ist, können Sie die folgenden Schritte ausführen, um dies zu erreichen.

  1. Rufen Sie die IP-Adresse Ihres Hostcomputers ab, indem Sie diesen Befehl aus Ihrer Linux-Verteilung ausführen:
ip route show | grep -i default | awk '{ print $3}'
  1. Stellen Sie mithilfe der kopierten IP-Adresse eine Verbindung mit einem beliebigen Windows-Server her.

Die folgende Abbildung zeigt ein Beispiel dafür, indem eine Verbindung mit einem Node.js Server hergestellt wird, der in Windows über curl ausgeführt wird.

Herstellen einer Verbindung mit dem NodeJS-Server in Windows über Curl

Herstellen einer Verbindung über Remote-IP-Adressen

Wenn Sie Remote-IP-Adressen zum Herstellen einer Verbindung mit Ihren Anwendungen verwenden, werden sie als Verbindungen vom Lokalen Netzwerk (Local Area Network, LAN) behandelt. Dies bedeutet, dass Sie sicherstellen müssen, dass Ihre Anwendung LAN-Verbindungen akzeptieren kann.

Beispielsweise müssen Sie ihre Anwendung möglicherweise an 0.0.0.0 statt an 127.0.0.1binden. Im Beispiel einer Python-App mit Flask kann dies mit dem Befehl "app.run(host='0.0.0.0')" erfolgen. Bedenken Sie die Sicherheit, wenn Sie diese Änderungen vornehmen, da dadurch Verbindungen von Ihrem LAN zugelassen werden.

Zugreifen auf eine WSL 2-Verteilung über Ihr lokales Netzwerk (LAN)

Wenn Sie eine WSL 1-Verteilung verwenden, wenn Ihr Computer für den Zugriff über Ihr LAN eingerichtet wurde, können auch anwendungen, die in WSL ausgeführt werden, auf Ihr LAN zugreifen.

Dies ist nicht der Standardfall in WSL 2. WSL 2 verfügt über einen virtualisierten Ethernet-Adapter mit eigener eindeutiger IP-Adresse. Um diesen Workflow zu aktivieren, müssen Sie die gleichen Schritte ausführen wie für einen normalen virtuellen Computer. (Wir untersuchen Möglichkeiten, diese Erfahrung zu verbessern.)

Hier ein Beispiel für die Verwendung des Windows-Befehls Netsh interface portproxy, um einen Portproxy hinzuzufügen, der am Hostport lauscht und diesen Portproxy mit der IP-Adresse des virtuellen WSL 2-Computers verbindet.

netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)

In diesem Beispiel müssen Sie <yourPortToForward> auf eine Portnummer aktualisieren, z. B. listenport=4000. listenaddress=0.0.0.0 bedeutet, dass eingehende Anforderungen von JEDER IP-Adresse akzeptiert werden. Die Listenadresse gibt die IPv4-Adresse an, die vom Listener überwacht werden soll, und kann in folgende Werte geändert werden: IP-Adresse, NetBIOS-Computername oder DNS-Name des Computers. Wenn keine Adresse angegeben ist, ist die Standardeinstellung der lokale Computer. Sie müssen den <yourPortToConnectToInWSL> Wert auf eine Portnummer aktualisieren, bei der WSL eine Verbindung herstellen soll, z. B. connectport=4000. Schließlich muss der connectaddress Wert die IP-Adresse Ihrer Linux-Verteilung sein, die über WSL 2 (die WSL 2-VM-Adresse) installiert ist, die durch Eingabe des Befehls gefunden werden kann: wsl.exe hostname -I.

Dieser Befehl kann also etwa wie folgt aussehen:

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

Um die IP-Adresse zu erhalten, verwenden Sie Folgendes:

  • wsl hostname -I für die IP-Adresse Ihrer Linux-Distribution, die über WSL 2 installiert wurde (also die Adresse der WSL 2-VM)
  • cat /etc/resolv.conf für die IP-Adresse des Windows-Computers aus Sicht von WSL 2 (die WSL 2-VM)

Bei Verwendung von listenaddress=0.0.0.0 wird an allen IPv4-Ports gelauscht.

Anmerkung

Die Verwendung eines Kleinbuchstabens "i" mit dem Hostnamenbefehl generiert ein anderes Ergebnis als die Verwendung eines Großbuchstabens "I". wsl hostname -i ist Ihr lokaler Computer (127.0.1.1 ist eine Platzhalterdiagnoseadresse), während wsl hostname -I die IP-Adresse Ihres lokalen Computers, wie sie von anderen Computern erkannt wird, zurückgibt und verwendet werden sollte, um die connectaddress Ihrer Linux-Distribution zu identifizieren, die über WSL 2 ausgeführt wird.

IPv6-Zugriff

  • wsl hostname -i für die IP-Adresse Ihrer Linux-Distribution, die über WSL 2 installiert wurde (also die Adresse der WSL 2-VM)
  • ip route show | grep -i default | awk '{ print $3}' für die IP-Adresse des Windows-Computers aus Sicht von WSL 2 (die WSL 2-VM)

Bei Verwendung von listenaddress=0.0.0.0 wird an allen IPv4-Ports gelauscht.

Netzwerk im gespiegelten Modus

Auf Rechnern mit Windows 11 22H2 und höher können Sie networkingMode=mirrored unter [wsl2] in der Datei .wslconfig festlegen, um den gespiegelten Netzwerkmodus zu aktivieren. Die Aktivierung dieser Änderungen ändert WSL in eine völlig neue Netzwerkarchitektur, die das Ziel hat, die Netzwerkschnittstellen, die Sie unter Windows in Linux haben, zu "spiegeln", neue Netzwerkfeatures hinzuzufügen und die Kompatibilität zu verbessern.

Hier sind die aktuellen Vorteile für die Aktivierung dieses Modus:

  • IPv6-Unterstützung
  • Stellen Sie über die localhost-Adresse 127.0.0.1eine Verbindung mit Windows-Servern aus Linux her. Die IPv6 localhost-Adresse ::1 wird nicht unterstützt
  • Verbesserte Netzwerkkompatibilität für VPNs
  • Multicastunterstützung
  • Stellen Sie eine direkte Verbindung mit WSL über Ihr lokales Netzwerk (LAN) her.

Anmerkung

Führen Sie den folgenden Befehl mit Administratorrechten im PowerShell-Fenster aus, um Hyper-V-Firewalleinstellungen so zu konfigurieren, dass eingehende Verbindungen zugelassen werden: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow oder New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80.

Dieser neue Modus behebt Netzwerkprobleme, die bei verwendung einer NAT-basierten Architektur (Network Address Translation) auftreten. Finden Sie bekannte Probleme oder geben Sie Feedback zu Fehlern, die im WSL-Produkt-Repository auf GitHubidentifiziert wurden.

DNS-Tunneling

Auf Rechnern mit Windows 11 22H2 und höher bewirkt die Festlegung von dnsTunneling=true unter [wsl2] in der Datei .wslconfig, dass WSL eine Virtualisierungsfunktion verwendet, um DNS-Anforderungen von WSL aus zu beantworten, anstatt sie über ein Netzwerkpaket anzufordern. Dieses Feature zielt darauf ab, die Kompatibilität mit VPNs und anderen komplexen Netzwerksetups zu verbessern.

Autoproxy

Auf Computern unter Windows 11 22H2 und höher erzwingt das Festlegen von autoProxy=true unter [wsl2] in der datei .wslconfig die Verwendung der HTTP-Proxyinformationen von Windows durch WSL. Wenn Sie bereits in Windows einen Proxy eingerichtet haben, wird durch aktivieren dieses Feature auch dieser Proxy automatisch in WSL festgelegt.

WSL und Firewall

Auf Computern, auf denen Windows 11 22H2 und höher ausgeführt wird, mit WSL 2.0.9 und höher wird das Hyper-V Firewallfeature standardmäßig aktiviert. Dadurch wird Folgendes sichergestellt: