据我所知,在 Windows 10 上更改 WSL2 使用哪个 DNS 服务器的官方过程如下所述。(WSL2 是适用于 Linux 的 Windows 子系统的新版本,它在 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
。
同样systemd-resolve
不在我的路上;它不存在于/usr/bin/systemd-resolve
。
我在上面记录的过程是正确的 - 这就是您在 WSL2 下更改 DNS 设置的方式。
我的错误是使用 CloudFlare (1.1.1.1) 和 Google (8.8.8.8 & 8.8.4.4) 的众所周知的公共 DNS 服务器进行测试。事实证明,我的本地网络阻止了我使用公共 DNS。
当我使用正确的内部 DNS 服务器 IP 地址测试上述过程时,一切正常。
在此处添加其他答案,您还想设置
resolv.conf
不可变。就我而言,它在每次启动时都会被删除,即使是
wsl.conf
.出于这个原因,我创建了这个小程序,它用一个 shell 自动执行所有操作:
https://github.com/epomatti/wsl2-dns-fix-config
创建/编辑时
/etc/resolv.conf
,我不断收到这样的错误:我能够通过从头开始删除和重新创建它来解决这些问题。这两个操作都需要以 root 身份运行(使用 sudo 对我不起作用)
关于更改它的非常详细的答案。我只是想使用默认值并继续使用它。遵循了一些指南,例如第一个答案,对我没有用。我只是改变了
/etc/wsl.conf
,它又可以工作了。在此文件中插入或更改:
插入 Powershell/CMD:
或者:
做完了。让我知道这是否对您有用。
我的设置搞砸了,因为 Tailscale 在我启动时更改了它。现在它又开始工作了。
我不得不在家(冠状病毒)执行此操作,最终编写了一个 Powershell 管理员提示脚本来启动我的发行版(debian)。另请注意,这会启动 WSL 指定的默认发行版,如果不是这种情况,您需要更改最后一行。查找
\\wsl$\[distro name]
如果您的不是也称为 Debian,只需在 Windows 资源管理器路径中键入第一部分即可到达 WSL2,即在资源管理器顶部栏中输入\\wsl$\
,它将列出您的发行版。这将从 Windows 主机中拉出 DNS 服务器,创建一个新的 resolv.conf,并将其以 Unix 格式写入 WSL2 实例。因此,您确实需要将 /etc/wsl.conf 编辑为:
因此,一个超级用户试图将其更改为 resolv.config;如果该文件存在是因为您使用的是不同的 Linux 发行版,那么我想它就是您想要的文件。所以进行相应的修改。尽管我从未在任何文档中看到过该文件,而且我不确定我的帖子的编辑是否正确。
然后启动 PowerShell Admin Prompt 并像 ./debian.ps1 一样运行(如果这是您命名文件的名称):
这已经在 Debian Buster 和 Zscaler(企业)VPN 下进行了测试。这是一个很好的起点,希望它可以避免我在公司 PC 的 WSL2 实例上获得 DNS 访问时遇到的麻烦!
如果要在 Windows 和 WSL Linux 之间共享 DNS 配置,请将autogeneration 保留为 ON。
作为 windows管理员编辑
C:\Windows\System32\drivers\etc\hosts
。或者以 Windows 管理员身份运行 WSL Linux Shell(右键单击)编辑文件
/mnt/c/Windows/System32/drivers/etc/hosts
。