解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

前言

在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系统时,你可能会遇到 /etc/resolv.conf 文件被自动重置的问题。即使你手动删除或修改了这个文件,它仍然会被恢复到默认配置,例如被设置为 nameserver 192.168.31.2。 本文将深入探讨这个问题的原因,并提供有效的解决方案,同时回顾一些可能无效的尝试性操作,帮助你彻底解决 WSL Ubuntu 中的 DNS 配置困扰。

问题描述

正如用户遇到的情况,即使执行 sudo rm /etc/resolv.conf 删除了 /etc/resolv.conf 文件,或者使用 sudo tee /etc/resolv.conf <<< "nameserver 192.168.31.111" 尝试手动设置 nameserver,重启 WSL 后,/etc/resolv.conf 文件仍然会被重置为包含 nameserver 192.168.31.2 的内容。 这导致用户自定义的 DNS 设置无法生效,影响网络访问。

问题原因

这个问题的根源在于 WSL 的网络配置机制 。 WSL 默认被设计为与 Windows 主机网络环境紧密集成。 为了简化网络配置,WSL 会自动生成 /etc/resolv.conf 文件,并使其 镜像 Windows 主机当前的 DNS 设置 。 这意味着,每次 WSL 启动或网络环境发生变化时,WSL 都会重新生成 /etc/resolv.conf,覆盖任何手动修改。

因此,仅仅删除或临时修改 /etc/resolv.conf 文件是无法持久解决问题的。我们需要 阻止 WSL 自动生成该文件,并采取其他方式来配置 DNS。

尝试过的命令及分析

为了更好地理解问题,并帮助读者避坑,我们先回顾一下用户尝试过的一些命令,并分析其效果:

bash 复制代码
ls -l /etc/resolv.conf
  • 作用: 列出 /etc/resolv.conf 文件的详细信息,包括权限、所有者、大小和修改时间等。 用于确认文件是否存在以及基本属性。
bash 复制代码
cat /etc/resolv.conf
  • 作用: 查看 /etc/resolv.conf 文件的内容,确认当前的 nameserver 设置。 通常会看到 nameserver 192.168.31.2,即使之前尝试删除或修改过。
bash 复制代码
sudo rm /etc/resolv.conf
  • 作用: 尝试删除 /etc/resolv.conf 文件。 看似有效,但重启 WSL 后文件会被自动重新生成,之前的删除操作无效。
bash 复制代码
lsattr /etc/resolv.conf
  • 作用: 查看 /etc/resolv.conf 文件的特殊属性。 在某些情况下,文件可能被设置了 i 属性 (immutable),即不可修改。 但通常 WSL 自动生成的 /etc/resolv.conf 不会默认设置这个属性。
bash 复制代码
sudo chattr -i /etc/resolv.conf
  • 作用: 尝试移除 /etc/resolv.conf 文件的 i 属性(如果存在)。 如果文件被设置为不可修改,这个命令可以解锁文件,使其可以被删除或编辑。 但在这个场景下,通常不是 i 属性的问题,而是 WSL 的自动重写机制。
bash 复制代码
sudo rm /etc/resolv.conf
  • 作用: 再次尝试删除 /etc/resolv.conf 文件。 在移除了 i 属性后,如果之前存在该属性,这次删除操作应该可以成功。 但仍然无法阻止 WSL 的自动重写。
bash 复制代码
sudo tee /etc/resolv.conf <<< "nameserver 192.168.31.111"
  • 作用: 使用 tee 命令和重定向,尝试将 nameserver 192.168.31.111 写入 /etc/resolv.conf 文件。 这个命令可以临时修改文件内容。 但重启 WSL 后,修改会被自动重置。
bash 复制代码
cat /etc/resolv.conf
  • 作用: 再次查看 /etc/resolv.conf 文件内容,确认 tee 命令是否生效。 在重启前,可以看到修改后的内容。
bash 复制代码
sudo chattr +i /etc/resolv.conf
  • 作用: 尝试为 /etc/resolv.conf 文件设置 i 属性 (immutable),使其不可修改。 这个命令的目的是防止 WSL 自动修改文件。 但实际效果有限,WSL 可能会在启动时尝试重写文件,即使设置了 i 属性也可能失败,或者导致其他问题。 不推荐使用这种方式来解决自动重置问题。

总结: 以上命令虽然在一定程度上可以操作 /etc/resolv.conf 文件,但都无法从根本上解决 WSL 自动重置的问题。 我们需要更深入地配置 WSL,阻止其自动管理 /etc/resolv.conf

解决方案:修改 wsl.conf 禁用自动生成

