WSL2 如何继承Windows主机DNS配置并实现动态同步更新?
WSL2 如何继承Windows主机DNS配置并实现动态同步更新?
兄弟我太懂你这种频繁切换工作网络的痛苦了!WSL2默认的DNS配置确实有这个毛病——切换网络后/etc/resolv.conf里的域名服务器地址不会自动跟着主机更新,导致连域名都解析不了,而且你又不能固定用公共DNS,必须跟着主机走。我之前也踩过这个坑,试了好几种方法,下面给你分享两个亲测有效的方案:
方案一:通过WSL全局配置让系统自动继承主机DNS(基础版)
这个方法能让WSL不再自动生成固定的DNS配置,而是我们手动指向主机的DNS服务:
- 先关闭所有WSL实例:打开Windows终端(保险起见用管理员模式),运行
wsl --shutdown,确保所有WSL发行版都停掉。 - 创建WSL全局配置文件:在Windows的用户目录(比如
C:\Users\你的用户名)里新建一个名为.wslconfig的文件(注意文件名前面有个点,别漏了)。 - 编辑配置文件:用记事本或者VS Code打开这个文件,添加以下内容:
[network] generateResolvConf = false
这个配置的作用是告诉WSL:“别自己瞎生成resolv.conf了,我自己来管!”
4. 重启WSL并修改resolv.conf:重新打开WSL终端,先删除原来的自动生成的resolv.conf:
sudo rm /etc/resolv.conf
然后创建一个新的resolv.conf,直接同步Windows主机当前的DNS:
# 获取Windows主机的IPv4 DNS地址,写入resolv.conf WIN_DNS=$(powershell.exe -Command "Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses" | tr -d '\r' | head -n1) sudo bash -c "echo 'nameserver $WIN_DNS' > /etc/resolv.conf"
这样配置完,你的WSL就会使用和Windows主机完全一致的DNS服务器了。
方案二:用脚本实现DNS动态同步(进阶版,适合频繁切换网络)
如果你需要每次切换网络后都自动同步DNS,不用手动跑命令,可以整个脚本自动搞定:
- 先完成方案一的前3步:确保
generateResolvConf = false已经设置好,避免WSL覆盖我们的自定义配置。 - 创建同步脚本:在WSL的用户目录下新建一个脚本文件,比如
~/sync-dns.sh,内容如下:
#!/bin/bash # 从Windows主机获取当前所有IPv4 DNS服务器地址 WIN_DNS_LIST=$(powershell.exe -Command "Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses" | tr -d '\r') # 清空原有的resolv.conf内容 sudo bash -c "echo '' > /etc/resolv.conf" # 将每个DNS服务器地址写入resolv.conf for dns in $WIN_DNS_LIST; do sudo bash -c "echo 'nameserver $dns' >> /etc/resolv.conf" done # 可选:添加公共DNS作为备用(比如1.1.1.1),防止主机DNS失效 sudo bash -c "echo 'nameserver 1.1.1.1' >> /etc/resolv.conf"
- 给脚本加执行权限:
chmod +x ~/sync-dns.sh - 设置自动执行:
- 如果你用的是Bash,编辑
~/.bashrc文件,在末尾加一行:~/sync-dns.sh - 如果你用的是Zsh,就编辑
~/.zshrc,同样添加上面的行。
这样每次打开WSL终端的时候,脚本都会自动同步最新的主机DNS配置;如果中途切换了网络,手动跑一遍~/sync-dns.sh就能立刻更新。
- 如果你用的是Bash,编辑
小提示
- 如果你发现修改resolv.conf后还是不生效,可以试试重启WSL的网络服务:
sudo systemctl restart systemd-resolved(部分发行版可能需要这个操作)。 - 公司内部网络的私有DNS也完全适配,因为脚本直接读取主机当前正在使用的DNS地址。
备注:内容来源于stack exchange,提问作者Shoham Ben Shitrit




