概述

凌晨两点,告警炸了。服务连不上数据库,curl 超时,但 ping IP 通。你说这到底是网络问题还是应用问题?十有八九是 DNS 解析出了岔子。

DNS 解析是 Linux 系统最基础也是最容易被忽视的基础设施。平时没人关注它,一旦出问题,整个系统像突然失忆了一样——所有域名都认不出来。更恶心的是,DNS 问题表现千奇百怪:有的直接报 Temporary failure in name resolution,有的莫名其妙卡 5 秒,有的间歇性失败。如果不清楚解析链路,排查起来就是一通乱试。

这篇文章把 Linux DNS 解析的完整链路拆开讲:从 /etc/hosts 到 nsswitch,从 resolv.conf 到 systemd-resolved,从 dig 到 tcpdump。每个环节配实战案例,看完能在生产环境独立排查 DNS 问题。

Linux DNS 解析的完整链路

先搞清楚一个问题:当你在终端敲下 curl http://example.com 的时候,系统到底干了什么?

DNS 解析不是一步完成的,它经过多个层级。理解这条链路是排查问题的前提。打个比方:DNS 解析就像寄快递。你写的收件地址是"北京市朝阳区",快递员不会直接知道具体在哪——先查邮编分区,再查街道,最后查门牌号。DNS 也一样,一层一层往下找。

解析优先级

Linux 系统解析一个域名时,默认按以下顺序查找:

  1. 本地 hosts 文件/etc/hosts)——优先级最高,匹配到就直接返回
  2. DNS 缓存——如果系统装了 nscd 或 systemd-resolved,会先查缓存
  3. 配置的 DNS 服务器/etc/resolv.conf 中的 nameserver)——最后才走网络查询

但这个顺序不是写死的。真正控制解析顺序的是 /etc/nsswitch.conf 文件中的 hosts 行:

# 查看 nsswitch 配置
cat /etc/nsswitch.conf | grep hosts

# 典型输出
hosts:      files dns myhostname

这行配置的意思是:先查 files(/etc/hosts),再查 dns(DNS 服务器),最后用 myhostname 机制。如果顺序变成 dns files,系统会先走 DNS 查询,性能完全不同。

坑点:有些系统的 nsswitch.conf 里 hosts 行缺少 dns 关键字,结果系统永远不会走 DNS 查询,只认 hosts 文件里的记录。症状是 dig 正常但 curl 失败。

一次完整的 DNS 查询流程

curl http://example.com 为例,完整流程如下:

应用程序 (curl)
glibc getaddrinfo()        ← C 标准库的解析入口
    ├─→ /etc/nsswitch.conf  ← 决定查询顺序
    ├─→ /etc/hosts          ← 第一步:查本地 hosts 文件
    │   (匹配则直接返回)
    ├─→ nscd / systemd-resolved  ← 第二步:查本地缓存
    │   (命中缓存则直接返回)
    └─→ /etc/resolv.conf    ← 第三步:走 DNS 查询
    nameserver 指定的 DNS 服务器
    递归查询:根域 → TLD → 权威服务器
    返回 IP 地址

关键点:dignslookup 这两个工具不走 glibc,它们直接构造 DNS 协议包发往指定的 DNS 服务器。这就是为什么有时候 dig 正常但 curl 失败——两者走的路径不同。

resolv.conf 的行为细节

/etc/resolv.conf 是 DNS 查询的核心配置文件。看起来简单,但里面的门道不少:

# 典型的 resolv.conf
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com internal.example.com
options timeout:2 attempts:3
参数说明默认值生产建议
nameserverDNS 服务器地址至少配 2 个
search短域名补全后缀按实际域名配
domain本地域名与 search 互斥
options timeout单次查询超时(秒)5建议设 2
options attempts重试次数2建议设 3
options rotate轮询使用多个 nameserver关闭高可用场景开启

最坑的行为nameserver 支持最多 3 个 IPv4 地址(内核限制),第 4 个起被静默丢弃。而且它不是负载均衡——只有第一个超时后才会 fallback 到第二个。如果第一个 nameserver 配了内网 DNS 但网络不通,每次查询都要等 5 秒超时才会切到第二个。

