直接改 /etc/resolv.conf 失效是因为该文件被 systemd-resolved、NetworkManager 或 resolvconf 动态管理,通常是软链接(如指向 /run/systemd/resolve/stub-resolv.conf)或自动生成,修改后会被立即覆盖。

直接改 /etc/resolv.conf 为什么经常失效
因为现代 Linux 发行版大多用 systemd-resolved、NetworkManager 或 resolvconf 动态管理这个文件,/etc/resolv.conf 往往只是个软链接(比如指向 /run/systemd/resolve/stub-resolv.conf)。你刚保存,过几秒就被覆盖回去了。
验证方式很简单:
- 运行
ls -l /etc/resolv.conf,如果输出里带->,说明是软链接 - 看文件开头有没有注释,比如
# Generated by NetworkManager或# Managed by systemd-resolved
这时候硬改文件等于白忙——得先停掉对应服务或改配置源头。
停掉 systemd-resolved 再写死 resolv.conf
这是最直截了当的“夺回控制权”方式,适合服务器环境或明确不想用 systemd 解析器的场景。
操作步骤:
- 停服务:
sudo systemctl stop systemd-resolved - 禁自启:
sudo systemctl disable systemd-resolved - 删软链接:
sudo rm /etc/resolv.conf - 新建静态文件:
sudo tee /etc/resolv.conf <<'EOF'<br>nameserver 223.5.5.5<br>nameserver 114.114.114.114<br>options timeout:1 attempts:2 rotate<br>EOF
- 加只读锁防覆盖(可选):
sudo chattr +i /etc/resolv.conf(改之前记得先chattr -i)
注意:options timeout:1 attempts:2 rotate 能显著缓解 DNS 卡顿或超时问题,尤其在公网解析不稳定时。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
用 nmcli 配置 NetworkManager 的 DNS
桌面环境或使用 NetworkManager 管理网络时,这是推荐路径。它不碰 resolv.conf,而是让 NM 在连接激活时生成配置。
关键命令:
- 查当前连接名:
nmcli connection show --active - 设 DNS 并禁用 DHCP 分配:
sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1" ipv4.ignore-auto-dns yes - 重启连接生效:
sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"
别漏掉 ipv4.ignore-auto-dns yes,否则 DHCP 返回的 DNS 仍会覆盖你的设置。
resolv.conf 里的 nameserver 行数和顺序有影响吗
有,而且很实际:
- glibc 解析器按顺序尝试
nameserver行,只用第一个响应的;后续服务器仅在前一个超时或失败时启用 - 最多支持 3 行
nameserver(第 4 行起被忽略) - 不要把内网 DNS(如
10.x.x.x)放在公网 DNS 后面——一旦前面那个慢或挂了,所有请求都会卡满 timeout - IPv6
nameserver(如2400:3200::1)和 IPv4 混排没问题,但若系统关了 IPv6,这行会被跳过
真正容易被忽略的是:很多故障不是 DNS 服务器本身坏了,而是 resolv.conf 里混进了被屏蔽的 DNS(比如某些云厂商默认塞的内网地址),又没配 rotate,结果整条链路卡在第一个无效地址上等 5 秒才切下一个。

















