77 votes

Comment changer les paramètres DNS pour WSL2?

Autant que j'ai 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 vrai noyau Linux dans une machine virtuelle légère sur Windows 10.)

Cependant, ce processus ne fonctionne pas pour moi - j'obtiens un système qui se contente de mettre fin au délai d'attente 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ésactiver 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

[network]
generateResolvConf = false

(Apparemment, il y a un bug dans la version actuelle où tout espace de fin sur ces lignes perturbera les choses.)

2. Redémarrer la machine virtuelle WSL2

Quittez toutes vos invites de commandes Linux et exécutez la commande Powershell suivante

wsl --shutdown

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

Ouvrez une nouvelle invite de commandes Linux et cd vers /etc

Si resolv.conf est lié symboliquement à un autre fichier, supprimez le lien avec

rm resolv.conf

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

nameserver 1.1.1.1

4. Redémarrer la machine virtuelle WSL2

Comme à l'étape #2

5. Démarrer une nouvelle invite de commandes Linux

Profit !

Mise à jour du 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 :
# [network]
# generateHosts = false
127.0.0.1 localhost
127.0.1.1 [redacted]  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 les hôtes compatibles IPv6
::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 resolvectl status ou 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 a été d'utiliser les serveurs DNS publics bien connus de CloudFlare (1.1.1.1) et de Google (8.8.8.8 et 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 fonctionnait 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, ça a fonctionné pour moi.

0 votes

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

1 votes

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

5voto

Evandro Pomatti Points 111

En ajoutant aux autres réponses ici, vous voulez également définir resolv.conf en mode immuable.

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, je recevais 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 supprimant puis recréant le fichier à partir de zéro. Les deux opérations nécessitent d'être exécutées 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 à votre compte normal la propriété du fichier. Cela peut toujours être modifié avec une simple commande : sudo chown [nom d'utilisateur]:[nom d'utilisateur] /etc/resolv.conf. Si vous mettez simplement votre nom d'utilisateur une fois, root aura également la propriété, ce qui ne pose pas vraiment de problèmes dans 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 mentionné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 supprimez avec la commande sudo rm ci-dessus. Les commandes suivantes créent un vrai fichier

1voto

Zegert Points 1

Réponses très détaillées sur la façon de le changer. Je voulais juste utiliser le réglage 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érez ou modifiez dans ce fichier :

[network]
generateResolvConf = true

Insérez 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'a modifiée quand 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 fini par écrire un script Powershell Admininstrator Prompt pour lancer ma distribution (debian). Notez également que cela lance la distribution par défaut spécifiée par WSL, vous devrez modifier la dernière lignée si ce n'est pas le cas. Recherchez le \\wsl$\[nom de la distribution] si la vôtre n'est pas également appelée Debian, tapez simplement la première partie dans un chemin d'accès de l'Explorateur Windows pour atteindre WSL2, c'est-à-dire dans la barre de titre de l'explorateur entrez \\wsl$\ et cela affichera vos distributions.

Cela va extraire 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 devez donc modifier /etc/wsl.conf pour:

[réseau]
generateResolvConf = false

Donc un super utilisateur a essayé 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'aie jamais vu ce fichier dans aucune documentation, et je ne suis pas sûr que l'édition de mon post était correcte.

Ensuite, lancez PowerShell Admin Prompt et exécutez comme ./debian.ps1 (si c'est ainsi que vous avez nommé le fichier):

# Nom du fichier: debian.ps1
#
# Obtenez le serveur DNS de la machine Windows, sauvegardez dans une variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convertissez l'objet nameserver en une chaîne
$nameserver = Out-String -InputObject $nameserver
# Exécutez Set-Content (sc) pour écrire le fichier resolv.conf dans un emplacement public car il a des fins de ligne formatées en DOS écrites par PowerShell, non lisibles par Linux
sc -Path 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encoding utf8
# Convertissez 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_de_la_distribution] 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 (d'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 mon PC d'entreprise!

0 votes

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

0 votes

Il vous suffit de taper \\wsl$\ dans un menu de l'Explorateur en tant que chemin et de voir comment il est enregistré, il vous mènera à vos distributions. Je l'ai également ajouté à ma réponse ci-dessus pour plus de clarté.

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