踩坑实录:有次生产环境所有请求都卡 5 秒,排查发现 resolv.conf 第一个 nameserver 指向了一台已下线的 DNS 服务器。改为先配可用的,问题秒解。

systemd-resolved:朋友还是麻烦

现代 Linux 发行版(Ubuntu 18.04+、RHEL 8+、Fedora 33+)默认启用 systemd-resolved,它接管了 DNS 解析。好处是支持 DNS 缓存、DNS-over-TLS、每接口独立 DNS 配置。坏处是排查问题时多了一层中间人。

先确认系统是否在用 systemd-resolved:

# 方法1:看 resolv.conf 是不是符号链接
ls -l /etc/resolv.conf

# 如果输出类似下面,说明被 systemd-resolved 接管了
# lrwxrwxrwx 1 root root 39 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

# 方法2:看服务状态
systemctl is-active systemd-resolved

# 方法3:看实际 DNS 配置(这才是真实的)
resolvectl status

resolvectl status 的输出信息量很大:

Global
       Protocols: LLMNR=resolve -fL  MDNS=resolve -fL  DNSOverTLS=no
resolv.conf mode: stub
Current DNS Server: 8.8.8.8
       DNS Servers: 8.8.8.8 8.8.4.4
        DNS Domain: example.com

Link 2 (eth0)
    Current Scopes: DNS
         Protocols: LLMNR=resolve MDNS=resolve DNSOverTLS=no
Current DNS Server: 192.168.1.1
       DNS Servers: 192.168.1.1
        DNS Domain: internal.example.com

经典坑:systemd-resolved 进程在运行、占着 127.0.0.53:53,但实际没配置上游 DNS 或处于 failed 状态。resolv.conf 指向它,所有请求卡在 connect timeout(默认 5 秒)。你手动改 resolv.conf 写 nameserver 8.8.8.8,但它会悄悄覆盖你的修改。

解决方法:

# 查看真实配置,如果显示 "No current DNS server" 就是它的问题
resolvectl status

# 临时绕过:改用 stub 模式
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

# 或者直接停用 systemd-resolved(传统模式)
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

排查工具链

DNS 排查有一套成熟的工具链。不是每个工具都每次用,但你需要知道什么场景用什么工具。

dig:DNS 排查的主力武器

dig(Domain Information Groper)是 DNS 排查最强大的工具。它直接构造 DNS 协议包发往指定服务器,绕过系统解析器。

基本查询:

# 基本查询,显示完整解析过程
dig example.com

# 关键输出字段:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR
# ;; QUESTION SECTION:    ← 你查了什么
# ;; ANSWER SECTION:      ← 返回了什么
# ;; SERVER: 8.8.8.8#53   ← 实际响应的 DNS 服务器
# ;; Query time: 23 msec  ← 响应时间

指定 DNS 服务器查询,排除本地配置干扰:

# 用 8.8.8.8 查询,绕过本地 DNS 配置
dig @8.8.8.8 example.com

# 用 1.1.1.1 查询对比结果
dig @1.1.1.1 example.com

# 如果两个公共 DNS 返回不同结果,可能是本地 DNS 被劫持

查询特定记录类型:

# A 记录(IPv4 地址)
dig example.com A

# AAAA 记录(IPv6 地址)
dig example.com AAAA

# MX 记录(邮件服务器)
dig example.com MX

# TXT 记录(文本记录,常用于验证)
dig example.com TXT

# NS 记录(域名服务器)
dig example.com NS

# SOA 记录(区域授权起始)
dig example.com SOA

跟踪完整解析路径,看从根域到最终结果的每一跳:

dig +trace example.com

# 输出示例(简化):
# ;; QUERY: 1, ANSWER: 13
# .           518400  IN  NS  a.root-servers.net.     ← 根域服务器
# com.        172800  IN  NS  a.gtld-servers.net.     ← .com 顶级域
# example.com. 172800 IN  NS  a.iana-servers.net.      ← 权威服务器
# example.com. 300    IN  A   93.184.216.34            ← 最终结果

+trace 是排查 DNS 链路问题的利器。如果某一跳超时,你能精确定位是哪一层出了问题。

反向查询(IP 反查域名):

