前言
很多人直接通过修改 /etc/resolv.conf 来尝试修改系统的 DNS 的设置,但是发现重启之后就被“打回原形”了。
有些人建议锁死这个文件的修改权限,但是个人是不建议这么做的。
本帖将介绍另外一种更好的方式来永久修改系统的 DNS 设置。
所需软件
resolvconf
软件原理
软件维护自己版本的 resolv.conf,该文件位于 /run/resolvconf/resolv.conf。
之后该软件将 /etc/resolv.conf 设置成自己配置文件 /run/resolvconf/resolv.conf 的 symlink(快捷方式),因此对自己配置文件作出的修改可以直接在 /etc/resolv.conf 反映出来。
具体操作步骤
1️⃣. 安装软件并确保软件自启
Debian 类系统 (Debian,Ubuntu 等),运行 apt install resolvconf
RHEL 类系统 (CentOS,RHEL 等),运行 yum install resolvconf
之后运行 systemctl enable resolvconf 来确保软件自启。
2️⃣. 重启系统
reboot
3️⃣. 确保 /etc/resolv.conf 是正确的 symlink(快捷方式)
如果觉得第 3 步太复杂......
我写了小脚本,运行wget -qO- https://raw.githubusercontent.com/yang05051/Scripts/main/Check-Resolv.conf-Symlink-to-Resolvconf.sh | bash即可完成这一步,然后就可以愉快地看第 4 步啦
运行 readlink /etc/resolv.conf 检查。
如果输出内容是 /run/resolvconf/resolv.conf,那么恭喜你,一切正常。接下来可以直接忽略第 3 步的剩余内容,跳到第 4 步。
如果输出不是上述内容,或者输出是空的,那么要做两件事情,首先备份 /etc/resolv.conf,之后将其指向正确的文件。
(备份)
如果输出内容不是空的输出,那么说明 resolv.conf 原本就是个 symlink。这时需运行 ln -s $(readlink /etc/resolv.conf) /etc/resolv.conf.bak,创建一个一模一样的 symlink,但是名称是 resolv.conf.bak。
如果输出是空的,那么 resolv.conf 是个正常的文件,此时需运行 cp /etc/resolv.conf /etc/resolv.conf.bak,复制这个文件。
(指向正确的文件)
运行 rm /etc/resolv.conf; ln -s /run/resolvconf/resolv.conf /etc/resolv.conf。
4️⃣. 修改 DNS 设置
修改 /etc/resolvconf/resolv.conf.d/head,在文件末尾添加自己想要的 DNS 配置。修改完成后,记得保存文件。
5️⃣. 应用自己的配置
运行 resolvconf -u。
要查看自己的修改是否生效,可以运行 cat /etc/resolv.conf 查看 resolv.conf 的内容。看看自己的修改是否生效。
稍后可以重启系统,观察 /etc/resolv.conf 是否被修改回去。
至此便完成了对 DNS 设置的永久更改。🎉
想恢复系统默认的 DNS 设置?
1️⃣. 卸载 resolvconf
Debian 类系统 (Debian,Ubuntu 等),运行 apt remove resolvconf
RHEL 类系统 (CentOS,RHEL 等),运行 yum remove resolvconf
2️⃣. 重启
reboot
⚠️ 如果第三步手动修改了 resolv.conf 的 symlink,请务必执行以下操作。
如果我运行了提供的脚本,不知道是否被修改过?
那么运行readlink /etc/resolv.conf。如果输出仍然是/run/resolvconf/resolv.conf,那么代表被修改过,需要进行下面的步骤。
1. 删除现有 resolv.conf: 运行 rm /etc/resolv.conf。
2. 恢复原 resolv.conf: 运行 mv /etc/resolv.conf.bak /etc/resolv.conf。此举会修改将备份好的文件的名称,使其变为 resolv.conf。
3. 重启: reboot

参考这个
@huqapo #1
你发的这篇教程仍然锁死了
/etc/resolv.conf。不推荐这么做。dnsmasq是在本地模拟 DNS 服务器的一个软件,所以要使用他模拟出来的 DNS 服务器,仍然需要修改/etc/resolv.conf,使用本地 IP127.0.0.1作为系统 DNS。这玩意是真的烦, 如果主机装了 netplan, 例如 Ubuntu 好像是默认装这玩意的, 这么弄不好; 如果 VPS cloudinit 里面有配置, 也要去关掉...