linux配置dns三种方式
改DNS这事,置d种方说大不大,置d种方说小也不小。置d种方上周一台CentOS 7的置d种方测试机突然解析不了内网域名,我登上去看了一眼 /etc/resolv.conf,置d种方里面孤零零一行 nameserver 8.8.8.8——内网DNS压根没配上。置d种方这种问题排查起来快,置d种方但配DNS的置d种方方式有好几种,用错了场景,置d种方重启一次就白干。置d种方下面按我实际踩过的置d种方坑,说三种常见做法。置d种方
直接改 /etc/resolv.conf:最快,置d种方也最容易丢
最直觉的置d种方做法就是编辑这个文件:
nameserver 223.5.5.5 nameserver 114.114.114.114 options timeout:1 attempts:2 保存,ping baidu.com 通了,置d种方收工。但问题在于,这个文件在很多发行版上是被 NetworkManager 或 systemd-resolved 接管的。你手动改完,网卡一重连、系统一重启,内容就被覆盖回去。我见过有人改完测试没问题,第二天上班发现全挂了,就是被覆盖了。
这招适合临时调试、容器里快速验证。真要长期生效,得看下面两种。
NetworkManager 接管:桌面和服务器都常见
CentOS 7/8、RHEL、Fedora 这类默认跑 NetworkManager 的系统,DNS 应该配在连接配置里,而不是直接写 resolv.conf。用 nmcli 最省事:
nmcli con mod "eth0" ipv4.dns "223.5.5.5 114.114.114.114" nmcli con mod "eth0" ipv4.ignore-auto-dns yes nmcli con up "eth0" 注意连接名不一定是 eth0,用 nmcli con show 查一下。第二行的 ignore-auto-dns 很关键——如果 DHCP 下发了 DNS,你不加这句,手动配的会被 DHCP 的覆盖掉。这个坑我踩过,配了半天没生效,最后发现是 DHCP 优先级更高。
改完 cat /etc/resolv.conf 能看到 NetworkManager 自动生成的内容,重启也不会丢。这是生产环境里我推荐的方式。
systemd-resolved:Ubuntu 18.04 之后的默认玩法
Ubuntu 从 18.04 开始默认启用 systemd-resolved,/etc/resolv.conf 通常是个指向 /run/systemd/resolve/stub-resolv.conf 的软链接,里面只有 127.0.0.53。你直接改这个软链接指向的文件,重启照样丢。
正确姿势是编辑 /etc/systemd/resolved.conf:
[Resolve] DNS=223.5.5.5 114.114.114.114 FallbackDNS=8.8.8.8 Domains=~. 然后重启服务:
systemctl restart systemd-resolved systemctl enable systemd-resolved 验证用 resolvectl status,比看 resolv.conf 靠谱。这里有个细节:Domains=~. 表示所有域名都走这个 DNS,不加的话某些情况下会走错。我第一次配的时候没加,内网域名解析正常,外网时好时坏,查了半天才定位到。
怎么选
临时调试——直接改 resolv.conf,别想太多。CentOS/RHEL 系长期使用——nmcli 配 NetworkManager。Ubuntu 18.04+——改 resolved.conf。判断依据很简单,看 ls -l /etc/resolv.conf 指向哪,看 systemctl status NetworkManager systemd-resolved 谁在跑。别凭记忆猜,每个系统版本默认行为都不一样,看一眼比猜十次快。
还有个经验:容器里(Docker/K8s)别去动宿主机的 DNS 配置,容器有自己的 resolv.conf,改了宿主机的反而可能把集群 DNS 搞乱。这种环境下 DNS 该由编排层管,手动插手通常是给自己找麻烦。









