是,因现代Linux发行版由systemd-resolved、NetworkManager等动态管理/etc/resolv.conf;应修改上游配置源(如nmcli、resolved.conf或.network文件),并用resolvectl status和ss -tulpn确认实际生效服务。

直接改 /etc/resolv.conf 会失效?原因和应对方式
Linux 下手动改 /etc/resolv.conf 后重启网络或重启机器就还原,不是你操作错了,而是现代发行版(Ubuntu 18.04+、CentOS 8+、Debian 10+)默认用 systemd-resolved、NetworkManager 或 dhcpcd 筡理这个文件,它只是个符号链接或自动生成的副本。
真正该动的是上游配置源:
- 用
NetworkManager:改连接配置,比如nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8,1.1.1.1",再nmcli connection down && up - 用
systemd-networkd:在/etc/systemd/network/*.network文件里加[Network]段,写DNS=8.8.8.8 - 强行锁定
/etc/resolv.conf(不推荐):先sudo chattr +i /etc/resolv.conf,但会和systemd-resolved冲突,导致resolvectl status显示 “No DNS servers configured”
如何确认当前 DNS 实际生效的是哪个服务
别只看 /etc/resolv.conf 内容,它可能只是个跳转。关键要看谁在监听本地 DNS 查询:
- 运行
resolvectl status—— 如果输出里有 “DNS Servers” 且指向127.0.0.53,说明systemd-resolved在管 - 运行
sudo ss -tulpn | grep ':53'—— 查看哪个进程占着 53 端口:systemd-resolved、dnsmasq还是named - 查
/etc/resolv.conf是不是软链:ls -l /etc/resolv.conf,常见指向/run/systemd/resolve/stub-resolv.conf或/run/NetworkManager/resolv.conf
systemd-resolved 下怎么永久设置 DNS
如果你用的是默认启用 systemd-resolved 的系统(多数桌面版),直接改配置文件比动 resolv.conf 可靠:
- 全局 DNS(所有连接):
sudo systemd-resolve --set-dns=8.8.8.8 --interface=lo不行,得改配置文件:/etc/systemd/resolved.conf中取消注释并修改DNS=8.8.8.8 1.1.1.1,然后sudo systemctl restart systemd-resolved - 按接口指定(如只给
eth0设 DNS):在/etc/systemd/network/10-eth0.network里写:[Match] Name=eth0 [Network] DNS=8.8.8.8
- 注意:改完要
sudo systemd-resolve --flush-caches清缓存,否则旧记录还在
改完 DNS 却不生效?几个硬核排查点
改了配置但 ping google.com 还是超时,大概率不是 DNS 问题本身,而是中间环节卡住了:
-
dig @8.8.8.8 google.com能通,但dig google.com不行 → 说明本地 resolver(如systemd-resolved)没把请求转发出去,检查resolvectl status输出里的 “Current Scopes” 是否包含 “DNS” -
curl -v https://google.com报 “Could not resolve host” → 先试getent hosts google.com,如果返回空,说明 libc 没走systemd-resolved的 stub,可能/etc/nsswitch.conf里hosts:行漏了resolve - 某些容器或 snap 应用自带 DNS 隔离,它们不读主机的
resolv.conf,得单独配(比如 Docker 启动时加--dns=8.8.8.8)
/etc/resolv.conf 已经不是真相入口——它只是个出口,背后连着哪条管道,得先用 resolvectl status 或 ss -tulpn 看清。










