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