# 反向 DNS 查询
dig -x 8.8.8.8

# 输出:
# ;; ANSWER SECTION:
# 8.8.8.8.in-addr.arpa. 86400 IN PTR dns.google.

DNSSEC 查询,验证域名是否启用了 DNS 签名:

dig +dnssec example.com

# 如果返回中含 ad flag(Authenticated Data),说明启用了 DNSSEC

精简输出,只看 IP 地址:

dig +short example.com
# 93.184.216.34

nslookup:快速验证的轻量工具

nslookup 功能比 dig 简单,但交互模式在批量查询时很方便:

# 基本查询
nslookup example.com

# 指定 DNS 服务器
nslookup example.com 8.8.8.8

# 查询特定记录类型
nslookup -type=MX example.com

# 交互模式(可连续查询)
nslookup
> server 8.8.8.8
> example.com
> example.com MX
> exit

dig vs nslookup 的关键区别:nslookup 默认走系统解析器(受 nsswitch.conf 和 systemd-resolved 影响),dig 默认直连 DNS 服务器。排查时两者对比能发现很多隐藏问题。如果 nslookup 慢但 dig 快,说明本地解析链路有问题。

host:最简洁的查询工具

# 基本查询,输出最简洁
host example.com

# 查询特定记录
host -t MX example.com
host -t NS example.com

# 详细输出
host -v example.com

# 反向查询
host 8.8.8.8

resolvectl:systemd-resolved 专用工具

如果系统用了 systemd-resolved,resolvectl 是必会的工具:

# 查看 DNS 配置状态
resolvectl status

# 查询指定域名
resolvectl query example.com

# 查看缓存统计
resolvectl statistics

# 清除 DNS 缓存
resolvectl flush-caches

# 重置链路配置
resolvectl revert eth0

tcpdump:终极抓包手段

当工具都查不出问题时,直接抓包看实际 DNS 流量:

# 抓取 DNS 流量(UDP 53 端口)
sudo tcpdump -i any -n port 53 -vv

# 抓取特定域名的 DNS 查询
sudo tcpdump -i any -n port 53 -vv | grep "example.com"

# 抓取 DNS 响应,看返回的 IP
sudo tcpdump -i any -n port 53 -vv -X

# 保存到文件用 Wireshark 分析
sudo tcpdump -i any -n port 53 -w dns.pcap

实战技巧:用 tcpdump 可以确认 DNS 查询包到底发出去了没有、发给了谁、有没有收到响应。如果连查询包都没发出去,说明应用层或 glibc 有问题;如果发出去了但没响应,说明网络或 DNS 服务器有问题。

常见故障场景与排查流程

场景一:域名完全解析不了

症状:curlTemporary failure in name resolutionCould not resolve host

排查流程:

# 第1步:确认是不是 DNS 问题(IP 能通但域名不通)
ping -c 2 8.8.8.8        # IP 通
ping -c 2 google.com     # 域名不通 → DNS 问题

# 第2步:检查 resolv.conf
cat /etc/resolv.conf
# 确认有有效的 nameserver

# 第3步:直连 DNS 服务器测试
dig @8.8.8.8 google.com
# 如果直连成功但系统解析失败 → 本地配置问题
# 如果直连也失败 → 网络问题或 DNS 服务器不可达

# 第4步:检查网络连通性
ping -c 2 $(awk '/^nameserver/{print $2; exit}' /etc/resolv.conf)
# 如果 DNS 服务器 ping 不通 → 网络路由问题

# 第5步:检查防火墙是否封锁 UDP 53 端口
sudo iptables -L -n | grep 53
# 或
sudo ufw status

场景二:DNS 解析特别慢

症状:所有请求莫名卡顿,偶尔超时。SSH 登录也慢。

这是最常见的隐藏 DNS 问题。原因通常有以下几种:

原因1:resolv.conf 第一个 nameserver 不可达

# 测试每个 nameserver 的响应时间
for ns in $(awk '/^nameserver/{print $2}' /etc/resolv.conf); do
    echo -n "$ns: "
    dig @$ns example.com +stats 2>/dev/null | grep "Query time" || echo "timeout"
done

