在 Linux 系统中配置 DNS 地址,最推荐且一劳永逸的方式是修改 /etc/resolv.conf 文件或使用系统自带的网络管理工具(如 nmcli),但需要注意,不同发行版和网络管理机制的持久化策略差异显著,直接编辑 resolv.conf 往往会被 systemd-resolved 或 NetworkManager 覆盖。正确的做法是先判断系统使用哪种 DNS 管理机制,再选择对应的持久化配置方案,否则重启后配置将丢失。
本文将按照「先诊断、再配置、后验证」的金字塔逻辑,为你提供一套从入门到精通的完整解决方案,并附带真实的生产环境经验案例。
诊断当前 DNS 管理机制
在动手修改之前,必须先搞清楚系统里的“DNS 管家”是谁,执行以下命令快速判断:
- 检查是否存在
systemd-resolved:systemctl status systemd-resolved - 检查是否安装 NetworkManager:
systemctl status NetworkManager - 查看当前生效的 DNS:
cat /etc/resolv.conf
经验判断:/etc/resolv.conf 头部有 # Generated by NetworkManager 或 # This file is managed by systemd-resolved 字样,说明该文件是动态生成的,直接编辑无效。
推荐配置方案(按场景选择)
使用 NetworkManager 的桌面或服务器系统(如 Ubuntu Desktop、RHEL/CentOS 默认)
推荐使用 nmcli 命令,配置后立即生效且永久保存。
-
查看当前连接名称:
nmcli connection show -
为指定连接设置 DNS(替换实际连接名):
nmcli connection modify "Wired connection 1" ipv4.dns "223.5.5.5 119.29.29.29"nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes
-
重启连接生效:
nmcli connection down "Wired connection 1" && nmcli connection up "Wired connection 1" -
验证:
cat /etc/resolv.conf
使用 systemd-resolved 的系统(如 Ubuntu 18.04+)
推荐通过配置 /etc/systemd/resolved.conf 来设置全局 DNS。
-
编辑文件:
sudo vim /etc/systemd/resolved.conf -
在
[Resolve]段落下填入:DNS=223.5.5.5 119.29.29.29 FallbackDNS=8.8.8.8 -
重启服务:
sudo systemctl restart systemd-resolved -
将
/etc/resolv.conf链接到 systemd 管理的文件:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
注意:如果你希望完全绕过 systemd-resolved,也可以直接停用该服务并手动编辑 /etc/resolv.conf,但会造成部分基于 systemd-resolved 的域名解析服务异常,不建议在复杂网络环境中这样做。
无 NetworkManager 的轻量系统(如 Docker 宿主机、最小化 Debian)
直接编辑 /etc/resolv.conf,并配置网络脚本或 resolvconf 实现持久化。
-
临时生效:
sudo vim /etc/resolv.conf写入:
nameserver 223.5.5.5 nameserver 119.29.29.29 -
永久生效(Debian/Ubuntu 下使用
/etc/network/interfaces):iface eth0 inet dhcp dns-nameservers 223.5.5.5 119.29.29.29 -
如果是静态 IP,则在同文件显式指定。
验证 DNS 配置是否生效
配置完成后,用以下命令确认 DNS 已经按预期工作:

cat /etc/resolv.conf检查实际使用的 DNS 服务器nslookup example.com查询解析结果dig example.com | grep SERVER查看实际被查询的 DNS 服务器 IP
如果发现系统还在使用旧 DNS,优先检查 DHCP 是否覆盖了配置,并在 NetworkManager 或 dhclient 中设置 supersede domain-name-servers 或以 ipv4.ignore-auto-dns yes 方式忽略自动下发 DNS。
酷番云实战经验案例
我们曾服务过一家使用酷番云弹性云主机的客户,其业务系统基于 CentOS 7,程序里硬编码了某个公网域名解析,但服务器频繁出现解析超时。初步排查发现系统默认使用云平台 DHCP 下发的 DNS(即 169.254.0.53 这种链路本地地址),且服务器内网访问依赖自定义内网 DNS 才能解析集群主机名,直接修改 /etc/resolv.conf 后一旦网络重启便失效。
解决方案分三步:
-
在酷番云控制台关闭该主机的 DHCP 自动 DNS 下发,改为静态指定。
-
登录主机使用
nmcli手动设置双 DNS(内网优先、公网备用):nmcli connection modify eth0 ipv4.dns "10.0.0.2 223.5.5.5"nmcli connection modify eth0 ipv4.ignore-auto-dns yes -
通过
chattr +i /etc/resolv.conf对文件加锁,防止任何程序意外改写。
这样既保证了内网解析速度,又提供了公网域名兜底方案,后续客户业务始终未再出现 DNS 解析中断。在混合云或内网环境,务必优先配置内网 DNS 地址,否则会出现「外网通、内网不通」的诡异故障。
常见问题与避坑指南
- 不要盲目修改
/etc/resolv.conf
,先确认文件是否被系统自动管理。
- DNS 服务器不要只设一个,至少两个,避免单点故障。
- 内网和公网 DNS 分开配置,如果用同一个解析器,可能导致内网域名解析超时。
- 注意 DNS 顺序:第一个 nameserver 会被优先使用,把低延迟、高可靠的那个放前面。
- 修改后建议立刻
systemctl restart networking(或对应网络服务)再测试,不要缓存旧的解析结果。
相关问答
问 1:为什么我改了 /etc/resolv.conf,重启后又恢复成原来的了?
因为你的系统采用了动态 DNS 管理机制,最典型的是 NetworkManager 或 systemd-resolved,NetworkManager 会在网络状态变化时重新生成 resolv.conf,而 systemd-resolved 会通过 symlink 指向它自己的运行时文件,你需要按上述「场景一」或「场景二」的方法,使用 nmcli 或编辑 /etc/systemd/resolved.conf 来持久化设置,也可以用 chattr +i 防止文件被改写,但这不是正规做法,遇到系统升级或网络管理变更时容易引发意外。
问 2:配置多个 DNS 服务器时,Linux 是如何选择使用的?
Linux 的 resolv.conf 在传统 glibc 解析器中按顺序尝试,首先使用第一个 nameserver,如果超时(默认 5 秒)或返回 SERVFAIL,才继续尝试下一个,如果第一个 DNS 正常但解析记录不存在(NXDOMAIN),则不会切换到第二个,因此多个 DNS 不能简单理解为负载均衡,而是故障转移,新版本系统(如 systemd-resolved)会综合考虑响应时间和历史状态,但总体原则仍然是“第一个优先”,所以把最快、最稳定的 DNS 放在首位是正确策略。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/731740.html

