如何更改 WSL2 的 DNS 设置?

如何更改 WSL2 的 DNS 设置?

据我所知,更改 Windows 10 上 WSL2 使用的 DNS 服务器的官方流程如下所述。(WSL2 是 Windows Subsystem for Linux 的新版本,它在 Windows 10 上的轻量级 VM 中运行实际的 Linux 内核。)

然而,这个过程对我来说不起作用——我最终得到一个超时并且无法解析任何地址的系统。

我究竟做错了什么?

以下是我目前整理出的整个过程:

1. 关闭生成/etc/resolv.conf

使用 Linux 提示符(我使用的是 Ubuntu),修改(或创建)/etc/wsl.conf,内容如下

[network]
generateResolvConf = false

(显然,当前版本中存在一个错误,这些行上的任何尾随空格都会导致错误。)

2. 重启 WSL2 虚拟机

退出所有 Linux 提示符并运行以下 Powershell 命令

wsl --shutdown

3. 创建自定义/etc/resolv.conf

打开一个新的 Linux 提示符并 cd 到/etc

如果resolv.conf软链接到另一个文件,则删除链接

rm resolv.conf

resolv.conf创建一个包含以下内容的新

nameserver 1.1.1.1

4. 重启 WSL2 虚拟机

与步骤 #2 相同

5. 启动新的 Linux 提示符。

利润!

2020 年 3 月 18 日更新

我的/etc/hosts文件包含以下内容:

# 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

该文件/etc/switch.conf不存在。

该工具resolvectl不在我的路径上;它不存在/usr/bin/resolvectl

Likewisesystemd-resolve不在我的路径上;它在 不存在/usr/bin/systemd-resolve

答案1

我上面记录的过程是正确的 - 这如何在 WSL2 下更改 DNS 设置。

我的错误在于,出于测试目的,我使用了众所周知的 CloudFlare 公共 DNS 服务器(1.1.1.1)和 Google 公共 DNS 服务器(8.8.8.8 和 8.8.4.4)。结果发现,我的本地网络阻止我使用公共 DNS。

当我使用正确的内部 DNS 服务器 IP 地址测试上述过程时,一切正常。

答案2

在这里添加其他答案想要设置resolv.conf不可变的。

sudo chattr +i /etc/resolv.conf

就我而言,它在每次启动时都会被删除,即使使用了wsl.conf

出于这个原因,我创建了这个小程序,可以通过一个 shell 自动执行所有操作:

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

答案3

我不得不在家里做这件事(冠状病毒),最终编写了一个 Powershell Admininstrator Prompt 脚本来启动我的发行版(debian)。另请注意,这会启动 WSL 指定的默认发行版,如果不是这种情况,您需要更改最后一行。查找\\wsl$\[distro name]如果您的发行版不叫 Debian,只需在 Windows 资源管理器路径中输入第一部分即可到达 WSL2,即在资源管理器顶部栏中输入\\wsl$\,它将列出您的发行版。

这将从 Windows 主机中提取 DNS 服务器,创建一个新的 resolv.conf,并将其以 Unix 格式写入 WSL2 实例。因此,您需要编辑 /etc/wsl.conf 以:

[network]
generateResolvConf = false

因此,一位超级用户尝试将其更改为 resolv.config;如果该文件存在,因为您使用的是不同的 Linux 发行版,那么我想它就是您想要的文件。因此请进行相应的修改。虽然我从未在任何文档中看到过该文件,而且我不确定我帖子的编辑是否正确。

然后启动 PowerShell 管理提示符并运行 ./debian.ps1(如果这是文件命名):

# 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

这已在 Debian Buster 和 Zscaler(企业)VPN 下进行了测试。这是一个很好的起点,希望它能为某些人省去我在企业 PC 的 WSL2 实例上获取 DNS 访问权限时遇到的麻烦!

答案4

关于更改它的非常详细的答案。我只想使用默认设置并继续使用它。按照第一个答案中的一些指南操作,对我不起作用。我只是做了一些更改/etc/wsl.conf,它又恢复了功能。

sudo nano /etc/wsl.conf

在此文件中插入或更改:

[network]
generateResolvConf = true

在 Powershell/CMD 中插入:

wsl --shutdown

或者:

wsl --terminate <<Linux distro>>

大功告成。如果这对您有用,请告诉我。

我的设置搞乱了,因为 Tailscale 在启动时更改了它。现在它又可以正常工作了。

相关内容