据我所知,更改 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 自动执行所有操作:
答案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 在启动时更改了它。现在它又可以正常工作了。