Mein Problem
Mein Windows Computer nutzt verschiedene DNS Server, basierend darauf wo ich gerade bin: Im Büro werden die Büro-DNS-Server genutzt, zuhause mein privater. WSL scheint diese DNS-Updates nicht korrekt zu aktualisieren, was mir regelmäßig meine Internetverbindung kappt. Ich weiß zwar nicht warum das so ist, aber ich weiß wie ich das lösen kann.
Vorbereitungen
Ich nutze die externe Python-Bibliothek dns.resolver
, die ich per Conda installiert habe: conda install -n dns-resolver dnspython
.
Mein Code
#!/home/chris/.conda/envs/dns-resolver/bin/python
import shutil
import subprocess
import dns.resolver
DOMAIN = "domain.com"
servers = subprocess.check_output(["/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe", "(Get-DnsClientServerAddress -AddressFamily IPv4).ServerAddresses"])
servers = servers.decode("utf8").split("\r\n")
print("Found servers:", servers)
resolver = dns.resolver.Resolver()
available_servers = []
shutil.move("/etc/resolv.conf", "/etc/resolv.conf.bak")
print("Testing servers.")
for server in set(servers):
if not server.strip():
continue
print(f"{server}... ", end="")
resolver.nameservers = [server]
try:
resolver.resolve(DOMAIN)
except dns.resolver.LifetimeTimeout:
print("not reachable.")
continue
print("reachable.")
available_servers.append(server)
with open("/etc/resolv.conf", "a") as fout:
fout.write(f"nameserver {server}\n")
print("Done!")
Was passiert?
Zuerst lese ich per Powershell alle DNS Server aus, die Windows zur Zeit kennt. Die sind allerdings nicht alle erreichbar - zum Beispiel sind DNS-Server für die VPN-Verbindung vorhanden, die nur dann erreichbar sind wenn die VPN-Verbindung tatsächlich steht.
Der zweite Schritt ist also der folgende: Gehe über alle gefundenen DNS Server und versuche, einen fixierten DNS Namen zu aufzulösen. Wenn das klappt, schreibe den DNS Server in die /etc/resolv.conf
Datei.
Beachte das set(servers)
in Zeile $23$: Potentiell werden für verschiedene Interfaces (z.B. LAN und WLAN) die gleichen DNS Server genutzt; ich möchte trotzdem jeden Server nur einmal testen.