# 如果第一个超时,修改 resolv.conf 调整顺序
# 或加 options timeout:1 减少超时等待

原因2:IPv6 解析问题

很多应用默认会先尝试 IPv6(AAAA 记录)解析,如果系统不支持 IPv6 或 IPv6 DNS 不可达,会先等 AAAA 查询超时再退回 A 记录查询。

# 检查是否启用了 IPv6
ip -6 addr show

# 如果不需要 IPv6,禁用它避免 AAAA 查询超时
# 方法1:在 resolv.conf 中加 options(不推荐,可能被覆盖)
# 方法2:在应用层禁用 IPv6
# curl 禁用 IPv6
curl -4 http://example.com
# wget 禁用 IPv6
wget -4 http://example.com

原因3:ndots 配置导致的额外查询

resolv.conf 中的 options ndots:N 参数控制何时进行完全限定域名查询。默认值是 1(旧系统)或 5(systemd-resolved 系统)。

# 查看 ndots 配置
cat /etc/resolv.conf | grep options

# 如果 ndots:5,意味着:
# 查询 "db" 这种短名时,会先尝试:
#   db.search-domain1.com  ← 先用 search 补全
#   db.search-domain2.com
#   ...
#   db                     ← 最后才查裸域名
# 每次补全失败都会产生一次 DNS 查询,总共 6 次查询

Kubernetes 环境下这个问题尤其严重。Pod 的默认 resolv.conf 是这样的:

nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

这意味着查询 example.com(只有 1 个点,小于 5),系统会先尝试:

# 实际会触发 4 次无意义的 DNS 查询
example.com.default.svc.cluster.local     → NXDOMAIN
example.com.svc.cluster.local             → NXDOMAIN
example.com.cluster.local                 → NXDOMAIN
example.com                               ← 最后才查真正的域名

生产教训:K8s 集群里一个应用对外请求慢,最后查出来是每次都要多 3 次 DNS 查询。解决方案:要么在 Pod 级别修改 dnsPolicy 和 dnsConfig,要么对外部域名使用全限定域名(加 . 后缀,如 example.com.)。

场景三:间歇性解析失败

症状:时好时坏,没有规律。这种最难排查。

# 持续监控 DNS 解析,记录失败时间
while true; do
    timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    result=$(dig +short +time=2 +tries=1 example.com 2>&1)
    if [ -z "$result" ] || echo "$result" | grep -q "timed out"; then
        echo "[$timestamp] FAILED: $result"
    else
        echo "[$timestamp] OK: $result"
    fi
    sleep 5
done

间歇性失败的常见原因:

  1. DNS 服务器负载高:多台机器同时查询一个 DNS 服务器,高峰期响应不过来
  2. UDP 包丢失:DNS 默认用 UDP,丢包率高时会出现间歇性失败
  3. 连接跟踪表满:nf_conntrack 表满了会导致 UDP 包被丢弃
  4. DNS 服务器超载:单台 DNS 服务器 QPS 超限
# 检查连接跟踪表
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max

# 如果 count 接近 max,增大限制
echo 262144 | sudo tee /proc/sys/net/netfilter/nf_conntrack_max

场景四:nslookup 正常但 curl 失败

这是最让人困惑的场景。根本原因:nslookup/dig 直连 DNS 服务器,而 curl 走系统 glibc 的 getaddrinfo(),受 nsswitch.conf 和 systemd-resolved 影响。

# 第1步:确认 nsswitch 配置
cat /etc/nsswitch.conf | grep hosts
# 确保包含 dns:
# hosts: files dns myhostname

# 第2步:如果用了 systemd-resolved,检查它是否正常
resolvectl status
systemctl status systemd-resolved

# 第3步:检查 nscd(Name Service Cache Daemon)是否干扰
systemctl status nscd
# nscd 的缓存可能过期但没刷新,导致返回旧数据
sudo nscd -i hosts  # 清除 hosts 缓存

场景五:resolv.conf 被自动覆盖

手动修改了 /etc/resolv.conf,但重启网络或机器后配置消失了。这是最经典的 DNS 坑。

# 先看 resolv.conf 是不是符号链接
ls -l /etc/resolv.conf

