2.4.3 DNS解析流程与解析顺序
DNS解析流程从应用发起解析请求开始,依次经过本地策略、缓存与外部递归/迭代查询,最终返回记录并缓存。可用如下流程图理解:
解析顺序通常由 /etc/nsswitch.conf 的 hosts 条目控制,典型优先级示例:
# /etc/nsswitch.conf
hosts: files dns
# files= /etc/hosts
# dns = /etc/resolv.conf 指定的 nameserver
/etc/resolv.conf 中 nameserver 解析顺序示例:
# /etc/resolv.conf
nameserver 10.0.0.2
nameserver 10.0.0.3
search corp.example.com example.com
# 解析 www 会依次尝试 www.corp.example.com -> www.example.com
关键命令与示例#
1) 基础解析测试与顺序验证(含命令说明)
# 1. 查看解析策略
cat /etc/nsswitch.conf | grep '^hosts'
# 2. 查看DNS服务器顺序
cat /etc/resolv.conf
# 3. 查询解析过程(dig不读取 /etc/hosts)
dig +trace www.example.com
# 4. 使用getent走系统解析库,反映nsswitch顺序
getent hosts www.example.com
# 5. 验证 /etc/hosts 优先级
echo "1.1.1.1 www.example.com" | sudo tee -a /etc/hosts
getent hosts www.example.com # 预期输出 1.1.1.1
2) 缓存管理与清理(systemd-resolved / nscd)
# systemd-resolved 查看与清理缓存
resolvectl status
sudo resolvectl flush-caches
# nscd 安装、启用与清理(示例:基于CentOS/RHEL)
sudo yum install -y nscd
sudo systemctl enable --now nscd
sudo nscd -i hosts # 仅清理hosts缓存
3) 递归/迭代对比示例(本地DNS vs 公共DNS)
# 使用指定DNS服务器递归查询
dig @10.0.0.2 www.example.com +recurse
# 使用公共DNS查询
dig @8.8.8.8 www.example.com +recurse
# 预期效果:返回ANSWER SECTION且有TTL
4) 超时与失败切换验证(解释关键参数)
# 临时指定解析超时与重试
# options timeout:2 attempts:2 表示每个nameserver超时2秒,重试2次
sudo bash -c 'printf "nameserver 10.0.0.2\nnameserver 10.0.0.3\noptions timeout:2 attempts:2\n" > /etc/resolv.conf'
# 验证当10.0.0.2不可达时会切到10.0.0.3
dig www.example.com +time=2 +tries=1
常见排错与定位步骤#
- 解析慢或失败:先检查 DNS 可达性与端口 53。
# UDP/53 检查
nc -u -vz 10.0.0.2 53
# TCP/53 检查(大包或DNSSEC可能走TCP)
nc -vz 10.0.0.2 53
- 排除 /etc/hosts 影响:
# 临时注释hosts对应行后再测试
sudo sed -i 's/^\(1\.1\.1\.1 www\.example\.com\)/#\1/' /etc/hosts
getent hosts www.example.com
- 查看系统解析日志(systemd-resolved):
journalctl -u systemd-resolved --since "1 hour ago"
练习#
1) 配置 /etc/hosts 为 app.example.com 指向 10.10.10.10,用 getent hosts 验证优先级,并记录输出。
2) 设置两个 nameserver,将第一个IP设为不可达,观察 dig/getent 是否切换到第二个。
3) 使用 dig +trace 解析一个域名,画出根/顶级域/权威DNS的链路,并记录每级返回的NS记录。