直接修改 /etc/resolv.conf 失效是因为该文件通常由 networkmanager、systemd-resolved 或 netplan 等服务动态管理,实际是软链接或自动生成的;应先运行 cat /etc/resolv.conf、systemctl is-active systemd-resolved 和 ls /etc/netplan/*.yaml 2>/dev/null 判断管理服务,再通过对应工具(如 nmcli、resolvectl 或 netplan)配置 dns。

/etc/resolv.conf 改了就失效?不是你手速慢,是系统根本没打算让你直接改它。
怎么判断谁在管 DNS?先跑这三行命令
别急着改文件,先看清楚是谁在背后写 /etc/resolv.conf:
-
cat /etc/resolv.conf—— 如果开头有# Generated by NetworkManager,说明NetworkManager在主控 -
systemctl is-active systemd-resolved—— 返回active表示systemd-resolved已启用且优先级更高(尤其常见于 Ubuntu Server、Debian 12+、Fedora) -
ls /etc/netplan/*.yaml 2>/dev/null或cat /etc/network/interfaces 2>/dev/null—— 有 YAML 文件或dns-nameservers行,说明走netplan或传统ifupdown
这三步漏掉任何一条,后面所有操作都可能白忙活——改完 5 分钟后被覆盖是常态,不是权限问题。
NetworkManager 管着 DNS 怎么改?用 nmcli,别碰图形界面
桌面版 Ubuntu/Fedora/多数云镜像默认走这条路。图形界面容易漏掉关键开关,nmcli 才可靠:
- 查当前连接名:
nmcli connection show --active | awk 'NR==2 {print $1}'(输出类似Wired connection 1) - 设 DNS(覆盖式,不是追加):
sudo nmcli connection modify "Wired connection 1" ipv4.dns "223.5.5.5 119.29.29.29" - 关自动获取(必须!否则 DHCP 会把你的 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"
验证:nmcli device show | grep DNS 应该显示你刚设的地址;resolvectl dns(如果 systemd-resolved 活着)会显示 Global 下的值,但注意:此时 NetworkManager 会把 DNS 同步给 resolved,所以两者可能一致,不代表你在用 resolved 的配置。
systemd-resolved 管着 DNS 怎么改?改 /etc/systemd/resolved.conf,别动 /etc/resolv.conf
/etc/resolv.conf 很可能是符号链接(指向 /run/systemd/resolve/stub-resolv.conf),直接编辑无效:
- 临时改(重启即丢):
resolvectl dns eth0 8.8.8.8 1.1.1.1(把eth0换成你的真实网卡名) - 永久改:编辑
/etc/systemd/resolved.conf,取消注释并修改DNS=行,例如:DNS=1.1.1.1 223.6.6.6 - 可选:加
FallbackDNS=做兜底,调试时建议关DNSSEC=(设为off),某些私有 DNS 会因验证失败静默失败 - 生效:
sudo systemctl restart systemd-resolved
验证:resolvectl status eth0 看 “DNS Servers” 行是否更新;systemd-resolve --status 已废弃,用 resolvectl 替代。
Netplan 用户必须改 YAML,nmcli 和 resolvectl 都不生效
Ubuntu Server 17.10+ 默认用 netplan,它完全不读 /etc/resolv.conf,也不响应 nmcli 或 resolvectl 的 DNS 设置(除非你手动禁用 renderer: networkd 并切回 NetworkManager):
- 找配置文件:
ls /etc/netplan/*.yaml(常见是01-network-manager-all.yaml或50-cloud-init.yaml) - 在对应网卡块下加
nameservers,例如:
network:
ethernets:
eth0:
dhcp4: true
nameservers:
addresses: [223.5.5.5, 119.29.29.29]
保存后运行:sudo netplan apply。注意:不要用 sudo netplan generate,它只生成中间文件,不生效。
复杂点在于,有些发行版(如 CentOS Stream 9)混用 NetworkManager 和 netplan,或者 cloud-init 覆盖配置——这时候得看 /var/log/cloud-init.log 里有没有 DNS 相关的 override 记录。











