2.3.4 DNS客户端与解析配置
DNS 客户端负责将域名解析为 IP,是系统访问外部资源的基础。Linux 上解析通常经过 /etc/hosts → NSS 解析顺序 → DNS 服务器 → 本地缓存服务 的链路。正确配置可避免解析失败、超时与错误指向。
1. 解析优先级与解析流程#
原理草图(解析链路):
解析顺序示例(先本地再 DNS):
hosts: files dns
关键命令解释:
- getent hosts <域名>:通过 NSS 解析,真实反映系统解析顺序
- cat /etc/nsswitch.conf:查看解析顺序配置
- cat /etc/hosts:确认是否有本地覆盖
示例验证解析优先级:
# 1) 添加本地映射(临时覆盖)
echo "1.2.3.4 www.example.com" | sudo tee -a /etc/hosts
# 2) 使用 NSS 查询,优先命中 /etc/hosts
getent hosts www.example.com
# 3) 预期输出:1.2.3.4 www.example.com
2. resolv.conf 关键配置#
核心字段说明:
- nameserver:DNS 服务器地址,按顺序尝试
- search:短域名补全搜索域
- options:超时/重试/轮询等策略
完整示例(含注释):
# /etc/resolv.conf
nameserver 223.5.5.5
nameserver 8.8.8.8
search example.com corp.local
options timeout:2 attempts:3 rotate
命令验证与预期:
# 查询生效的 DNS 服务器与搜索域
grep -E "nameserver|search|options" /etc/resolv.conf
# 验证短域名补全
dig +short web
# 预期:尝试 web.example.com / web.corp.local
注意:部分系统会被 NetworkManager 或 systemd-resolved 自动覆盖,需要在其配置中持久化。
3. systemd-resolved 配置要点#
查看状态与当前 DNS:
resolvectl status
配置文件与示例:
# /etc/systemd/resolved.conf
[Resolve]
DNS=223.5.5.5 8.8.8.8
FallbackDNS=1.1.1.1
Domains=example.com corp.local
DNSStubListener=yes
使配置生效:
sudo systemctl restart systemd-resolved
验证 stub 监听:
ss -lntp | grep 53
# 预期:systemd-resolved 监听 127.0.0.53:53
4. NetworkManager 持久化配置#
常用命令与解释:
- nmcli con show:列出连接
- nmcli con mod <conn> ipv4.dns ...:设置 DNS
- nmcli con mod <conn> ipv4.ignore-auto-dns yes:忽略 DHCP DNS
- nmcli con up <conn>:应用连接配置
完整示例:
# 1) 查看连接名
nmcli con show
# 2) 修改连接 DNS(假设连接名为 ens33)
sudo nmcli con mod ens33 ipv4.dns "223.5.5.5 8.8.8.8"
sudo nmcli con mod ens33 ipv4.ignore-auto-dns yes
sudo nmcli con up ens33
# 3) 验证 /etc/resolv.conf
cat /etc/resolv.conf
5. 常见问题与排查#
排错路径建议:链路连通 → 覆盖配置 → 超时参数 → 本地缓存
1) 解析失败/超时
# DNS连通性
ping -c 2 223.5.5.5
# 明确查询
dig @223.5.5.5 www.example.com +time=2 +tries=1
2) 解析结果异常
# 检查是否被 hosts 覆盖
grep -n "example.com" /etc/hosts
# 检查 NSS 顺序
grep "^hosts" /etc/nsswitch.conf
3) 解析慢
# 提高超时与重试策略
sudo sed -i 's/^options.*/options timeout:2 attempts:2 rotate/' /etc/resolv.conf
4) 配置被自动覆盖
# 识别接管服务
ls -l /etc/resolv.conf
# 如果是 systemd-resolved 的 stub
# /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
6. 企业环境最佳实践#
- 配置主/备 DNS,避免单点
- 生产环境统一 DNS 策略与搜索域
- 关键业务可使用 /etc/hosts 临时兜底
- 监控解析耗时与失败率(结合 Prometheus/Exporter)
7. 练习与实操#
1) 练习一:本地覆盖与恢复
# 添加覆盖
echo "9.9.9.9 www.example.com" | sudo tee -a /etc/hosts
getent hosts www.example.com
# 恢复(删除添加行)
sudo sed -i '/www.example.com/d' /etc/hosts
getent hosts www.example.com
2) 练习二:配置 DNS 并验证
# 修改 resolv.conf(仅适用于未被接管系统)
sudo bash -c 'cat > /etc/resolv.conf <<EOF
nameserver 223.5.5.5
nameserver 8.8.8.8
search example.com
options timeout:2 attempts:2
EOF'
# 验证
dig +short www.example.com
3) 练习三:使用 nmcli 持久化
nmcli con show
sudo nmcli con mod ens33 ipv4.dns "223.5.5.5 8.8.8.8"
sudo nmcli con mod ens33 ipv4.ignore-auto-dns yes
sudo nmcli con up ens33
cat /etc/resolv.conf