要修改DNS必须先确认管理服务:NetworkManager(查看resolv.conf头注释或nmcli)、systemd-resolved(systemctl检查)或网卡配置(ifcfg-*或interfaces),再按对应方式配置,否则修改会被覆盖。

/etc/resolv.conf 里写 nameserver 不一定生效——它常被 NetworkManager 或 systemd-resolved 覆盖。真要改 DNS,得先搞清谁在管解析,再往对应位置写。
怎么判断当前系统由谁管理 DNS
别跳过这步,否则改完 5 分钟就回滚。运行这三条命令看输出:
-
cat /etc/resolv.conf—— 如果开头有# Generated by NetworkManager,说明NetworkManager在写这个文件 -
systemctl is-active systemd-resolved—— 返回active表示该服务启用且优先级更高(Ubuntu 20.04+、Debian 11+ 默认) -
ls /etc/sysconfig/network-scripts/ifcfg-*(RHEL/CentOS)或cat /etc/network/interfaces(Debian/Ubuntu 传统)—— 若含DNS1=或dns-nameservers,说明走网卡配置层
注意:/etc/resolv.conf 是软链接还是普通文件也很关键。如果它指向 /run/systemd/resolve/stub-resolv.conf,那直接编辑它毫无意义。
NetworkManager 管 DNS 时怎么设
这是桌面版 Ubuntu、Fedora 和多数云服务器的默认路径。图形界面容易漏掉“禁用自动获取”这步,必须用 nmcli 显式关掉。
- 查连接名:
nmcli connection show,记下当前激活的连接(如Wired connection 1或System eth0) - 设 DNS:
sudo nmcli connection modify "Wired connection 1" ipv4.dns "223.5.5.5 119.29.29.29" - 关自动覆盖:
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,用 nmcli device show | grep DNS 或 resolvectl dns(若 systemd-resolved 同时启用)。
systemd-resolved 启用时怎么配
/etc/resolv.conf 往往只是个软链,编辑它完全无效。必须改主配置文件并重启服务。
- 编辑:
sudo nano /etc/systemd/resolved.conf - 取消注释并填值:
DNS=223.5.5.5 119.29.29.29;如需 fallback,加FallbackDNS=114.114.114.114 - 重启:
sudo systemctl restart systemd-resolved - 确认软链正确:
ls -l /etc/resolv.conf应显示指向/run/systemd/resolve/stub-resolv.conf
如果之前手动改过 /etc/resolv.conf,记得删掉或还原,否则可能和 resolved 冲突。
临时测试 DNS 是否可用
不改任何配置,只验证某个 DNS 地址是否通、响应快不快,适合排查连通性或响应延迟。
- 单次查询指定 DNS:
nslookup google.com 8.8.8.8 - 清本地缓存(若启用
systemd-resolved):sudo systemd-resolve --flush-caches - 临时替换某接口 DNS(仅当前会话):
sudo resolvectl dns eth0 223.5.5.5(把eth0换成你的真实网卡名)
真正容易被忽略的是:不同服务之间存在优先级嵌套。比如 NetworkManager 和 systemd-resolved 同时启用时,resolved 通常接管最终解析,但 NetworkManager 仍可能往它里面推 DNS 列表——所以关 ignore-auto-dns 这一步,比改配置本身还关键。


















