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 |
|
这是用于将ubuntu自己获取dns的配置关掉
退出 wsl,关机然后重新启动:
1 |
|
删除 link 文件:/etc/resolv.conf
:
1 |
|
然后新建 /etc/resolv.conf
文件,内容如下,可自定义 nameserver 地址:
1 |
|
再次退出 wsl,关机然后重新启动:
1 |
|
一般这样之后这个问题就会解决
但是我之前这样操作之后还是没有连上网
后来一篇文章中看到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放进去就可以解析了
造成这个问题的原因我怀疑是,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 |
|
然后使用以下命令查看是否启用
1 |
|
这样应该就是启用了的,可以开始配置了,如果没有启用,就还需要开启
如何启用 systemd(如果未开启)
修改 WSL 的配置文件:
1 |
|
添加以下内容:
1 |
|
保存并退出,再重新启动
1 |
|
自动写入
以下是我自动写入的shell脚本
1 |
|
创建/usr/local/bin/update-wsl-dns
然后写入我们的脚本,然后再给文件权限
1 |
|
创建/etc/systemd/system/update-wsl-dns.service
,写入
1 |
|
然后执行
1 |
|
这样,在每次启动wsl的时候就可以自动写入dns而不需要自己每次都手动写入了,如果发现dns失效,重启一下wsl或则执行sudo update-wsl-dns
就可以解决
前半段的解决是在去年寒假写的,这学期学完计网之后了解了问题原因写了解决plus,其实我的计网学的也不好,只有期末突击了一下,所以要是问题原因解释的不对,希望师傅们可以留言告诉我一下。