Linux 上 DNS 解析不了怎么办?

在 systemd 系 Linux 上定位并修复 DNS 解析故障:确认网卡拿到 IP、查看 systemd-resolved 实际在用的解析器、用 dig 直接查询,再清缓存或用 nmcli 换成可信的 DNS。

Linuxifconfig 网卡配置网络解析器systemd-resolved DNS 解析故障排查IP低风险
先确认网卡确实拿到了正常的 IP 地址,再查 systemd-resolved 实际生效的 DNS 服务器——配置文件里写的和真正在用的经常不是同一个。

快速开始

Linux 上的 DNS 故障特别会误导人:链路没通、解析器连不上、缓存里存着旧记录,报出来的错误却都是同一句「无法解析主机名」。本文按照运维排查的真实顺序来走——先看链路,再看实时解析器状态,直接发一次查询验证,然后清缓存或换 DNS,最后确认域名真的能解析。每一步都是只读或者可回退的操作。

症状

?直接 ping 1.1.1.1 这种 IP 是通的,但 ping 或 curl 域名时报 “Temporary failure in name resolution” 或 “Could not resolve host”。浏览器提示找不到服务器,apt、dnf、ssh 用域名失败、用 IP 却正常;有时还是时好时坏,或者只有部分域名解析不了。

先确认网卡真的拿到 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(域名确实不存在)和完全没有应答,这两者的处理方向完全不同。

Linux用 dig 查询 DNS 记录低风险步骤 3

查询域名的任意 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 又推回来的那几个。

Linux用 nmcli 修改 DNS 服务器低风险步骤 5

把某个 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 解析已经恢复正常,问题解决。

Linux用 host 命令快速查询 DNS低风险步骤 6

使用容易被遗忘的 host 工具——dig 的精简版——一行一条地解析域名,或查询 MX、TXT、CNAME 记录。

命令
$ host -t A example.com
!用 nmcli 改 DNS 是在修改正在使用的 NetworkManager 连接档案:连接名写错只会静默无效,但如果改错了网卡,可能直接把名称解析彻底弄断。如果写死的 DNS 地址本身不可达、又关掉了自动下发,本机就完全没有解析能力了。操作前留一个控制台或第二个会话,确保随时能改回来。

如何确认已解决

把之前解析失败的域名,以及一个最近没查过的域名各查一遍,两者都应该立刻返回地址。过几分钟再查一次,确认结果是稳定的,而不是碰巧成功了一次。

一键全部撤销

上面每一条命令都可以撤销。按此顺序执行即可全部还原。

一键全部撤销
$ nmcli con mod 'MyWiFi' ipv4.ignore-auto-dns no && nmcli con mod 'MyWiFi' ipv4.dns '' && nmcli con up 'MyWiFi'

执行前请先确认——部分步骤之间可能并非相互独立。

来源

  • ip(8) — Linux manual page
    man7.org · technical · 2026-09-17
    依据: Documents `ip -br addr` as the brief, one-line-per-interface output format of the ip command
  • resolvectl(1) — manual page
    Arch Linux · community · 2026-09-17
    依据: resolvectl status shows the DNS servers and domains configured per link by systemd-resolved.
  • systemd-resolved — Arch Wiki
    Arch Linux · community · 2026-09-17
    依据: resolvectl status is the way to inspect which DNS servers systemd-resolved is using per interface.
  • dig(1) — DNS lookup utility
    Ubuntu manpages · vendor-doc · 2026-09-17
    依据: 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
    man7.org · technical · 2026-09-17
    依据: Documents `resolvectl flush-caches` which flushes all DNS caches of systemd-resolved, and `resolvectl statistics` to view cache size
  • NetworkManager — Arch Wiki
    Arch Linux · community · 2026-09-17
    依据: 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
    Ubuntu · community · 2026-09-17
    依据: 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
    Ubuntu manpages · technical · 2026-09-17
    依据: Documents host as a simple DNS lookup utility and the -t option for selecting the query type (A, MX, TXT, CNAME).

最后验证: 2026-09-22

相关指南