直接改 /etc/resolv.conf 最快但不持久,因常被 networkmanager、systemd-resolved 或 dhcp 客户端覆盖;需先用 ls -l /etc/resolv.conf 判断是否为符号链接,并通过 systemctl is-active 确认管理服务,再按机制(systemd-resolved 或 networkmanager)进行持久化配置。

/etc/resolv.conf 最快,但大概率重启或重连网络后失效——它常被 NetworkManager、systemd-resolved 或 DHCP 客户端覆盖。真要持久生效,得看系统用的是哪套网络管理机制。
检查 /etc/resolv.conf 是不是被动态管理的
先运行:ls -l /etc/resolv.conf。如果输出里带 ->(比如指向 /run/systemd/resolve/stub-resolv.conf 或 /run/NetworkManager/resolv.conf),说明它是符号链接,手动编辑没用。
再跑:systemctl is-active systemd-resolved 和 systemctl is-active NetworkManager,确认哪个服务在管 DNS。
- 两个都 active?优先以
systemd-resolved为准(现代发行版默认) - 只有
NetworkManageractive?走它的配置链路 - 两个都 inactive?那
/etc/resolv.conf才是真实配置文件,可直接改
用 systemd-resolved 永久设置 DNS
这是目前主流桌面和服务器发行版(Ubuntu 20.04+、Fedora、Debian 12+)的默认方案,统一接管解析逻辑。
编辑主配置:sudo nano /etc/systemd/resolved.conf
- 取消注释并修改
DNS=行,例如:DNS=223.5.5.5 8.8.8.8 - 如需为特定域名走指定 DNS,加一行:
Domains=~example.com(注意波浪号) - 保存后必须执行:
sudo systemctl restart systemd-resolved
验证是否生效:resolvectl status,看 “DNS Servers” 下是否列出你配的地址;再试 resolvectl query example.com 看解析路径。
用 NetworkManager 配置(尤其桌面环境)
如果你用图形界面联网,或者 nmcli 是主力工具,硬改 /etc/resolv.conf 会被它秒覆盖。
查当前连接名:nmcli con show --active | awk 'NR==1{next} {print $1}'
然后设 DNS:sudo nmcli con mod "你的连接名" ipv4.dns "223.5.5.5 114.114.114.114"
- 必须关掉自动获取:
sudo nmcli con mod "你的连接名" ipv4.ignore-auto-dns yes - 重启连接才生效:
nmcli con down "你的连接名" && nmcli con up "你的连接名" - 不记得连接名?用
nm-connection-editor图形界面点选更稳妥
直接写 /etc/resolv.conf 的适用场景和风险
仅适用于:极简系统(如某些容器宿主机、CentOS 7 无 NM 场景)、或临时调试。
操作就是:sudo tee /etc/resolv.conf <br><code>nameserver 223.5.5.5nameserver 8.8.8.8options timeout:1EOF
- 别漏掉
options行——能避免某些超时导致的解析卡顿 - 改完立刻生效,但下次
dhclient续租或NetworkManager重载就会回滚 - 若系统启用了
resolvconf(常见于 Debian/Ubuntu),还得配合resolvconf -u刷新
真正容易被忽略的点是:DNS 配置不是孤立的。如果你同时开了 systemd-resolved 又手动改了 /etc/resolv.conf,getaddrinfo() 调用可能走 stub resolver(127.0.0.53),而 nslookup 却直连你写的 nameserver——结果不一致,排查时会误判。











