DNS 在 WSL 上不起作用

Lig*_*k05 23 windows internet dns windows-subsystem-for-linux

我目前使用的是 Windows 11 的 Insider 版本。(22458)

然而,我在其他版本上也遇到过几次这个问题。(并且 wsl 之前工作过)

当我启动 wsl 时,我无法执行 DNS 请求。(直接Ping IP地址即可。)

我跟踪这个问题到文件:/etc/resolv.conf

它包括 DNS 服务器地址。

默认为:172.22.192.1

然而,这个不起作用。

如果我将其更改为 1.1.1.1(Cloud Flare DNS),它会再次工作。

但是,每次重新启动 wsl 后,它都会将其更改回默认值。

有一个名为 wsl.conf 的文件,我可以在其中禁用生成此文件,但如果总是在每次重新启动后完全删除该文件。

那么我该如何解决这个问题呢?

我的第一个想法是完全重置 wsl,但既没有重置应用程序,也没有通过功能重新安装 WSL 修复它。

有人知道该怎么做吗?

Eva*_*tti 31

正如大多数答案所述,创建以下配置文件,然后重新启动 WSL 应该就足够了:

/etc/wsl.conf

[network]
generateResolvConf = false
Run Code Online (Sandbox Code Playgroud)

/etc/resolv.conf

nameserver 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

然而,由于某种原因,我resolv.conf每次启动时都会重新创建。

所以我必须使其不可变,如下所示:

[network]
generateResolvConf = false
Run Code Online (Sandbox Code Playgroud)

很多时候这个问题困扰着我,我最终制作了这个简单的帮助代码:

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


小智 9

这是 WSL 的问题,而不是 Ubuntu 或 Windows 的问题。有很多解决方案,我发现最好的一个https://gist.github.com/coltenkrauter/608cfe02319ce60facd76373249b8ca6

它还包括 VPN 信息,但这些步骤在没有 VPN 的情况下也适用。

  1. 在 Ubuntu 终端中运行这些命令。

    cd ~/../../etc # Go to etc folder in WSL.
    echo "[network]" | sudo tee wsl.conf # Create wsl.conf file and add the first line.
    echo "generateResolvConf = false" | sudo tee -a wsl.conf # Append wsl.conf the next line.
    wsl --terminate Debian # Terminate WSL in Windows cmd, in case the OS is Ubuntu not Debian.
    cd ~/../../etc # Go to etc folder in WSL.
    sudo rm -Rf resolv.conf # Delete the resolv.conf file.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 Windows cmd、PowerShell 或已连接 VPN 的终端中,执行以下操作:Get-NetIPInterfaceipconfig /all获取主要和辅助 DNS。

  3. 将步骤 2 中获得的 DNS 主 DNS 和辅助 DNS 替换为下一步中的 XXXX 中的数字

  4. echo "nameserver X.X.X.X" | sudo tee resolv.conf(创建 resolv.conf 并附加该行。)

  5. echo "nameserver X.X.X.X" | sudo tee -a resolv.conf(在 resolv.conf 中添加该行)

  6. wsl --terminate Debian(如果是 Ubuntu 而不是 Debian,请在 Windows cmd 中终止 WSL)。

  7. sudo chattr +i resolv.conf

  8. 最后在 Windows cmd、PowerShell 或终端中:

    Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
    
    Run Code Online (Sandbox Code Playgroud)

图片来源:@MartinCaccia、@yukosgiti、@machuu 和 @AlbesK:
https://github.com/microsoft/WSL/issues/4277
https://github.com/microsoft/WSL/issues/4246

  • 您可能可以在链中添加一个 uudecode 并使您正在做的事情更加神秘 (2认同)

wal*_*tor 2

WSL 从 Windows 的 DHCP 服务器获取其 IP 地址(及其 DNS 服务器、网络掩码和其他内容)。在 Windows 上修复它,或修复 172.22.192.1 上的 DNS 服务器。

这是 Windows 问题,不是 Ubuntu 问题。

不,我不知道 Windows 如何执行 DHCP。