
在 Linux 系统中,DNS 并不仅仅是“把域名翻译成 IP 地址”这么简单。它涉及分层的解析过程、缓存机制以及现代系统中的解析组件。理解其原理与实践,不仅能帮助我们正确配置,还能在排错和优化中少走弯路。
以 www.example.com 为例:
浏览器调用系统接口 (getaddrinfo)。Stub Resolver 先查本地缓存。缓存未命中 → 查 /etc/hosts。若无结果 → 向 /etc/resolv.conf 中配置的递归解析器发请求。递归解析器开始迭代: 先问 根服务器 → 获取 .com TLD 服务器地址。再问 .com 服务器 → 获取 example.com 权威服务器地址。最后问 权威服务器 → 得到 A/AAAA 记录。 结果返回 → 缓存 → Stub Resolver → 应用程序。浏览器拿到 IP,建立连接。缓存与 TTL 是加速关键:很多查询会直接命中递归解析器或本地缓存。
Linux 的 DNS 架构已经演进,不再是直接改 /etc/resolv.conf 那么简单。
/etc/hosts:静态映射,优先级高,常用于测试或临时解析。/etc/nsswitch.conf:定义查询顺序,典型配置:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
files → 查 /etc/hostsdns → 使用递归解析器myhostname → 解析本地主机名
/etc/resolv.conf:传统解析器配置文件。但在现代系统中,往往是 systemd-resolved 的符号链接。systemd-resolved:
提供本地 DNS Stub Listener (127.0.0.53)。内置缓存。支持 DNSSEC 验证。可启用 DNS-over-TLS。可多链路配置不同接口的 DNS。管理工具:resolvectl
NetworkManager:
从 DHCP 或手动配置获取 DNS。动态更新 systemd-resolved。GUI 或 nmtui 方式配置最安全。
调用关系图:
应用程序 → glibc (getaddrinfo) → nsswitch → (/etc/hosts 或 systemd-resolved @127.0.0.53) → 递归解析器
sudo resolvectl dns eth0 1.1.1.1 8.8.8.8
sudo resolvectl dnsovertls eth0 yes
resolvectl status
sudo systemctl enable --now systemd-resolved
查看缓存:
resolvectl statistics
清空缓存:
sudo resolvectl flush-caches
sudo resolvectl dns eth0 1.1.1.1 8.8.8.8
sudo resolvectl dnsovertls eth0 yes
resolvectl status
dig example.com
dig +trace example.com
dig @8.8.8.8 example.com MX
nslookup:传统工具
nslookup example.com
host:简洁工具
host example.com
host 8.8.8.8
resolvectl:systemd-resolved 专用
resolvectl query example.com
resolvectl status
Linux DNS 的配置与调优,关键点在于:
理解原理:递归解析、权威服务器、缓存和 TTL。配置方式:优先用 NetworkManager 或 resolvectl,避免手改 /etc/resolv.conf。安全性:推荐开启 DNSSEC 与 DoT/DoH。性能优化:利用 systemd-resolved 的缓存能力。排错能力:熟练掌握 dig、host、resolvectl 等工具。做到以上几点,你的 Linux 系统将拥有一个 快速、稳定、安全 的 DNS 解析环境。