改/etc/resolv.conf不生效是因为systemd-resolved或NetworkManager接管并覆盖该文件;需通过对应服务配置DNS,如编辑/resolved.conf设DNS及~域名分流,或用nmcli修改连接DNS设置。

为什么改 /etc/resolv.conf 不生效?
很多用户手动改了 /etc/resolv.conf,加了内网 DNS(比如 10.0.0.2),但 nslookup 或服务访问仍走公网 DNS,甚至重启后文件被重写。这是因为现代 Linux(尤其是 systemd 系统)默认由 systemd-resolved 或 NetworkManager 管理该文件,直接编辑会被覆盖。
真正起作用的是上游解析器配置,不是这个文件本身。判断方式:ls -l /etc/resolv.conf —— 如果是软链接指向 /run/systemd/resolve/stub-resolv.conf 或 /run/NetworkManager/resolv.conf,就说明被接管了。
- 用
systemctl is-active systemd-resolved查是否启用systemd-resolved - 用
nmcli dev show | grep DNS查 NetworkManager 当前 DNS 设置 - 临时验证:运行
sudo systemd-resolve --set-dns=10.0.0.2 --interface=eth0(仅当前会话有效)
给 systemd-resolved 配内网 DNS(推荐)
这是最干净、兼容性最好的方案,尤其适合 Ubuntu 20.04+、CentOS 8+ 等默认启用 systemd-resolved 的系统。它支持 per-interface DNS、缓存、fallback 机制,且不破坏原有网络管理逻辑。
操作分两步:先禁用 stub 模式(避免环路),再为指定网卡配 DNS。
- 编辑
/etc/systemd/resolved.conf,取消注释并修改:[Resolve]<br>DNS=10.0.0.2<br>FallbackDNS=8.8.8.8 114.114.114.114<br>Domains=~example.local ~corp
(~example.local表示该域名及子域强制走此处 DNS) - 重启服务:
sudo systemctl restart systemd-resolved - 确认生效:
resolvectl status eth0(看 DNS servers 是否含10.0.0.2)
注意:Domains 行的波浪号 ~ 很关键 —— 没它,内网域名仍可能被转发到 fallback DNS;有它,才实现「内网域名走内网 DNS,其他走 fallback」的分流效果。
NetworkManager 用户怎么设?
如果你用 nmcli 或桌面环境(GNOME/KDE)管理网络,直接改 resolved.conf 可能被 NM 覆盖。正确做法是通过 NM 的 connection 配置 DNS:
- 查当前连接名:
nmcli connection show(通常叫Wired connection 1或System eth0) - 设 DNS 和搜索域:
sudo nmcli connection modify "Wired connection 1" ipv4.dns "10.0.0.2 8.8.8.8"sudo nmcli connection modify "Wired connection 1" ipv4.dns-search "corp.example.com" - 关闭自动获取 DNS:
sudo nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes - 重启连接:
sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"
此时 /etc/resolv.conf 会指向 NM 生成的版本,内容包含你指定的 DNS。验证:cat /etc/resolv.conf 应看到 nameserver 10.0.0.2。
绕过 systemd/NM:直接写死 /etc/resolv.conf(慎用)
某些嵌入式或容器化场景需要绝对控制权,可停掉 systemd-resolved 和 NetworkManager 的 DNS 管理,手动锁定 /etc/resolv.conf。
- 停服务:
sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved - 删软链,建新文件:
sudo rm /etc/resolv.conf && sudo tee /etc/resolv.conf <<'EOF'<br>nameserver 10.0.0.2<br>nameserver 8.8.8.8<br>search corp.example.com<br>EOF
- 加只读锁防覆盖:
sudo chattr +i /etc/resolv.conf(后续要改需先chattr -i)
风险点:若系统依赖 systemd-resolved 的 DNSSEC 或 LLMNR 功能,停用后部分服务(如某些 Avahi 场景)可能异常;chattr +i 后忘了解锁,升级或重装网络组件会失败。
真正难的不是加一行 nameserver,而是搞清谁在管 DNS、谁有最终解释权——多一层抽象,就多一个覆盖点。内网加速效果好不好,取决于请求是否真进了你的 10.0.0.2,而不是看起来写了它。


















