77 votes

Comment changer les paramètres DNS pour WSL2?

Autant que j'aie pu le comprendre, le processus officiel pour changer le serveur DNS utilisé par WSL2 sur Windows 10 est détaillé ci-dessous. (WSL2 est la nouvelle version du sous-système Windows pour Linux, qui exécute un véritable noyau Linux dans une machine virtuelle légère sur Windows 10.)

Cependant, ce processus ne fonctionne pas pour moi - je me retrouve avec un système qui se contente de dépasser le temps imparti et ne peut résoudre aucune adresse.

Qu'est-ce que je fais de mal?

Voici le processus tel que je l'ai reconstitué jusqu'à présent:

1. Désactivez la génération de /etc/resolv.conf

En utilisant votre invite de commandes Linux, (j'utilise Ubuntu), modifiez (ou créez) /etc/wsl.conf avec le contenu suivant

[réseau]
generateResolvConf = false

(Apparemment, il y a un bug dans la version actuelle où tout espace blanc en fin de ligne posera problème.)

2. Redémarrez la machine virtuelle WSL2

Référez tous vos invites de commandes Linux et exécutez la commande Powershell suivante

wsl --shutdown

3. Créez un /etc/resolv.conf personnalisé

Ouvrez une nouvelle invite de commandes Linux et accédez à /etc

Si resolv.conf est lié de manière souple à un autre fichier, supprimez le lien avec

rm resolv.conf

Créez un nouveau resolv.conf avec le contenu suivant

servers DNS 1.1.1.1

4. Redémarrez la machine virtuelle WSL2

Comme à l'étape #2

5. Démarrez une nouvelle invite de commandes Linux

Profit!

Mise à jour le 18 mars 2020

Mon fichier /etc/hosts contient ceci:

# Ce fichier a été généré automatiquement par WSL. Pour arrêter la génération automatique de ce fichier, ajoutez l'entrée suivante à /etc/wsl.conf:
# [réseau]
# generateHosts = false
127.0.0.1 localhost
127.0.1.1 [censuré]  bearps-desktop

10.168.244.140  host.docker.internal
10.168.244.140  gateway.docker.internal
127.0.0.1       kubernetes.docker.internal

# Les lignes suivantes sont souhaitables pour des machines hôtes IPv6 capables
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Le fichier /etc/switch.conf n'existe pas.

L'outil resolvectl n'est pas sur mon chemin; il n'existe pas à /usr/bin/resolvectl.

De même, systemd-resolve n'est pas sur mon chemin; il n'existe pas à /usr/bin/systemd-resolve.

0 votes

Par curiosité, quels sont les contenus de /etc/host, /etc/switch.conf et les résultats de soit resolvectl status soit systemd-resolve status?

0 votes

Cela fonctionne parfaitement sur Fedora 35 sur WSL2 sur Windows 11.

35voto

MikeyB Points 38317

Le processus que j'ai documenté ci-dessus est correct - c'est ainsi que vous modifiez les paramètres DNS sous WSL2.

Mon erreur était d'utiliser les serveurs DNS publics bien connus de CloudFlare (1.1.1.1) et Google (8.8.8.8 & 8.8.4.4) à des fins de test. Il s'avère que mon réseau local m'empêche d'utiliser des DNS publics.

Lorsque j'ai testé le processus ci-dessus avec la bonne adresse IP du serveur DNS interne, tout a fonctionné correctement.

0 votes

Merci pour ces étapes (dans la question), c'était bon de voir comment tout cela fonctionne ensemble. Mon problème s'est finalement révélé être l'absence de paramètres DNS dans mon adaptateur réseau créé par WSL. Une fois que je les ai mis à une valeur acceptable, cela a fonctionné pour moi.

0 votes

Mise à jour: Il semble que WSL2 réinitialise mes paramètres DNS à vide après un redémarrage.

1 votes

Une correction mineure - vous n'avez pas besoin de redémarrer pour que les modifications apportées à /etc/resolv.conf prennent effet.

5voto

Evandro Pomatti Points 111

Ajoutant à d'autres réponses ici, vous voulez aussi définirresolv.conf immutable.

sudo chattr +i /etc/resolv.conf

Dans mon cas, il était supprimé à chaque démarrage, même avec wsl.conf.

Pour cette raison, j'ai créé ce petit programme qui automatise tout avec un seul shell :

https://github.com/epomatti/wsl2-dns-fix-config

2voto

Nino van der Mark Points 121

Lors de la création / modification de /etc/resolv.conf j'obtenais des erreurs comme celle-ci:

cat: /etc/resolv.conf: Aucun fichier ou dossier de ce type

J'ai pu résoudre ces problèmes en le supprimant et en le recréant à partir de zéro. Les deux opérations nécessitent de s'exécuter en tant que root (utiliser sudo n'a pas fonctionné pour moi)

rm /etc/resolv.conf
echo nameserver 8.8.8.8 > /etc/resolv.conf

0 votes

Il semble que vous étiez connecté à votre compte normal, vous avez probablement besoin d'utiliser sudo. Lorsque vous avez créé le fichier sous votre compte utilisateur, il donne automatiquement la propriété du fichier à votre compte normal. Cela peut toujours être modifié avec un simple : sudo chown [nom d'utilisateur]:[nom d'utilisateur] /etc/resolv.conf. Si vous ne mettez votre nom d'utilisateur qu'une fois, root aura également la propriété, ce qui ne pose pas vraiment de problème à mon expérience. Au fait, cela fonctionne sur un PC personnel, mais derrière un pare-feu d'entreprise, j'ai dû utiliser ma solution publiée ci-dessus....

0 votes

Dans mon expérience, le problème est que lorsque vous demandez à WSL2 de ne pas générer /etc/resolv.conf, après le redémarrage, vous trouvez un /etc/resolv.conf qui n'est plus un fichier, mais un lien vers /run/resolvconf/resolv.conf, que vous éliminez avec la commande sudo rm ci-dessus. Les commandes ultérieures créent un vrai fichier

1voto

Zegert Points 1

Réponses très détaillées sur la façon de le modifier. Je voulais juste utiliser le paramètre par défaut et continuer. J'ai suivi quelques guides comme la première réponse, ça n'a pas fonctionné pour moi. J'ai seulement changé /etc/wsl.conf et ça fonctionne à nouveau.

sudo nano /etc/wsl.conf

Insérer ou modifier dans ce fichier :

[network]
generateResolvConf = true

Insérer dans Powershell/CMD :

wsl --shutdown

ou :

wsl --terminate <>

Fait et terminé. Faites-moi savoir si cela a fonctionné pour vous.

Ma configuration était perturbée parce que Tailscale l'avait modifiée lorsque je l'ai démarrée. Maintenant, ça fonctionne à nouveau.

0voto

Matt Points 101

J'ai dû faire cela depuis chez moi (coronavirus) et j'ai finalement écrit un script Powershell pour lancer mon distro (debian) en mode administrateur. Notez également que cela lance le distro par défaut spécifié par WSL, vous devrez changer la dernière ligne si ce n'est pas le cas. Cherchez le \\wsl$\[nom du distro] si le vôtre n'est pas appelé Debian, tapez simplement la première partie dans un chemin Windows Explorer pour atteindre WSL2, c'est-à-dire dans la barre d'exploration supérieure entrez \\wsl$\ et vos distributions seront listées.

Cela va récupérer le serveur DNS de l'hôte Windows, créer un nouveau resolv.conf, et l'écrire au format Unix dans l'instance WSL2. Vous avez donc besoin d'éditer /etc/wsl.conf pour :

[network]
generateResolvConf = false

Donc, un super utilisateur a tenté de changer cela en resolv.config; si ce fichier existe parce que vous utilisez une distribution Linux différente, alors je suppose que c'est le fichier que vous voulez à la place. Modifiez en conséquence. Bien que je n'ai jamais vu ce fichier dans aucune documentation, et je ne suis pas sûr que la modification de mon post était correcte.

Ensuite, lancez PowerShell en mode Administrateur et exécutez comme ./debian.ps1 (si c'est le nom du fichier) :

# Nom du fichier: debian.ps1
# 
# Obtenez le serveur DNS de la machine Windows, enregistrez-le dans une variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convertir l'objet nameserver en une chaîne
$nameserver = Out-String -InputObject $nameserver
# Exécutez Set-Contents (sc) pour écrire le fichier resolv.conf dans un emplacement public car il a des fins de lignes formatées en DOS écrites par PowerShell, non lisibles par Linux
sc -Chemin 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encodage utf8
# Convertir le fichier formaté en DOS en format UNIX pour WSL2 et écrivez-le à l'endroit approprié (\etc\resolv.conf, son emplacement principal est \\wsl$\[nom_distro] depuis Windows)
[string]::Join( "`n", (gc 'c:\Users\Public\Documents\resolv.conf')) | sc '\\wsl$\debian\etc\resolv.conf'
# Lancez la distribution WSL2 par défaut - si vous voulez en utiliser une autre, spécifiez-la dans la ligne ci-dessous
wsl.exe

Cela a été testé sous Debian Buster et un VPN Zscaler (entreprise). C'est un bon point de départ, j'espère que cela épargnera à quelqu'un les maux de tête que j'ai rencontrés pour accéder au DNS sur l'instance WSL2 de mes PC d'entreprise!

0 votes

\\wsl$\[nom de distro] n'existe pas pour moi :/

0 votes

Il suffit de taper \\wsl$ dans un menu Explorer en tant que chemin et de voir ce qu'il est enregistré en tant que tel, cela vous amènera à vos distributions. Je l'ai également ajouté à ma réponse ci-dessus pour être plus clair.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X