# 如果是指向 systemd-resolved 的链接:
# lrwxrwxrwx ... /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
# 不要直接改,要改 systemd-resolved 配置

# 修改 systemd-resolved 配置
sudo vim /etc/systemd/resolved.conf
# [Resolve]
# DNS=8.8.8.8 1.1.1.1
# FallbackDNS=8.8.4.4
# Domains=example.com

# 重启服务使配置生效
sudo systemctl restart systemd-resolved

如果是 NetworkManager 接管的系统:

# 查看当前连接
nmcli connection show

# 修改 DNS 配置
nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1"
nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes

# 重启连接使配置生效
nmcli connection down "Wired connection 1" && nmcli connection up "Wired connection 1"

如果是 DHCP 动态获取的:

# 防止 DHCP 覆盖 DNS 配置
# 在 /etc/dhcp/dhclient.conf 中添加:
# prepend domain-name-servers 8.8.8.8 1.1.1.1;
# 或者完全覆盖:
# supersede domain-name-servers 8.8.8.8 1.1.1.1;

生产环境 DNS 配置最佳实践

服务器 DNS 配置建议

# /etc/resolv.conf 推荐配置(非 systemd-resolved 环境)
nameserver 8.8.8.8
nameserver 1.1.1.1
search internal.example.com
options timeout:2 attempts:3 rotate

# timeout:2     → 2 秒超时,不要等默认的 5 秒
# attempts:3   → 最多重试 3 次
# rotate       → 轮询使用多个 nameserver,避免只压第一个
# /etc/systemd/resolved.conf 推荐配置(systemd-resolved 环境)
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=8.8.4.4 9.9.9.9
Domains=example.com
DNSOverTLS=opportunistic
Cache=yes
CacheFromLocalhost=no

Kubernetes Pod DNS 配置

# 对外请求频繁的 Pod,自定义 DNS 配置避免 ndots 问题
apiVersion: v1
kind: Pod
metadata:
  name: external-api-client
spec:
  dnsPolicy: None  # 禁用默认 DNS 策略
  dnsConfig:
    nameservers:
      - 8.8.8.8
      - 1.1.1.1
    searches:
      - default.svc.cluster.local
      - svc.cluster.local
    options:
      - name: ndots
        value: "2"  # 降低 ndots 避免无谓查询
      - name: timeout
        value: "2"
      - name: attempts
        value: "3"
  containers:
    - name: app
      image: myapp:latest

DNS 监控指标

生产环境应该监控 DNS 解析的健康状态:

# Bash 脚本:DNS 健康检查(可接入 Prometheus Node Exporter textfile collector)
#!/bin/bash
# dns-health-check.sh

METRICS_FILE="/var/lib/node_exporter/textfile/dns_health.prom"

# 测试 DNS 解析延迟
for domain in "internal.example.com" "google.com" "kubernetes.default.svc"; do
    start=$(date +%s%N)
    result=$(dig +short +time=2 +tries=1 "$domain" 2>/dev/null)
    end=$(date +%s%N)
    latency_ms=$(( (end - start) / 1000000 ))
    
    if [ -n "$result" ]; then
        status=1
    else
        status=0
        latency_ms=9999
    fi
    
    # 生成 metric(域名中的特殊字符替换为下划线)
    safe_domain=$(echo "$domain" | tr '.' '_')
    echo "dns_resolve_success{domain=\"${safe_domain}\"} ${status}" >> "$METRICS_FILE"
    echo "dns_resolve_latency_ms{domain=\"${safe_domain}\"} ${latency_ms}" >> "$METRICS_FILE"
done

DNS 缓存管理

# systemd-resolved 清缓存
resolvectl flush-caches

# nscd 清缓存
sudo nscd -i hosts

# dnsmasq 清缓存
sudo systemctl restart dnsmasq

# BIND 清缓存
sudo rndc flush

缓存策略建议:服务器建议开启 DNS 缓存(systemd-resolved 默认已开启),TTL 遵循上游 DNS 的设定。不要把缓存 TTL 调太大,否则域名变更后迟迟不生效。我见过有人把缓存 TTL 设成 24 小时,结果 DNS 切换后半个机房的应用还在连旧 IP,排查了整整一天。

