You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WSL2 如何继承Windows主机DNS配置并实现动态同步更新?

WSL2 如何继承Windows主机DNS配置并实现动态同步更新?

兄弟我太懂你这种频繁切换工作网络的痛苦了!WSL2默认的DNS配置确实有这个毛病——切换网络后/etc/resolv.conf里的域名服务器地址不会自动跟着主机更新,导致连域名都解析不了,而且你又不能固定用公共DNS,必须跟着主机走。我之前也踩过这个坑,试了好几种方法,下面给你分享两个亲测有效的方案:

方案一:通过WSL全局配置让系统自动继承主机DNS(基础版)

这个方法能让WSL不再自动生成固定的DNS配置,而是我们手动指向主机的DNS服务:

  1. 先关闭所有WSL实例:打开Windows终端(保险起见用管理员模式),运行wsl --shutdown,确保所有WSL发行版都停掉。
  2. 创建WSL全局配置文件:在Windows的用户目录(比如C:\Users\你的用户名)里新建一个名为.wslconfig的文件(注意文件名前面有个点,别漏了)。
  3. 编辑配置文件:用记事本或者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,不用手动跑命令,可以整个脚本自动搞定:

  1. 先完成方案一的前3步:确保generateResolvConf = false已经设置好,避免WSL覆盖我们的自定义配置。
  2. 创建同步脚本:在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"
  1. 给脚本加执行权限
    chmod +x ~/sync-dns.sh
    
  2. 设置自动执行
    • 如果你用的是Bash,编辑~/.bashrc文件,在末尾加一行:
      ~/sync-dns.sh
      
    • 如果你用的是Zsh,就编辑~/.zshrc,同样添加上面的行。
      这样每次打开WSL终端的时候,脚本都会自动同步最新的主机DNS配置;如果中途切换了网络,手动跑一遍~/sync-dns.sh就能立刻更新。

小提示

  • 如果你发现修改resolv.conf后还是不生效,可以试试重启WSL的网络服务:sudo systemctl restart systemd-resolved(部分发行版可能需要这个操作)。
  • 公司内部网络的私有DNS也完全适配,因为脚本直接读取主机当前正在使用的DNS地址。

备注:内容来源于stack exchange,提问作者Shoham Ben Shitrit

火山引擎 最新活动