ifconfig 看不到dns

我敲下 ifconfig,滚动输出里只有 eth0 的 IP、掩码、MTU,翻遍每一行都找不到 DNS 的影子。这不是 bug,是 ifconfig 压根就不管这摊事。它来自 net-tools 工具包,诞生于上世纪 90 年代初,那时候 DNS 配置还写在 /etc/resolv.conf 里,网络接口和域名解析是两条平行线,谁也不挨谁。

后来 iproute2 出现了,ip addr 取代了 ifconfig 的大部分功能,但 ip 命令同样不显示 DNS。你试试 ip addr show,输出里照样只有链路层和网络层的信息。这俩工具的设计哲学一致:只管接口状态,不管上层配置。DNS 属于应用层解析器的事,内核不参与,自然不归它们管。

真正能看到 DNS 的地方是 nmcli 或者 resolvectl。NetworkManager 管理的系统,nmcli dev show eth0 里 IP4.DNS 字段清清楚楚列着服务器地址。systemd 系的发行版,resolvectl status 直接告诉你哪个接口用了哪个 DNS,还能看到当前生效的搜索域。我办公电脑跑的是 Ubuntu 22.04,NetworkManager 接管网络,ifconfig 输出干净得像刚擦过的黑板,但 nmcli 里躺着两个公司内网 DNS 和两个公共 DNS。

有个坑得提醒你:如果你手动改了 /etc/resolv.conf 但没重启 NetworkManager,nmcli 显示的可能是旧值。这时候别慌,resolvectl status 会告诉你 systemd-resolved 实际用的是哪份配置。我上周排查一个域名解析超时,就是被这俩工具显示不一致给坑了半小时——nmcli 说 DNS 是 10.0.0.2,resolvectl 说实际生效的是 127.0.0.53 这个本地缓存地址。

如果你用的是纯静态配置的老式服务器,不跑 NetworkManager 也没有 systemd-resolved,那 DNS 在哪看?直接 cat /etc/resolv.conf。这文件是传统 Unix 的遗产,至今仍是绝大多数 Linux 发行版最终读取的 DNS 配置源头。哪怕 systemd-resolved 在跑,它也会把上游 DNS 写进这个文件(通常指向 127.0.0.53 这个回环地址)。所以你要是看到 nameserver 127.0.0.53 别觉得奇怪,那是 systemd 的魔法。

最后说个冷知识:ifconfig 输出里其实藏着一个跟 DNS 沾边的字段——如果你配置了 DHCP,它可能会显示 DHCP server 的 IP,但那是给你分配 IP 的服务器地址,不是域名服务器。别搞混了。想快速确认当前系统用的哪个 DNS,直接 dig example.com 看 SERVER 行,或者 nslookup example.com 看 Server 字段,比翻任何配置文件都直观。工具用对了,问题就少一半。