Accès aux applications réseau avec WSL
Il existe quelques considérations à prendre en compte lors de l’utilisation d’applications réseau et WSL. Par défaut, WSL utilise une architecture basée sur NAT et nous vous recommandons d’essayer le nouveau mode réseau mis en miroir pour obtenir les dernières fonctionnalités et améliorations.
Il existe deux scénarios à prendre en compte lors de l’identification de l’adresse IP utilisée pour une distribution Linux exécutée via WSL :
Scénario 1 : du point de vue de l’hôte Windows, vous souhaitez interroger l’adresse IP d’une distribution Linux exécutée via WSL2, afin qu’un programme sur l’hôte Windows puisse se connecter à un programme serveur s’exécutant à l’intérieur de la distribution (instance).
L’hôte Windows peut utiliser la commande suivante :
wsl -d <DistributionName> hostname -I
Si vous interrogez la distribution par défaut, cette partie de la commande désignant la distribution peut être omise : -d <DistributionName>
. Veillez à utiliser un indicateur -I
en majuscules et non pas un -i
en minuscules.
Sous le capot, la commande hôte wsl.exe
lance l’instance cible et exécute la commande Linux hostname -I
. Cette commande affiche ensuite l’adresse IP de l’instance WSL sur STDOUT
. Le contenu de texte STDOUT
est ensuite relayé à wsl.exe. Enfin, wsl.exe affiche cette sortie sur la ligne de commande.
Un résultat classique peut être :
172.30.98.229
Scénario 2 : un programme s’exécutant à l’intérieur d’une distribution Linux via WSL2 (instance) souhaite connaître l’adresse IP de l’hôte Windows, afin qu’un programme Linux puisse se connecter à un programme de serveur hôte Windows.
L’utilisateur Linux WSL2 peut utiliser la commande suivante :
ip route show | grep -i default | awk '{ print $3}'
Un résultat classique peut être :
172.30.96.1
Par conséquent, le 172.30.96.1
est l’adresse IP de l’hôte pour Windows, dans cet exemple.
Notes
Ces actions d’interrogation d’adresses IP ci-dessus sont généralement requises lorsque WSL2 est en cours d’exécution avec le mode réseau NAT par défaut.
Lorsque WSL2 s’exécute avec le nouveau mode mis en miroir, l’hôte Windows et la machine virtuelle WSL2 peuvent se connecter les uns aux autres à l’aide de localhost
(127.0.0.1) en tant qu’adresse de destination, ainsi, il n’est pas nécessaire de se servir de l’astuce de l’adresse IP d’un homologue de requête.
Par défaut, WSL utilise une architecture NAT (traduction d'adresses réseau) pour la mise en réseau. Gardez à l’esprit les considérations suivantes lors de l’utilisation d’une architecture réseau basée sur NAT :
Si vous créez une application réseau (par exemple, une application qui s’exécute sur un serveur SQL ou NodeJS) dans votre distribution Linux, vous pouvez y accéder à partir d’une application Windows (comme votre navigateur Internet Edge ou Chrome) à l’aide de localhost
(comme vous le feriez normalement).
Si vous souhaitez accéder à une application réseau qui s’exécute sur Windows (par exemple, une application s’exécutant sur un serveur SQL ou NodeJS) à partir de votre distribution Linux (p. ex. Ubuntu), vous devez utiliser l’adresse IP de votre ordinateur hôte. Il ne s’agit pas d’un scénario courant, mais vous pouvez suivre ces étapes pour le faire fonctionner.
- Obtenez l’adresse IP de votre ordinateur hôte en exécutant cette commande à partir de votre distribution Linux :
ip route show | grep -i default | awk '{ print $3}'
- Connectez-vous à n’importe quel serveur Windows à l’aide de l’adresse IP copiée.
L’image ci-dessous présente un exemple de cela avec la connexion à un serveur Node.js en cours d’exécution dans Windows via curl.
Lorsque vous utilisez des adresses IP distantes pour vous connecter à vos applications, celles-ci sont traitées comme des connexions à partir du réseau local (LAN). Cela signifie que vous devez vous assurer que votre application peut accepter les connexions LAN.
Par exemple, vous devrez peut-être lier votre application à 0.0.0.0
au lieu de 127.0.0.1
. Dans l’exemple d’une application Python utilisant Flask, vous pouvez procéder à l’aide de la commande : app.run(host='0.0.0.0')
. Gardez à l’esprit la sécurité lorsque vous apportez ces changements, car cela permettra d’établir des connexions à partir de votre réseau local.
Lorsque vous utilisez une distribution WSL 1, si votre ordinateur était configuré pour être accessible via votre réseau local, les applications qui s’exécutent dans WSL sont également accessibles sur votre réseau local.
Ce n’est pas le cas par défaut dans WSL 2. WSL 2 a une carte Ethernet virtualisée avec sa propre adresse IP unique. Actuellement, pour activer ce flux de travail, vous devez suivre les mêmes étapes que pour une machine virtuelle standard. (Nous recherchons des moyens d’améliorer cette expérience.)
Voici un exemple d’utilisation de la commande Windows Netsh interface portproxy pour ajouter un proxy de port qui écoute votre port hôte et connecte ce proxy de port à l’adresse IP de la machine virtuelle WSL 2.
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
Dans cet exemple, vous devez mettre à jour <yourPortToForward>
sur un numéro de port, par exemple listenport=4000
. listenaddress=0.0.0.0
signifie que les demandes entrantes sont acceptées à partir de n’importe quelle adresse IP. L’adresse d’écoute spécifie l’adresse IPv4 à écouter et peut être modifiée sur des valeurs qui incluent : adresse IP, nom NetBIOS de l’ordinateur ou nom DNS de l’ordinateur. Si aucune adresse n’est spécifiée, la valeur par défaut est l’ordinateur local. Vous devez mettre à jour la valeur <yourPortToConnectToInWSL>
sur un numéro de port où vous souhaitez que WSL se connecte, par exemple connectport=4000
. Enfin, la valeur connectaddress
doit être l’adresse IP de votre distribution Linux installée par le biais de WSL 2 (adresse de la machine virtuelle WSL 2), que vous pouvez trouver en entrant la commande suivante : wsl.exe hostname -I
.
Cette commande peut donc ressembler à ceci :
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
Pour obtenir l’adresse IP, utilisez :
wsl hostname -I
pour l’adresse IP de votre distribution Linux installée via WSL 2 (l’adresse de machine virtuelle WSL 2)cat /etc/resolv.conf
pour l’adresse IP de la machine Windows telle que vue à partir de WSL 2 (la machine virtuelle WSL 2)
L’utilisation de listenaddress=0.0.0.0
écoutera sur tous les ports IPv4.
Notes
L’utilisation d’une minuscule « i » avec la commande de nom d’hôte génère un résultat différent de celui avec une majuscule « I ». wsl hostname -i
est votre ordinateur local (127.0.1.1 est une adresse de diagnostic d’espace réservé), tandis que wsl hostname -I
retourne l’adresse IP de votre ordinateur local comme vu par d’autres ordinateurs et doit être utilisé pour identifier le connectaddress
de votre distribution linux exécutée via WSL 2.
wsl hostname -i
pour l’adresse IP de votre distribution Linux installée via WSL 2 (l’adresse de machine virtuelle WSL 2)ip route show | grep -i default | awk '{ print $3}'
pour l’adresse IP de la machine Windows telle que vue à partir de WSL 2 (la machine virtuelle WSL 2)
L’utilisation de listenaddress=0.0.0.0
écoutera sur tous les ports IPv4.
Sur les machines exécutant Windows 11 22H2 et versions ultérieures, vous pouvez définir networkingMode=mirrored
sous [wsl2]
dans le fichier .wslconfig
pour activer la mise en réseau en mode miroir. Cette activation modifie WSL vers une architecture réseau entièrement nouvelle qui a pour objectif la « mise en miroir » des interfaces réseau que vous avez sur Windows dans linux, pour ajouter de nouvelles fonctionnalités de mise en réseau et améliorer la compatibilité.
Activer ce mode présente les avantages actuels suivants :
- Compatible avec IPv6
- Se connecter aux serveurs Windows à partir de Linux en utilisant l’adresse localhost
127.0.0.1
. L’adresse localhost IPv6::1
n’est pas prise en charge - Compatibilité réseau améliorée pour les VPN
- Prise en charge de la multidiffusion
- Connexion à WSL directement à partir de votre réseau local (LAN)
Notes
Exécutez la commande suivante dans la fenêtre PowerShell avec des privilèges d’administrateur pour configurer les paramètres de pare-feu Hyper-V pour autoriser les connexions entrantes : Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
ou New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
.
Ce nouveau mode résout les problèmes réseau rencontrés avec l’utilisation d’une architecture NAT (traduction d'adresses réseau). Recherchez des problèmes connus ou des commentaires sur les bogues identifiés dans le référentiel de produit WSL sur GitHub.
Sur les machines exécutant Windows 11 22H2 et versions ultérieures, si vous définissez dnsTunneling=true
sous [wsl2]
dans le fichier .wslconfig
, WSL utilise une fonctionnalité de virtualisation pour répondre aux demandes DNS à partir de WSL au lieu de les demander sur un paquet réseau. Cette fonctionnalité vise à améliorer la compatibilité avec les VPN et d’autres configurations réseau complexes.
Sur les machines exécutant Windows 11 22H2 et versions ultérieures, si vous définissez autoProxy=true
sous [wsl2]
dans le fichier .wslconfig
, WSL doit utiliser les informations de proxy HTTP de Windows. Si vous avez déjà configuré un proxy dans Windows, l’activation de cette fonctionnalité définit automatiquement ce proxy dans WSL.
Sur les ordinateurs exécutant Windows 11 22H2 et versions ultérieures, avec WSL 2.0.9 et versions ultérieures, la fonctionnalité de pare-feu Hyper-V est activée par défaut. Cela garantit que :
- Consultez Pare-feu Windows Defender avec sécurité avancée pour en savoir plus sur les fonctionnalités de sécurité Windows qui s’appliquent automatiquement à WSL.
- Consultez Configurer le pare-feu Hyper-V pour en savoir plus sur l’application de ces règles et paramètres localement et via des outils en ligne comme Intune.
Commentaires sur Windows Subsystem for Linux
Windows Subsystem for Linux est un projet open source. Sélectionnez un lien pour fournir des commentaires :