DNS 排查速查表

症状首先检查可能原因排查命令
域名完全解析不了resolv.confnameserver 为空或错误dig @8.8.8.8 domain
解析慢(卡 5 秒)resolv.conf 第一个 nameserverDNS 服务器不可达for ns in ...; do dig @$ns ...
nslookup 正常但 curl 失败nsswitch.confhosts 行缺少 dnscat /etc/nsswitch.conf | grep hosts
resolv.conf 被覆盖是否符号链接systemd-resolved/NetworkManagerls -l /etc/resolv.conf
间歇性失败连接跟踪/UDP 丢包nf_conntrack 表满cat /proc/sys/net/netfilter/nf_conntrack_count
K8s Pod 解析慢ndots 配置ndots:5 导致额外查询检查 Pod resolv.conf
IPv6 导致慢AAAA 查询超时系统不支持 IPv6 但尝试 AAAAip -6 addr show
DNS 劫持dig vs nslookup 结果运营商 DNS 污染dig @8.8.8.8 vs dig @local

排查流程图

域名解析失败
    ├─ ping IP 通吗?
    │   ├─ 不通 → 网络问题,不是 DNS
    │   └─ 通 ↓
    ├─ dig @8.8.8.8 domain 成功吗?
    │   ├─ 成功 → 本地配置问题
    │   │   ├─ 检查 /etc/resolv.conf
    │   │   ├─ 检查 /etc/nsswitch.conf
    │   │   └─ 检查 systemd-resolved
    │   └─ 失败 → DNS 服务器或网络问题
    │       ├─ ping DNS 服务器
    │       ├─ 检查防火墙 UDP 53
    │       └─ tcpdump 抓包确认
    └─ 间歇性问题
        ├─ 检查 nf_conntrack
        ├─ 检查 DNS 服务器负载
        └─ 持续监控记录失败时间

总结

DNS 排查的核心是理解解析链路。整条链路是:应用 → glibc → nsswitch → hosts/缓存/DNS → resolv.conf → nameserver。每个环节都可能出问题,排查时顺着链路逐段排除。

几个实战经验总结:

  1. dig 和 nslookup 结果对比是第一手段:如果 dig 成功但 nslookup 失败(或反过来),立刻锁定是本地解析器还是 DNS 服务器的问题

  2. systemd-resolved 是双刃剑:它提供了缓存和灵活配置,但排查时多一层中间人。生产环境如果你不需要它的特性,可以考虑直接用传统 resolv.conf 模式,简单粗暴但好排查

  3. resolv.conf 的 nameserver 顺序很重要:第一个不可达会拖慢所有查询。加 options timeout:2 把超时从 5 秒降到 2 秒,加 rotate 轮询分担压力

  4. K8s 的 ndots:5 是个巨坑:对外请求频繁的 Pod 一定要自定义 dnsConfig 把 ndots 降下来,否则每次请求多 3-4 次无意义的 DNS 查询

  5. 排查 DNS 问题先抓包:tcpdump 是终极手段。看 DNS 包到底发出去没有、发给了谁、有没有响应。很多诡异问题抓一下包就清楚了

  6. DNS 变更要考虑缓存:切换 DNS 服务器或修改域名解析后,记得清本地缓存。systemd-resolved 用 resolvectl flush-caches,nscd 用 nscd -i hosts

DNS 看起来简单,真出问题的时候排查链路很长。把这套工具链和排查流程记住,下次凌晨被告警吵醒的时候不至于手忙脚乱。

参考资料与致谢

本文在撰写过程中参考了以下资料,感谢原作者的贡献:

  1. Linux DNS 故障排查与解析命令完整指南 — CSDN,dig/nslookup/host 命令用法详解
  2. Linux 域名解析缓慢的定位流程 — php.cn,nslookup 与 dig 响应差异分析及 systemd-resolved 故障排查
  3. Linux查看DNS配置教程 resolv.conf文件详解 — php.cn,resolv.conf 参数详解及动态管理机制分析
  4. Linux怎么诊断DNS解析失败 — php.cn,DNS 解析失败的系统化排查方法
  5. Linux如何排查DNS解析异常 — php.cn,dig 和 nslookup 诊断教程