要彻底解决 /etc/resolv.conf 自动重置的问题,我们需要修改 WSL 的配置文件 wsl.conf,禁用其自动生成 /etc/resolv.conf 的功能。 然后,我们可以手动创建并配置 /etc/resolv.conf 文件,或者使用其他 DNS 配置方式。

步骤 1: 编辑 wsl.conf 文件

在 WSL Ubuntu 终端中,使用文本编辑器(例如 nanovim)打开或创建 /etc/wsl.conf 文件:

bash 复制代码
sudo nano /etc/wsl.conf

如果文件不存在,nano 会创建一个新文件。

步骤 2: 添加配置内容

wsl.conf 文件中,添加以下配置段和内容:

ini 复制代码
[network]
generateResolvConf = false
  • [network] 表示网络配置段。
  • generateResolvConf = false 关键配置 ,禁用 WSL 自动生成 /etc/resolv.conf 文件的功能。

保存并关闭文件 (在 nano 中,按 Ctrl+X,然后按 Y 确认保存,最后按 Enter 退出)。

步骤 3: 手动创建并配置 /etc/resolv.conf (可选)

在禁用自动生成后,您可以选择手动创建 /etc/resolv.conf 文件,并配置您想要的 DNS 服务器。 如果您希望使用特定的 DNS 服务器,例如 192.168.31.111 或公共 DNS 服务器 8.8.8.88.8.4.4,请执行以下操作:

bash 复制代码
sudo rm /etc/resolv.conf  # 如果文件还存在,先删除
sudo nano /etc/resolv.conf

/etc/resolv.conf 文件中,添加 nameserver 行,指定 DNS 服务器地址。 例如:

nameserver 192.168.31.111
# 或者使用公共 DNS
# nameserver 8.8.8.8
# nameserver 8.8.4.4

根据您的需求选择合适的 DNS 服务器,保存并关闭文件。

如果您希望完全禁用 DNS 解析,可以跳过手动创建 /etc/resolv.conf 的步骤。 WSL 将不会自动生成,您也没有手动创建,这样系统将不会使用 /etc/resolv.conf 进行 DNS 解析。 但这通常不是推荐的做法,除非您有特殊需求。

步骤 4: 重启 WSL 使配置生效

配置 wsl.conf 后,需要重启 WSL 才能使更改生效。 在终端中运行以下命令重启 WSL:

bash 复制代码
wsl --shutdown
wsl

或者,您可以直接重启您的 Windows 电脑,效果相同。

步骤 5: 验证 DNS 配置

重启 WSL 后,验证 /etc/resolv.conf 文件是否按照您的设置生效。 如果手动创建并配置了 /etc/resolv.conf,请检查文件内容:

bash 复制代码
cat /etc/resolv.conf

您应该看到您在文件中设置的 nameserver 地址。 如果选择不手动创建 /etc/resolv.conf,则文件可能不存在或为空。

您还可以使用 nslookupping 命令测试 DNS 解析是否正常工作:

bash 复制代码
nslookup baidu.com
ping baidu.com

如果 DNS 解析正常,nslookup 应该能够解析域名,ping 应该能够 ping 通域名对应的 IP 地址。

总结

通过修改 wsl.conf 文件并禁用 generateResolvConf 选项,我们可以有效地阻止 WSL 自动重置 /etc/resolv.conf 文件,从而实现自定义 DNS 配置的目的。 这种方法是 持久且推荐 的解决方案,可以彻底解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置的问题,让用户能够灵活地管理 WSL 的 DNS 设置。

相关推荐
xing.yu.CTF1 小时前
Web入侵实战分析-常见web攻击类应急处置实验2
运维·服务器·windows·web安全·apache·php漏洞·phpstudy后门漏洞
我们的五年2 小时前
【Linux网络】TCP/IP地址的有机结合(有能力VS100%???),IP地址的介绍
linux·运维·网络·tcp/ip
davenian2 小时前
< OS 有关 > Ubuntu 24 SSH 服务器更换端口 in jp/us VPSs
linux·ubuntu·ssh
诚信爱国敬业友善3 小时前
GUI编程(window系统→Linux系统)
linux·python·gui
sekaii3 小时前
ReDistribution plan细节
linux·服务器·数据库
YH_DevJourney4 小时前
Linux-C/C++《C/8、系统信息与系统资源》
linux·c语言·c++
威哥爱编程4 小时前
Linux驱动开发13个实用案例
linux
去看日出4 小时前
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
linux·数据库·centos
qq_448941084 小时前
10、k8s对外服务之ingress
linux·容器·kubernetes
weixin_387002154 小时前
Openssl之SM2加解密命令
安全·ubuntu·密码学·ssl·命令模式