Orange的运维学习日记–35.DNS拓展与故障排除

名称解析架构

名称解析依赖客户端、本地缓存解析器、权威名称服务器及网络配置

客户端根据 /etc/nsswitch.conf 中 hosts 行和 /etc/resolv.conf 发起查询

缓存解析器对外转发查询并返回缓存结果或向权威服务器查询

权威名称服务器托管区域数据,确保记录正确并同步 SOA 序列号

网络通道需保证客户端与各级名称服务器的 UDP/TCP 53 端口互通

在这里插入图片描述


名称解析来源顺序

系统通过 /etc/nsswitch.conf 中 hosts 行的顺序决定名称解析方式

典型配置

hosts: files dns myhostname
  • files 表示优先读取 /etc/hosts
  • dns 表示接着发起 DNS 查询
  • myhostname 针对本地主机名做特殊处理

使用 getent hosts <主机名> 可严格按上述顺序执行解析

getent hosts server.laoma.cloud

使用 dig 调试 DNS 查询

dig 是调查 DNS 问题的利器

  • 默认查 A 记录:

    dig example.com
    
  • 指定记录类型 AAAA:

    dig AAAA example.com
    
  • 指定查询服务器和记录类型 MX:

    dig @10.0.0.1 mx example.com
    

输出片段

  • HEADER 段报告状态码和查询选项
  • QUESTION 段重述查询
  • ANSWER/AUTHORITY/ADDITIONAL 段列出响应记录

网络连通性检查

如果出现 connection timed out; no servers could be reached

  • 核实 /etc/resolv.conf 中 DNS 服务器地址正确性
  • 检查客户端防火墙或网络策略是否阻断 UDP/TCP 53
  • 使用 dig +tcp 强制走 TCP 排查截断或 EDNS 问题

当响应超过默认 UDP 容量(512 字节,EDNS 可达 4096)时,解析器会切换到 TCP


DNS 响应代码

HEADER 中 status 字段报告服务器处理结果

  • NOERROR 查询成功但记录可能不符合预期
  • SERVFAIL 服务器与权威服务器通信失败或内部故障
  • NXDOMAIN 名称不存在或被负缓存拦截
  • REFUSED 服务器因策略拒绝递归查询或区域传输

SERVFAIL 深入排查

使用 dig +trace 可从根服务器开始进行迭代查询,定位链路中断位置

NXDOMAIN 常见原因

  • 查询名称确实不存在
  • 孤立 CNAME 指向无 A/AAAA 记录的别名
  • 负缓存未过期,需等待或清理缓存

REFUSED 常见原因

  • 客户端无权限递归或请求非递归查询
  • 服务器策略限制导致拒绝服务

Zone 数据层面故障

DNS 轮询

同一名称配置多个 A/AAAA 记录实现简单负载分发

  • 响应顺序随机化,客户端通常使用列表首元素
  • 遗留旧 IP 未删除会导致部分请求指向失效地址

排查示例

for i in {1..10}; do dig example.com A +short; done

缺少 PTR 记录

  • SSHD 默认对客户端 IP 执行反向查找,缺 PTR 会导致连接延迟
  • 邮件服务器依赖 PTR 防垃圾邮件,缺 PTR 可能被拒收

使用 dig -x 1.2.3.4 检查反向区域并添加 PTR 记录

通配符记录误伤

通配符记录匹配所有未定义名称

*.laoma.cloud. IN A 172.25.254.254

删除特定 A 记录后仍返回通配符地址,需移除或精确化定义

区域文件尾点与名称拼接

  • 短主机名不以 . 结尾会自动追加区域名
  • 完整 FQDN 必须以 . 结尾避免二次拼接

示例

host   IN A 10.0.0.1   ; 解析为 host.zone.com
host.  IN A 10.0.0.1   ; 解析为 host

循环或孤立的 CNAME 别名

  • 孤立 CNAME 指向无 A/AAAA 记录名称,返回 NXDOMAIN
  • 循环 CNAME 互相指向,返回 NOERROR 但无法解析

使用 named-checkzone 或自定义脚本批量验证 CNAME 链条

权威服务器数据不一致

主从服务器返回结果不同时

  • 对比 SOA 序列号:

    dig @master example.com SOA
    dig @slave  example.com SOA
    
  • 确认主服务器更新时递增序列号并允许区域传输

  • 检查网络或防火墙是否阻断 AXFR/IXFR


配置缓存名称服务器

在内部网络部署缓存名称服务器可大幅提升解析性能

Unbound

安装
yum install -y unbound
基本配置

编辑 /etc/unbound/unbound.conf

  • 定义监听接口

    server:
      interface: 10.1.8.20
      interface: 2001:db8:1001::f0
      interface-automatic: no
    
  • 配置访问控制

    access-control: 127.0.0.0/8   allow
    access-control: 172.25.0.0/24 allow
    access-control: 10.1.7.0/24   refuse
    
  • 可选转发所有或特定域

    forward-zone:
      name: "."
      forward-addr: 10.1.8.10
    
  • 可选跳过 DNSSEC 验证

    domain-insecure: laoma.cloud
    harden-dnssec-stripped: no
    
启用与防火墙
unbound-checkconf
systemctl enable --now unbound
firewall-cmd --add-service=dns --permanent
客户端测试
dig @10.1.8.20 client.laoma.cloud
dig @10.1.8.20 student.laoma.cloud
dig @10.1.8.20 dns.laoma.cloud
管理缓存
  • 导出缓存

    unbound-control dump_cache > dns_dump
    
  • 清空单个记录

    unbound-control flush student.laoma.cloud
    
  • 清空整个区域

    unbound-control flush_zone laoma.cloud
    
  • 导入缓存

    unbound-control load_cache < dns_dump
    

Dnsmasq

功能简介

Dnsmasq 集成 DNS 缓存、DHCP、PXE 等功能,适合个人或小型网络

安装
yum install -y dnsmasq
配置

编辑 /etc/dnsmasq.conf

  • resolv-file 指定上游 DNS 列表
  • strict-order 按顺序使用上游服务器
  • listen-address 定义监听地址
  • address=/domain/ip 强制域名解析至指定 IP
  • server=/domain/dns 针对不同域使用不同上游 DNS
  • bogus-nxdomain 拦截被劫持的 NXDOMAIN 重定向

禁止 /etc/hosts/etc/resolv.conf 解析

no-hosts
no-resolv

示例

resolv-file=/etc/resolv.dnsmasq.conf
server=/laoma.cloud/10.1.8.10
启用与防火墙
dnsmasq -test
systemctl enable --now dnsmasq
firewall-cmd --add-service=dns --permanent
客户端测试
dig @10.1.8.20 client.laoma.cloud
dig @10.1.8.20 student.laoma.cloud
dig @10.1.8.20 dns.laoma.cloud
支持多于三个上游服务器

/etc/resolv.conf 仅保留 localhost

新建上游列表文件 /etc/resolv.dnsmasq.conf

nameserver 8.8.8.8
nameserver 8.8.4.4

在 dnsmasq 配置中引用

resolv-file=/etc/resolv.dnsmasq.conf
bash
dig @10.1.8.20 client.laoma.cloud
dig @10.1.8.20 student.laoma.cloud
dig @10.1.8.20 dns.laoma.cloud
支持多于三个上游服务器

/etc/resolv.conf 仅保留 localhost

新建上游列表文件 /etc/resolv.dnsmasq.conf

nameserver 8.8.8.8
nameserver 8.8.4.4

在 dnsmasq 配置中引用

resolv-file=/etc/resolv.dnsmasq.conf
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