Linux 上 DNS 解析不了怎么办?
在 systemd 系 Linux 上定位并修复 DNS 解析故障:确认网卡拿到 IP、查看 systemd-resolved 实际在用的解析器、用 dig 直接查询,再清缓存或用 nmcli 换成可信的 DNS。
快速开始
Linux 上的 DNS 故障特别会误导人:链路没通、解析器连不上、缓存里存着旧记录,报出来的错误却都是同一句「无法解析主机名」。本文按照运维排查的真实顺序来走——先看链路,再看实时解析器状态,直接发一次查询验证,然后清缓存或换 DNS,最后确认域名真的能解析。每一步都是只读或者可回退的操作。
症状
先确认网卡真的拿到 IP 地址了
很多时候「DNS 解析不了」其实是网根本没通。先用一行命令把所有网卡的状态和地址列出来,看当前在用的那块网卡是不是 UP、有没有正常的 IPv4 地址。如果只看到 169.254.x.x 这种自动分配的链路本地地址,或者干脆没有地址,说明 DHCP 没成功,问题出在链路而不是 DNS,得先把网络接通。只有拿到了正常地址,再往下查解析器才有意义。
一条命令就能把每个网卡的名称、状态和 IPv4/IPv6 地址打印成简短表格——这是取代又长又难记的 `ifconfig` 和冗长的 `ip addr` 输出的现代做法。
$ ip -br a看看系统实际在用哪些 DNS 服务器
在 systemd 系发行版上,配置文件里写的 DNS 和实际生效的 DNS 经常不是一回事。查一下 systemd-resolved 的实时状态,重点看当前连接对应的 DNS Servers 那一行。如果这里是空的、只剩下一个早就失效的地址,或者指向一台已经连不上的路由器,那问题就找到了。顺便也能看出系统是不是在前面套了一层本地 stub 解析器。
显示 systemd-resolved 实际生效的各连接解析设置。
$ resolvectl status | grep -A2 'DNS Servers'直接向解析器发一次查询,定位断在哪一环
挑一个你确定存在的域名,做一次 A 记录查询,然后仔细看返回内容。能立刻拿到答案,说明解析器和上游链路都正常,问题就在本机——可能是缓存过期,也可能是某个程序的行为异常。如果是超时或者 SERVFAIL,说明配置的那台服务器连不上或拒绝服务;这时再拿 1.1.1.1 这类公共解析器对比一次,就能判断故障在外部还是在本机出口。同时要分清 NXDOMAIN(域名确实不存在)和完全没有应答,这两者的处理方向完全不同。
查询域名的任意 DNS 记录类型,既可以输出精简结果,也可以查看包含报文头和 TTL 的完整应答。
$ dig example.com A +short清掉本机的 DNS 缓存
如果查询能正常发出去,但拿回来的还是旧地址或者明显错误的答案,那多半是 systemd-resolved 的 stub 缓存在作怪——上游记录早就改了,本机还留着老条目。清缓存没有任何破坏性,不用重启服务,执行完立刻生效。这是成本最低的一步,先试它再考虑改配置;如果清完之后域名马上就能解析,问题到此为止。
在基于 systemd 的 Linux(Ubuntu、Fedora、Debian 12+)上,本地 DNS 缓存由 systemd-resolved 管理——清缓存命令从旧的 systemd-resolve 改名后,很多人总想不起来。
$ resolvectl flush-caches把连接改成使用可控的 DNS 服务器
如果 DHCP 或路由器下发的解析器挂了、或者会对查询做拦截,最直接的办法是给网络连接档案写死几个可信的 DNS 地址,然后重新激活这条连接。注意连接名必须和 NetworkManager 里显示的一模一样,改错档案是不会生效的,而且不会有任何提示。设置完再查一次实时解析状态,确认生效的是你新填的地址,而不是 DHCP 又推回来的那几个。
把某个 Wi-Fi/有线连接改成更快或更注重隐私的解析服务,例如 1.1.1.1。
$ nmcli con mod 'MyWiFi' ipv4.dns '1.1.1.1 8.8.8.8' && nmcli con mod 'MyWiFi' ipv4.ignore-auto-dns yes && nmcli con up 'MyWiFi'▾ 撤销
$ nmcli con mod 'MyWiFi' ipv4.ignore-auto-dns no && nmcli con mod 'MyWiFi' ipv4.dns '' && nmcli con up 'MyWiFi'确认域名已经能正常解析
把之前解析失败的那个域名再查一遍,确认应答里出现了具体的地址。最好多测几个域名,并且特意选一个最近没查过的,这样才能验证是真实查询成功,而不是命中了缓存。如果这些查询都能快速、稳定地返回结果,说明 DNS 解析已经恢复正常,问题解决。
使用容易被遗忘的 host 工具——dig 的精简版——一行一条地解析域名,或查询 MX、TXT、CNAME 记录。
$ host -t A example.com如何确认已解决
把之前解析失败的域名,以及一个最近没查过的域名各查一遍,两者都应该立刻返回地址。过几分钟再查一次,确认结果是稳定的,而不是碰巧成功了一次。
一键全部撤销
上面每一条命令都可以撤销。按此顺序执行即可全部还原。
$ nmcli con mod 'MyWiFi' ipv4.ignore-auto-dns no && nmcli con mod 'MyWiFi' ipv4.dns '' && nmcli con up 'MyWiFi'执行前请先确认——部分步骤之间可能并非相互独立。
来源
- ip(8) — Linux manual page依据: Documents `ip -br addr` as the brief, one-line-per-interface output format of the ip command
- resolvectl(1) — manual page依据: resolvectl status shows the DNS servers and domains configured per link by systemd-resolved.
- systemd-resolved — Arch Wiki依据: resolvectl status is the way to inspect which DNS servers systemd-resolved is using per interface.
- dig(1) — DNS lookup utility依据: The dig manual documents querying a name for a given type (A, MX, etc.) and the +short option to print a terse answer.
- resolvectl(1) — Linux manual page依据: Documents `resolvectl flush-caches` which flushes all DNS caches of systemd-resolved, and `resolvectl statistics` to view cache size
- NetworkManager — Arch Wiki依据: Custom DNS servers are set per connection with nmcli con mod <name> ipv4.dns, and ignore-auto-dns stops DHCP-provided DNS overriding them.
- nmcli(1) — Ubuntu manual page依据: nmcli con mod modifies connection properties such as ipv4.dns and ipv4.ignore-auto-dns; nmcli con up reactivates the profile to apply them.
- host(1) — DNS lookup utility依据: Documents host as a simple DNS lookup utility and the -t option for selecting the query type (A, MX, TXT, CNAME).
最后验证: 2026-09-22