wsl中ubuntu的DNS解析错误

wsl中ubuntu的DNS解析错误

判断是否是dns解析错误

1.进入wsl ping www.baidu.com 不通;

2.本机cmd ping www.baidu.com 正常;

3.把本机ping 百度的ip拿出来,用wsl直接ping 百度的ip正常;

通过此步骤基本可以判断是WSL2默认的DNS配置有问题。

(出现这个的原因是是因为ubuntu自身的配置会每次将dns改为初始值)

解决

创建/etc/wsl.conf,内容如下

1
2
[network]
generateResolvConf = false

这是用于将ubuntu自己获取dns的配置关掉

退出 wsl,关机然后重新启动:

1
2
3
exit
wsl --shutdown
wsl

删除 link 文件:/etc/resolv.conf​:

1
rm /etc/resolv.conf

然后新建 /etc/resolv.conf​ 文件,内容如下,可自定义 nameserver 地址:

1
nameserver 8.8.8.8

再次退出 wsl,关机然后重新启动:

1
2
3
exit
wsl --shutdown
wsl

一般这样之后这个问题就会解决

但是我之前这样操作之后还是没有连上网

后来一篇文章中看到https://www.cnblogs.com/gatling/p/18113032

还需要将我们wsl上的网关信息也放在/etc/resolv.conf

cat /etc/resolv.conf
nameserver 172.21.32.1(在路由中找到的网关信息)
nameserver 8.8.8.8
nameserver 8.8.4.4

解决PLUS

这个问题其实断断续续困扰了我将近半年了,这学期学完计网,终于是明白了了造成这个问题最根本的原因了,

在我的电脑上出现的问题是使用公共DNS,例如8.8.8.8,DNS仍然解析不成功,但是如我上述的解决方法,把在路由里找到的ip放进去就可以解析了

image

造成这个问题的原因我怀疑是,wsl作为虚拟机不能直接与外部的DNS相连,需要先经过我们的本机作为中转,先将我们需要解析的域名发给本机,让本机交给外部的DNS去解析,然后再返还给wsl。此时,如果我们的在/etc/resolv.conf​里面写nameserver 8.8.8.8,就会前往本机里面寻找8.8.8.8,找不到,自然也就解析不了。如果我们此时写的是192.168.31.1,就能够找到我们本机,让我们的本机在转发去寻找8.8.8.8,就能够解析成功。

但是现在还存在一个问题,就是如果我们连接的wifi更换了的话,那个在图中我们圈起来的ip也是会变化的,此时我们就需要在/etc/resolv.conf​更换我们的内容为更新后的ip,但是每换一次网络就得更换ip太过复杂,所以可以写一个自动化的脚本在我们每次启动wsl的时候自动更新DNS

以下解决方案需要windows11,wsl2并开启了systemd特性

可以使用以下命令查看是否具有systemed,出现systemd就是存在

1
ps -p 1 -o comm=

image

然后使用以下命令查看是否启用

1
systemctl list-units

image

这样应该就是启用了的,可以开始配置了,如果没有启用,就还需要开启

如何启用 systemd(如果未开启)

修改 WSL 的配置文件:

1
sudo nano /etc/wsl.conf

添加以下内容:

1
2
[boot]
systemd=true

保存并退出,再重新启动

1
wsl --shutdown

自动写入

以下是我自动写入的shell脚本

1
2
3
#!/bin/bash
gw=$(ip route | grep default | awk '{print $3}')
echo "nameserver $gw" > /etc/resolv.conf

创建/usr/local/bin/update-wsl-dns​然后写入我们的脚本,然后再给文件权限

1
sudo chmod +x /usr/local/bin/update-wsl-dns

创建/etc/systemd/system/update-wsl-dns.service​,写入

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Update WSL DNS from Windows Gateway
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/update-wsl-dns

[Install]
WantedBy=multi-user.target

然后执行

1
2
3
4
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable update-wsl-dns.service
sudo systemctl start update-wsl-dns.service

这样,在每次启动wsl的时候就可以自动写入dns而不需要自己每次都手动写入了,如果发现dns失效,重启一下wsl或则执行sudo update-wsl-dns​就可以解决

前半段的解决是在去年寒假写的,这学期学完计网之后了解了问题原因写了解决plus,其实我的计网学的也不好,只有期末突击了一下,所以要是问题原因解释的不对,希望师傅们可以留言告诉我一下。


wsl中ubuntu的DNS解析错误
http://example.com/post/dns-resolution-error-for-ubuntu-in-wsl-1isudy.html
作者
N1mbus
发布于
2025年7月20日
更新于
2025年7月20日
许可协议