linux系统中真正管理dns的是networkmanager、systemd-resolved或netplan/ifupdown等服务,而非直接修改/etc/resolv.conf;应先通过cat /etc/resolv.conf、systemctl is-active systemd-resolved和ls /etc/netplan/*.yaml三步判断实际管理者,再按对应方式配置dns。

直接改 /etc/resolv.conf 通常无效——它大概率是符号链接或被服务自动生成,手动写入后几分钟就被覆盖。真正起作用的,是你系统里实际在管理 DNS 的那个服务。
怎么判断谁在管 DNS?
别猜,先执行这三行命令:
-
cat /etc/resolv.conf—— 看开头有没有# Generated by NetworkManager或# systemd-resolved -
systemctl is-active systemd-resolved—— 返回active表示它正在运行且很可能接管了 DNS -
ls /etc/netplan/*.yaml 2>/dev/null—— 有输出说明走 netplan;没输出再试cat /etc/network/interfaces 2>/dev/null | grep dns-nameservers
漏掉任意一条,后续配置都可能白忙活。
NetworkManager 在管 DNS 怎么设 8.8.8.8?
Ubuntu 桌面版、Fedora、多数云镜像默认走这条路。图形界面容易关不掉自动获取,必须用 nmcli:
- 查当前连接名:
nmcli connection show --active | awk 'NR==2 {print $1}' - 设 DNS(覆盖式):
sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 8.8.4.4" - 关自动获取(关键!否则 DHCP 会冲掉):
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"
验证:nmcli device show | grep DNS 应该显示你设的地址;resolvectl dns 显示的是 systemd-resolved 的视角,不一定代表你当前解析走的路径。
systemd-resolved 在管 DNS 怎么设 8.8.8.8?
Ubuntu Server 22.04+、Debian 12+、Fedora 默认启用,优先级高于 /etc/resolv.conf。改它自己的配置文件:
- 编辑:
sudo nano /etc/systemd/resolved.conf - 取消注释并修改:
DNS=8.8.8.8 8.8.4.4(注意空格分隔,不是逗号) - 可选加备用:
FallbackDNS=223.5.5.5 119.29.29.29 - 重启服务:
sudo systemctl restart systemd-resolved
注意:/etc/resolv.conf 很可能仍是软链接(如指向 /run/systemd/resolve/stub-resolv.conf),不要动它。
netplan 或 ifupdown 配置里怎么加 8.8.8.8?
Ubuntu Server(尤其云环境)、旧 Debian/CentOS 可能用这套。DNS 必须写在接口定义里,单独改 resolv.conf 无意义:
- netplan:编辑
/etc/netplan/*.yaml,在对应网卡下加:nameservers: addresses: ["8.8.8.8", "8.8.4.4"]
- ifupdown:编辑
/etc/network/interfaces,在iface eth0 inet dhcp或static块里加:dns-nameservers 8.8.8.8 8.8.4.4 - 改完都要应用:
sudo netplan apply或sudo ifdown eth0 && sudo ifup eth0
最容易被忽略的是:DHCP 场景下,即使写了 dns-nameservers,也要配合 dns-search 或确保 dhclient.conf 没有 supersede domain-name-servers 冲突项。











