Wie ändere ich die DNS-Einstellungen für WSL2?

Wie ändere ich die DNS-Einstellungen für WSL2?

Soweit ich es herausfinden konnte, ist der offizielle Prozess zum Ändern des von WSL2 unter Windows 10 verwendeten DNS-Servers wie folgt: (WSL2 ist die neue Version des Windows-Subsystems für Linux, das einen echten Linux-Kernel in einer leichten VM unter Windows 10 ausführt.)

Allerdings funktioniert dieser Vorgang bei mir nicht. Das Ergebnis ist ein System, bei dem einfach eine Zeitüberschreitung auftritt und das überhaupt keine Adressen auflösen kann.

Was mache ich falsch?

Hier ist der Vorgang, wie ich ihn bisher zusammengesetzt habe:

1. Schalten Sie die Erzeugung von/etc/resolv.conf

Ändern (oder erstellen) Sie /etc/wsl.conf mithilfe Ihrer Linux-Eingabeaufforderung (ich verwende Ubuntu) mit dem folgenden Inhalt

[network]
generateResolvConf = false

(Offenbar gibt es in der aktuellen Version einen Fehler, bei dem jedes nachstehende Leerzeichen in diesen Zeilen zu Problemen führt.)

2. Starten Sie die virtuelle WSL2-Maschine neu

Beenden Sie alle Linux-Eingabeaufforderungen und führen Sie den folgenden Powershell-Befehl aus

wsl --shutdown

3. Erstellen Sie eine benutzerdefinierte/etc/resolv.conf

Öffnen Sie eine neue Linux-Eingabeaufforderung und wechseln Sie zu/etc

Wenn resolv.confeine Softverknüpfung zu einer anderen Datei besteht, entfernen Sie die Verknüpfung mit

rm resolv.conf

Erstelle ein neues resolv.confmit folgendem Inhalt

nameserver 1.1.1.1

4. Starten Sie die virtuelle WSL2-Maschine neu

Dasselbe wie Schritt 2

5. Starten Sie eine neue Linux-Eingabeaufforderung.

Profitieren!

Update 18. März 2020

Meine /etc/hostsDatei enthält Folgendes:

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /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

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Die Datei /etc/switch.confexistiert nicht.

Das Werkzeug resolvectlliegt nicht auf meinem Weg, es existiert hier nicht /usr/bin/resolvectl.

Ebenso systemd-resolveliegt es nicht auf meinem Weg, es existiert nicht bei /usr/bin/systemd-resolve.

Antwort1

Der Prozess, den ich oben dokumentiert habe, ist korrekt.Istwie Sie die DNS-Einstellungen unter WSL2 ändern.

Mein Fehler bestand darin, zu Testzwecken die bekannten öffentlichen DNS-Server für CloudFlare (1.1.1.1) und Google (8.8.8.8 & 8.8.4.4) zu verwenden. Es stellte sich heraus, dass mein lokales Netzwerk die Verwendung des öffentlichen DNS blockiert.

Als ich den obigen Vorgang mit der richtigen internen DNS-Server-IP-Adresse getestet habe, hat alles ordnungsgemäß funktioniert.

Antwort2

Ergänzend zu den anderen Antworten hierAuchmöchte unveränderlich festlegen resolv.conf.

sudo chattr +i /etc/resolv.conf

In meinem Fall wurde es bei jedem Booten gelöscht, sogar mit wsl.conf.

Aus diesem Grund habe ich dieses kleine Programm erstellt, das alles mit einer Shell automatisiert:

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

Antwort3

Ich musste dies von zu Hause aus tun (Coronavirus) und habe letztendlich ein Powershell-Administrator-Eingabeaufforderungsskript geschrieben, um meine Distribution (Debian) zu starten. Beachten Sie auch, dass dadurch die von WSL angegebene Standarddistribution gestartet wird. Wenn dies nicht der Fall ist, müssen Sie die letzte Zeile ändern. Suchen Sie danach. \\wsl$\[distro name]Wenn Ihre Distribution nicht auch Debian heißt, geben Sie einfach den ersten Teil in einen Windows Explorer-Pfad ein, um WSL2 zu erreichen. Geben Sie beispielsweise in der oberen Leiste des Explorers „“ ein, \\wsl$\und Ihre Distributionen werden aufgelistet.

Dadurch wird der DNS-Server vom Windows-Host abgerufen, eine neue resolv.conf erstellt und im Unix-Format in die WSL2-Instanz geschrieben. Sie müssen also /etc/wsl.conf wie folgt bearbeiten:

[network]
generateResolvConf = false

Ein Superuser hat also versucht, dies in resolv.config zu ändern. Wenn diese Datei existiert, weil Sie eine andere Linux-Distribution verwenden, dann nehme ich an, dass dies die Datei ist, die Sie stattdessen benötigen. Ändern Sie sie also entsprechend. Allerdings habe ich diese Datei noch nie in einer Dokumentation gesehen und bin mir nicht sicher, ob die Bearbeitung meines Beitrags korrekt war.

Starten Sie dann die PowerShell-Verwaltungsaufforderung und führen Sie Folgendes aus, z. B. ./debian.ps1 (wenn Sie die Datei so benennen):

# Filename: debian.ps1
# 
# Get the DNS server of the Windows machine, save into variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convert nameserver object into a string
$nameserver = Out-String -InputObject $nameserver
# Run Set-Contents (sc) to write the resolv.conf file in a public location as it has DOS formatted line endings written by PowerShell, not readable by Linux
sc -Path 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encoding utf8
# Convert the DOS formatted file into UNIX format for WSL2 and write it in the proper place (\etc\resolv.conf, its primary location is \\wsl$\[distro_name] from Windows)
[string]::Join( "`n", (gc 'c:\Users\Public\Documents\resolv.conf')) | sc '\\wsl$\debian\etc\resolv.conf'
# Launch the default WSL2 distribution - if you want to use another one, specify in the line below
wsl.exe

Dies wurde unter Debian Buster und einem Zscaler-VPN (Unternehmen) getestet. Es ist ein guter Ausgangspunkt. Ich hoffe, es erspart jemandem die Kopfschmerzen, die ich hatte, als ich DNS-Zugriff auf die WSL2-Instanz meines Unternehmens-PCs erhalten wollte!

Antwort4

Sehr ausführliche Antworten zum Ändern. Ich wollte einfach die Standardeinstellung verwenden und weitermachen. Habe ein paar Anleitungen wie die erste Antwort befolgt, hat bei mir aber nicht funktioniert. Ich habe es nur geändert /etc/wsl.confund es funktioniert wieder.

sudo nano /etc/wsl.conf

In diese Datei einfügen oder ändern:

[network]
generateResolvConf = true

In Powershell/CMD einfügen:

wsl --shutdown

oder:

wsl --terminate <<Linux distro>>

Fertig. Sagen Sie mir Bescheid, ob es bei Ihnen funktioniert hat.

Mein Setup war durcheinander, weil Tailscale es beim Start geändert hat. Jetzt funktioniert es wieder.

verwandte Informationen