DNS服务器的工作原理与常见故障排查指南

描述

 

一、问题背景

DNS(Domain Name System)是互联网最基础的服务之一,负责将域名解析为 IP 地址。DNS 故障会导致用户无法访问网站、应用无法连接后端服务、邮件无法发送等问题。

常见 DNS 故障表现:

  • 网站无法访问,浏览器提示"无法解析域名"
  • ping 域名失败,但 ping IP 成功
  • 应用连接数据库或缓存失败,报域名解析错误
  • 邮件发送失败,提示无法解析 MX 记录
  • 部分地区用户可以访问,部分地区无法访问
  • 解析到错误的 IP 地址
  • 解析速度慢,超时
  • DNS 缓存污染或劫持

DNS 故障排查需要理解 DNS 工作原理、记录类型、查询流程、缓存机制,以及掌握常用排查工具和方法。

二、适用场景

本文适用于以下场景:

  • 网站或应用无法访问,怀疑 DNS 问题
  • 需要理解 DNS 工作原理
  • 需要配置和管理 DNS 服务器
  • 需要排查 DNS 解析故障
  • 需要优化 DNS 解析性能
  • 需要防范 DNS 劫持和污染
  • 需要监控 DNS 服务可用性

本文涵盖 DNS 基础原理、记录类型、查询流程、常用工具、故障排查方法和安全防护。

三、核心知识点

3.1 DNS 基本概念

域名结构:

域名是分层结构,从右到左依次为:


			   www.example.com. 
  • . 根域(Root Domain)
  • com 顶级域(Top-Level Domain, TLD)
  • example 二级域(Second-Level Domain)
  • www 三级域或主机名(Subdomain / Hostname)

DNS 服务器类型:

  • 根域名服务器(Root DNS Server):全球 13 组根服务器,负责顶级域的权威服务器地址
  • 顶级域名服务器(TLD DNS Server):负责特定顶级域(例如 .com.org)的权威服务器地址
  • 权威域名服务器(Authoritative DNS Server):存储域名的实际记录,负责最终解析
  • 递归域名服务器(Recursive DNS Server):接收客户端查询,递归查询其他 DNS 服务器,返回结果并缓存

DNS 解析类型:

  • 递归查询(Recursive Query):客户端向递归服务器发起查询,递归服务器负责完整查询过程,返回最终结果
  • 迭代查询(Iterative Query):递归服务器向其他 DNS 服务器查询,其他服务器返回下一跳地址或最终结果

3.2 DNS 记录类型

常见 DNS 记录类型:

记录类型 说明 示例
A 将域名解析为 IPv4 地址 example.com -> 192.0.2.1
AAAA 将域名解析为 IPv6 地址 example.com -> 2001:1
CNAME 将域名指向另一个域名(别名) www.example.com -> example.com
MX 邮件交换记录,指定邮件服务器 example.com -> mail.example.com
TXT 文本记录,用于 SPF、DKIM、域名验证等 example.com -> "v=spf1 ..."
NS 指定域名的权威服务器 example.com -> ns1.example.com
SOA 起始授权记录,包含域名管理信息 序列号、刷新时间、重试时间、过期时间、TTL
PTR 反向解析,IP 地址到域名 1.2.0.192.in-addr.arpa -> example.com
SRV 服务记录,指定服务的主机和端口 _http._tcp.example.com -> server.example.com:80
CAA 证书颁发机构授权记录 example.com -> issue "letsencrypt.org"

3.3 DNS 查询流程

完整的 DNS 查询流程(以查询 www.example.com 为例):

  1. 客户端查询:客户端(例如浏览器)向本地 DNS 服务器(递归服务器)发起查询
  2. 检查缓存:递归服务器检查本地缓存,如果有记录且未过期,直接返回
  3. 查询根服务器:如果缓存中没有,递归服务器向根服务器查询,根服务器返回 .com 顶级域服务器地址
  4. 查询顶级域服务器:递归服务器向 .com 服务器查询,返回 example.com 权威服务器地址
  5. 查询权威服务器:递归服务器向 example.com 权威服务器查询,返回 www.example.com 的 A 记录
  6. 返回结果并缓存:递归服务器将结果返回给客户端,并缓存记录

			   客户端 → 递归服务器 → 根服务器 → TLD 服务器 → 权威服务器 → 递归服务器 → 客户端 

3.4 DNS 缓存机制

DNS 缓存存在于多个层级:

  • 浏览器缓存:浏览器会缓存 DNS 解析结果
  • 操作系统缓存:操作系统会缓存 DNS 解析结果
  • 递归服务器缓存:递归 DNS 服务器会缓存查询结果
  • 权威服务器缓存:权威服务器不缓存,但会指定 TTL

TTL(Time To Live):

  • 每条 DNS 记录都有 TTL,表示记录可以被缓存的时间(秒)
  • TTL 到期后,缓存失效,需要重新查询
  • 修改 DNS 记录后,旧记录可能在缓存中保留 TTL 时间

3.5 DNS 解析策略

轮询(Round Robin):

  • 同一域名对应多个 A 记录
  • DNS 服务器按顺序返回不同的 IP
  • 实现简单的负载均衡

地理位置解析(GeoIP):

  • 根据客户端 IP 地址返回不同的记录
  • 实现就近访问,优化访问速度

智能解析:

  • 根据客户端运营商、地区、时间等返回不同记录
  • 实现精细化流量调度

四、整体排查思路

DNS 故障排查流程:


			   确认现象 → 本地排查 → 递归服务器排查 → 权威服务器排查 → 网络路径排查 → 缓存排查 → 配置排查 → 验证修复 

关键步骤:

  1. 确认是否为 DNS 问题
  2. 检查本地 DNS 配置
  3. 使用工具测试 DNS 解析
  4. 检查递归 DNS 服务器
  5. 检查权威 DNS 服务器
  6. 检查网络连通性
  7. 检查 DNS 缓存
  8. 检查 DNS 记录配置
  9. 验证修复效果

五、实战步骤

5.1 确认是否为 DNS 问题

5.1.1 测试域名解析


			   bashping www.example.com 

如果提示"无法解析主机名"或"Name or service not known",可能是 DNS 问题。


			   bashcurl http://www.example.com 

如果提示"Could not resolve host",可能是 DNS 问题。

5.1.2 测试 IP 连通性

假设 www.example.com 的 IP 是 192.0.2.1


			   bashping 192.0.2.1 

如果 ping IP 成功,但 ping 域名失败,说明是 DNS 问题。


			   bashcurl http://192.0.2.1 

如果访问 IP 成功,但访问域名失败,说明是 DNS 问题。

5.1.3 使用 nslookup 测试


			   bashnslookup www.example.com 

如果返回"Non-existent domain"或"NXDOMAIN",说明域名不存在或 DNS 记录未配置。

如果返回"Timeout"或"Connection timed out",说明 DNS 服务器无响应。

如果返回 IP 地址,说明解析成功。

5.1.4 使用 dig 测试


			   bashdig www.example.com 

观察输出:

  • status: NOERROR:解析成功
  • status: NXDOMAIN:域名不存在
  • status: SERVFAIL:服务器故障
  • status: REFUSED:服务器拒绝查询

如果没有 ANSWER SECTION,说明没有解析到记录。

5.2 检查本地 DNS 配置

5.2.1 查看 DNS 服务器配置

Linux:


			   bashcat /etc/resolv.conf 

输出示例:


			   nameserver 8.8.8.8 nameserver 8.8.4.4 

nameserver 指定 DNS 服务器地址。

Windows:


			   cmdipconfig /all 

查看"DNS 服务器"项。

macOS:


			   bashscutil --dns 

查看 DNS 配置。

5.2.2 检查 DNS 服务器可用性


			   bashping 8.8.8.8 

确认 DNS 服务器网络可达。


			   bashnslookup www.example.com 8.8.8.8 

指定 DNS 服务器查询,确认服务器是否可用。

5.2.3 检查 hosts 文件

Linux/macOS:


			   bashcat /etc/hosts 

Windows:


			   cmdtype C:WindowsSystem32driversetchosts 

hosts 文件中的记录优先级高于 DNS,检查是否有错误配置。

示例:


			   127.0.0.1 localhost 192.0.2.1 www.example.com 

如果 hosts 文件中有错误记录,会导致解析错误。

5.2.4 检查防火墙规则

确认防火墙没有阻止 DNS 查询(UDP 53 和 TCP 53):


			   bashiptables -L -n | grep 53 

如果有 DROP 或 REJECT 规则,可能会阻止 DNS 查询。

5.3 使用 DNS 排查工具

5.3.1 nslookup

基本用法:


			   bashnslookup www.example.com 

指定 DNS 服务器:


			   bashnslookup www.example.com 8.8.8.8 

查询特定记录类型:


			   bashnslookup -type=MX example.com nslookup -type=TXT example.com nslookup -type=NS example.com 

交互模式:


			   bashnslookup > server 8.8.8.8 set type=A > www.example.com exit 

5.3.2 dig

基本用法:


			   bashdig www.example.com 

输出解析详细信息,包括查询时间、服务器地址、应答记录。

指定 DNS 服务器:


			   bashdig @8.8.8.8 www.example.com 

查询特定记录类型:


			   bashdig example.com MX dig example.com TXT dig example.com NS dig example.com SOA 

简化输出:


			   bashdig www.example.com +short 

仅输出解析结果。

追踪查询路径:


			   bashdig www.example.com +trace 

显示完整的递归查询过程,从根服务器开始。

查看 TTL:


			   bashdig www.example.com +noall +answer 

5.3.3 host

基本用法:


			   bashhost www.example.com 

输出简洁的解析结果。

指定 DNS 服务器:


			   bashhost www.example.com 8.8.8.8 

查询特定记录类型:


			   bashhost -t MX example.com host -t TXT example.com host -t NS example.com 

反向解析:


			   bashhost 192.0.2.1 

5.3.4 whois

查询域名注册信息:


			   bashwhois example.com 

输出域名注册商、注册时间、过期时间、NS 服务器等信息。

如果域名过期,会显示"Domain Status: clientHold"或类似状态。

5.3.5 在线 DNS 查询工具

使用在线工具从不同地理位置查询 DNS:

  • https://dnschecker.org/
  • https://www.whatsmydns.net/
  • https://mxtoolbox.com/

这些工具可以检测 DNS 解析在全球的传播情况。

5.4 检查递归 DNS 服务器

5.4.1 测试递归服务器响应


			   bashdig @8.8.8.8 www.example.com 

指定公共 DNS 服务器(例如 Google DNS 8.8.8.8)查询。

如果公共 DNS 可以解析,但本地 DNS 不能,说明本地 DNS 服务器有问题。

常见公共 DNS 服务器:

  • Google DNS:8.8.8.8, 8.8.4.4
  • Cloudflare DNS:1.1.1.1, 1.0.0.1
  • OpenDNS:208.67.222.222, 208.67.220.220
  • 阿里 DNS:223.5.5.5, 223.6.6.6
  • 腾讯 DNS:119.29.29.29

5.4.2 检查递归服务器配置

如果使用自建 DNS 服务器(例如 BIND、dnsmasq、unbound),检查配置文件。

BIND 配置文件:


			   bashcat /etc/named.conf cat /etc/bind/named.conf 

检查:

  • 监听地址和端口
  • 转发器配置
  • 递归查询是否启用
  • ACL 访问控制

dnsmasq 配置文件:


			   bashcat /etc/dnsmasq.conf 

检查:

  • 上游 DNS 服务器
  • 缓存大小
  • 监听接口

5.4.3 检查递归服务器日志

BIND 日志:


			   bashtail -f /var/log/named.log tail -f /var/log/syslog | grep named 

dnsmasq 日志:


			   bashtail -f /var/log/dnsmasq.log tail -f /var/log/syslog | grep dnsmasq 

查找错误信息、查询失败记录。

5.4.4 检查递归服务器性能


			   bashdig @localhost www.example.com | grep "Query time" 

查看查询时间,如果超过 100ms,可能存在性能问题。

检查服务器资源使用:


			   bashtop -p $(pidof named) top -p $(pidof dnsmasq) 

检查 CPU 和内存使用率。

5.5 检查权威 DNS 服务器

5.5.1 找到权威 DNS 服务器

查询域名的 NS 记录:


			   bashdig example.com NS +short 

输出示例:


			   ns1.example.com. ns2.example.com. 

查询 NS 服务器的 IP:


			   bashdig ns1.example.com +short 

5.5.2 直接查询权威服务器


			   bashdig @ns1.example.com www.example.com 

如果权威服务器返回正确结果,但递归服务器返回错误结果,说明递归服务器缓存有问题或配置错误。

5.5.3 检查 SOA 记录


			   bashdig example.com SOA +short 

输出示例:


			   ns1.example.com. admin.example.com. 2024010101 3600 1800 604800 86400 

SOA 记录包含:

  • 主 NS 服务器
  • 管理员邮箱
  • 序列号(用于主从同步)
  • 刷新时间、重试时间、过期时间、最小 TTL

序列号格式通常为 YYYYMMDDNN,修改 DNS 记录后序列号应增加。

5.5.4 检查主从同步

如果使用主从 DNS 架构,检查从服务器是否同步:


			   bashdig @ns1.example.com example.com SOA dig @ns2.example.com example.com SOA 

比较两个服务器的 SOA 序列号,如果不一致,说明从服务器未同步。

检查从服务器日志:


			   bashtail -f /var/log/named.log | grep "zone transfer" 

5.6 检查 DNS 记录配置

5.6.1 检查 A/AAAA 记录


			   bashdig www.example.com A +short dig www.example.com AAAA +short 

确认返回的 IP 地址是否正确。

5.6.2 检查 CNAME 记录


			   bashdig www.example.com +noall +answer 

如果域名是 CNAME,输出会显示 CNAME 记录和最终的 A 记录。

注意:

  • CNAME 记录不能与其他记录类型共存(例如 A、MX)
  • 根域(例如 example.com)通常不能使用 CNAME

5.6.3 检查 MX 记录


			   bashdig example.com MX +short 

输出示例:


			   10 mail.example.com. 20 mail2.example.com. 

数字表示优先级,数值越小优先级越高。

确认 MX 记录指向的主机有 A 记录:


			   bashdig mail.example.com A +short 

5.6.4 检查 TXT 记录


			   bashdig example.com TXT +short 

TXT 记录常用于:

  • SPF(Sender Policy Framework):v=spf1 ...
  • DKIM(DomainKeys Identified Mail):包含公钥
  • DMARC(Domain-based Message Authentication, Reporting & Conformance):v=DMARC1; ...
  • 域名验证(例如 Google、Microsoft、SSL 证书颁发机构)

5.6.5 检查 TTL


			   bashdig www.example.com +noall +answer 

输出示例:


			   www.example.com. 300 IN A 192.0.2.1 

300 是 TTL,单位为秒(5 分钟)。

TTL 设置建议:

  • 正常情况:300-3600 秒(5 分钟到 1 小时)
  • 即将修改记录:降低到 60-300 秒,加快缓存失效
  • 长期稳定:可以设置 3600-86400 秒(1 小时到 1 天)

5.7 检查 DNS 缓存

5.7.1 清除浏览器缓存

Chrome:

访问 chrome://net-internals/#dns,点击"Clear host cache"。

Firefox:

关闭浏览器重新打开,或访问 about:networking#dns,点击"Clear DNS Cache"。

5.7.2 清除操作系统缓存

Linux(使用 systemd-resolved):


			   bashsystemd-resolve --flush-caches systemd-resolve --statistics 

Linux(使用 nscd):


			   bashsystemctl restart nscd 

macOS:


			   bashsudo dscacheutil -flushcache sudo killall -HUP mDNSResponder 

Windows:


			   cmdipconfig /flushdns 

5.7.3 清除递归服务器缓存

BIND:


			   bashrndc flush 

清除所有缓存。


			   bashrndc flushname example.com 

清除特定域名缓存。

dnsmasq:


			   bashsystemctl restart dnsmasq 

重启服务清除缓存。

unbound:


			   bashunbound-control flush example.com 

5.7.4 检查缓存内容

BIND:


			   bashrndc dumpdb -cache cat /var/cache/bind/named_dump.db 

查看缓存的记录。

5.8 检查网络路径

5.8.1 检查到 DNS 服务器的连通性


			   bashping 8.8.8.8 

确认网络可达。


			   bashtraceroute 8.8.8.8 

查看路由路径,定位网络中断点。

5.8.2 检查 DNS 端口

DNS 使用 UDP 53 和 TCP 53 端口。

测试 UDP 53:


			   bashnc -u -v 8.8.8.8 53 

测试 TCP 53:


			   bashnc -v 8.8.8.8 53 

如果无法连接,可能被防火墙阻止。

5.8.3 检查防火墙规则

本地防火墙:


			   bashiptables -L -n | grep 53 

确认没有阻止 DNS 端口。

云服务器安全组:

检查云平台控制台的安全组规则,确保允许出站 UDP/TCP 53。

5.8.4 检查 DNS 劫持

部分网络运营商会劫持 DNS 查询,返回错误结果或广告页面。

测试方法:


			   bashdig @8.8.8.8 www.nonexistentdomain12345.com 

正常情况应返回 NXDOMAIN

如果返回 IP 地址或被重定向到广告页面,说明存在 DNS 劫持。

解决方法:

  • 使用加密 DNS(DoH、DoT)
  • 使用 VPN
  • 更换 DNS 服务器

5.9 检查域名状态

5.9.1 检查域名是否过期


			   bashwhois example.com | grep -i "expir" 

查看域名过期时间。

如果域名过期,需要续费后等待 DNS 恢复(通常 24-48 小时)。

5.9.2 检查域名状态码


			   bashwhois example.com | grep -i "status" 

常见状态码:

  • ok:正常
  • clientHold:域名被暂停
  • serverHold:域名被注册商暂停
  • redemptionPeriod:域名在赎回期
  • pendingDelete:域名即将删除

如果状态异常,联系域名注册商解决。

5.9.3 检查 NS 服务器是否正确


			   bashwhois example.com | grep -i "name server" 

确认 NS 服务器地址与实际配置一致。

如果修改了 NS 服务器,需要等待 24-48 小时全球生效。

5.10 DNS 安全问题排查

5.10.1 检查 DNS 缓存投毒

症状:

  • 解析到错误的 IP 地址
  • 不同 DNS 服务器返回不同结果

排查方法:


			   bashdig @8.8.8.8 www.example.com dig @1.1.1.1 www.example.com 

比较多个公共 DNS 服务器的结果。

如果本地递归服务器返回错误结果,但公共 DNS 返回正确结果,可能是缓存投毒。

解决方法:

  • 清除递归服务器缓存
  • 启用 DNSSEC
  • 升级 DNS 服务器软件

5.10.2 检查 DNS 放大攻击

症状:

  • DNS 服务器流量异常
  • 大量来自随机 IP 的查询
  • 服务器响应变慢

排查方法:


			   bashtcpdump -i eth0 -n port 53 | head -100 

抓取 DNS 查询包,分析来源 IP 和查询内容。

如果发现大量对同一域名的 ANY 查询,可能是放大攻击。

解决方法:

  • 限制递归查询(仅对内网开放)
  • 禁用 ANY 查询
  • 启用速率限制
  • 使用防火墙阻止可疑 IP

5.10.3 检查 DNSSEC

DNSSEC 用于验证 DNS 响应的真实性,防止缓存投毒。

检查域名是否启用 DNSSEC:


			   bashdig example.com +dnssec 

如果返回 RRSIG 记录,说明启用了 DNSSEC。

验证 DNSSEC 签名:


			   bashdig example.com +dnssec +multiline 

如果验证失败,会显示 SERVFAIL

5.11 常见故障场景排查

5.11.1 域名解析不到

症状:


			   bashdig www.example.com 

返回 NXDOMAIN

原因:

  • 域名不存在
  • DNS 记录未配置
  • NS 服务器配置错误

排查步骤:

  1. 确认域名是否注册:whois example.com
  2. 检查 NS 服务器:dig example.com NS
  3. 直接查询权威服务器:dig @ns1.example.com www.example.com
  4. 检查权威服务器配置文件

5.11.2 解析到错误的 IP

症状:


			   bashdig www.example.com +short 

返回错误的 IP 地址。

原因:

  • DNS 记录配置错误
  • 缓存未更新
  • DNS 劫持

排查步骤:

  1. 直接查询权威服务器确认记录是否正确
  2. 清除本地和递归服务器缓存
  3. 使用多个公共 DNS 测试
  4. 检查 hosts 文件

5.11.3 解析超时

症状:


			   bashdig www.example.com 

长时间无响应,最后超时。

原因:

  • DNS 服务器不可达
  • 防火墙阻止 DNS 查询
  • DNS 服务器负载过高
  • 网络故障

排查步骤:

  1. 检查 DNS 服务器可达性:ping 8.8.8.8
  2. 检查 DNS 端口:nc -u -v 8.8.8.8 53
  3. 更换 DNS 服务器测试
  4. 检查防火墙规则
  5. 检查 DNS 服务器日志和性能

5.11.4 部分地区无法解析

症状:

部分地区用户可以访问,部分地区无法访问。

原因:

  • DNS 解析未全球生效
  • 地理位置解析配置错误
  • 部分 DNS 服务器故障

排查步骤:

  1. 使用在线工具检查全球解析情况: https://dnschecker.org/
  2. 检查权威 DNS 服务器是否全部正常
  3. 检查地理位置解析配置
  4. 等待 DNS 记录全球生效(24-48 小时)

5.11.5 CNAME 解析失败

症状:


			   bashdig www.example.com 

返回 CNAME 记录,但没有 A 记录。

原因:

  • CNAME 指向的域名没有 A 记录
  • CNAME 循环引用

排查步骤:

  1. 检查 CNAME 指向的域名:dig cdn.example.com
  2. 检查是否存在循环引用
  3. 确认目标域名有 A 记录

5.11.6 邮件发送失败

症状:

邮件发送失败,提示无法解析 MX 记录。

原因:

  • MX 记录未配置
  • MX 记录指向的主机没有 A 记录

排查步骤:

  1. 检查 MX 记录:dig example.com MX
  2. 检查 MX 主机的 A 记录:dig mail.example.com A
  3. 确认 MX 优先级正确

六、常用命令

6.1 查询命令


			   bash# 基本查询 nslookup www.example.com dig www.example.com host www.example.com # 指定 DNS 服务器 nslookup www.example.com 8.8.8.8 dig @8.8.8.8 www.example.com host www.example.com 8.8.8.8 # 查询特定记录类型 dig example.com A dig example.com AAAA dig example.com MX dig example.com TXT dig example.com NS dig example.com SOA dig example.com CNAME # 简化输出 dig www.example.com +short # 追踪查询路径 dig www.example.com +trace # 反向解析 dig -x 192.0.2.1 host 192.0.2.1 # 查询 DNSSEC dig example.com +dnssec 

6.2 缓存管理


			   bash# 清除本地缓存 # Linux (systemd-resolved) systemd-resolve --flush-caches # Linux (nscd) systemctl restart nscd # macOS sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder # Windows ipconfig /flushdns # 清除 BIND 缓存 rndc flush rndc flushname example.com # 清除 dnsmasq 缓存 systemctl restart dnsmasq # 查看 BIND 缓存 rndc dumpdb -cache cat /var/cache/bind/named_dump.db 

6.3 服务管理


			   bash# 启动/停止/重启 DNS 服务 # BIND systemctl start named systemctl stop named systemctl restart named systemctl status named # dnsmasq systemctl start dnsmasq systemctl stop dnsmasq systemctl restart dnsmasq systemctl status dnsmasq # 检查配置文件语法 # BIND named-checkconf /etc/named.conf named-checkzone example.com /var/named/example.com.zone # 重新加载配置 # BIND rndc reload 

6.4 日志查看


			   bash# 查看 DNS 日志 # BIND tail -f /var/log/named.log tail -f /var/log/syslog | grep named # dnsmasq tail -f /var/log/dnsmasq.log tail -f /var/log/syslog | grep dnsmasq # systemd 日志 journalctl -u named -f journalctl -u dnsmasq -f 

6.5 网络测试


			   bash# 测试 DNS 服务器可达性 ping 8.8.8.8 traceroute 8.8.8.8 # 测试 DNS 端口 nc -u -v 8.8.8.8 53    # UDP nc -v 8.8.8.8 53       # TCP # 抓包分析 tcpdump -i eth0 -n port 53 tcpdump -i eth0 -n udp port 53 -w dns.pcap 

七、配置示例

7.1 /etc/resolv.conf 配置


			   bash# DNS 服务器 nameserver 8.8.8.8 nameserver 8.8.4.4 # 搜索域 search example.com # 查询超时时间(秒) options timeout:2 # 查询重试次数 options attempts:3 

注意:

  • nameserver 最多可以配置 3 个
  • 查询会按顺序尝试每个 nameserver
  • search 用于补全短域名,例如查询 www 会自动尝试 www.example.com

7.2 BIND 配置示例

主配置文件 /etc/named.conf


			   options {     listen-on port 53 { 127.0.0.1; 192.168.1.1; };     directory "/var/named";     dump-file "/var/named/data/cache_dump.db";     statistics-file "/var/named/data/named_stats.txt";     memstatistics-file "/var/named/data/named_mem_stats.txt";          recursion yes;     allow-query { localhost; 192.168.1.0/24; };     allow-transfer { none; };          forwarders {         8.8.8.8;         8.8.4.4;     };          dnssec-enable yes;     dnssec-validation yes; }; zone "example.com" IN {     type master;     file "example.com.zone";     allow-update { none; }; }; zone "1.168.192.in-addr.arpa" IN {     type master;     file "1.168.192.rev";     allow-update { none; }; }; 

正向解析区域文件 /var/named/example.com.zone


			   $TTL 3600 @   IN  SOA ns1.example.com. admin.example.com. (         2024010101  ; Serial         3600        ; Refresh         1800        ; Retry         604800      ; Expire         86400 )     ; Minimum TTL @           IN  NS      ns1.example.com. @           IN  NS      ns2.example.com. @           IN  A       192.0.2.1 @           IN  MX  10  mail.example.com. ns1         IN  A       192.0.2.10 ns2         IN  A       192.0.2.11 www         IN  A       192.0.2.1 mail        IN  A       192.0.2.20 ftp         IN  CNAME   www 

反向解析区域文件 /var/named/1.168.192.rev


			   $TTL 3600 @   IN  SOA ns1.example.com. admin.example.com. (         2024010101  ; Serial         3600        ; Refresh         1800        ; Retry         604800      ; Expire         86400 )     ; Minimum TTL @       IN  NS      ns1.example.com. @       IN  NS      ns2.example.com. 1       IN  PTR     example.com. 10      IN  PTR     ns1.example.com. 11      IN  PTR     ns2.example.com. 20      IN  PTR     mail.example.com. 

7.3 dnsmasq 配置示例

配置文件 /etc/dnsmasq.conf


			   # 监听接口 interface=eth0 # 不监听回环接口(安全考虑) bind-interfaces # 上游 DNS 服务器 server=8.8.8.8 server=8.8.4.4 # 缓存大小 cache-size=10000 # 本地域名解析 address=/example.local/192.168.1.1 # 本地 hosts 文件 addn-hosts=/etc/dnsmasq.hosts # 日志 log-queries log-facility=/var/log/dnsmasq.log # 防止上游 DNS 泄露 no-resolv 

7.4 systemd-resolved 配置

配置文件 /etc/systemd/resolved.conf


			   [Resolve] DNS=8.8.8.8 8.8.4.4 FallbackDNS=1.1.1.1 1.0.0.1 Domains=~. DNSSEC=yes DNSOverTLS=opportunistic Cache=yes 

重启服务:


			   bashsystemctl restart systemd-resolved 

7.5 DoH/DoT 配置

使用 cloudflared 配置 DoH:

安装:


			   bashwget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod +x cloudflared-linux-amd64 mv cloudflared-linux-amd64 /usr/local/bin/cloudflared 

运行:


			   bashcloudflared proxy-dns --port 5353 --upstream https://1.1.1.1/dns-query 

配置本地 DNS:

编辑 /etc/resolv.conf


			   nameserver 127.0.0.1 

配置 systemd 服务 /etc/systemd/system/cloudflared.service


			   [Unit] Description=Cloudflare DNS over HTTPS proxy After=network.target [Service] Type=simple ExecStart=/usr/local/bin/cloudflared proxy-dns --port 53 --upstream https://1.1.1.1/dns-query Restart=on-failure [Install] WantedBy=multi-user.target 

启动服务:


			   bashsystemctl daemon-reload systemctl start cloudflared systemctl enable cloudflared 

八、日志和指标观察方法

8.1 BIND 日志

默认日志路径:

  • /var/log/named.log
  • /var/log/syslog 或 /var/log/messages

关键日志信息:


			   # 查询日志 query: info: client 192.168.1.100#54321 (www.example.com): query: www.example.com IN A # 响应日志 query: info: client 192.168.1.100#54321 (www.example.com): query: www.example.com IN A response: NOERROR # 区域传输日志 zone example.com/IN: Transfer started. zone example.com/IN: Transfer completed: 15 messages, 50 records, 2048 bytes, 0.123 secs # 错误日志 zone example.com/IN: loading from master file example.com.zone failed: file not found 

8.2 dnsmasq 日志

配置日志:

编辑 /etc/dnsmasq.conf


			   log-queries log-facility=/var/log/dnsmasq.log 

关键日志信息:


			   # 查询日志 query[A] www.example.com from 192.168.1.100 # 转发日志 forwarded www.example.com to 8.8.8.8 # 响应日志 reply www.example.com is 192.0.2.1 # 缓存日志 cached www.example.com is 192.0.2.1 

8.3 监控指标

使用 Prometheus 监控 DNS:

安装 bind_exporter


			   bashwget https://github.com/prometheus-community/bind_exporter/releases/latest/download/bind_exporter-linux-amd64.tar.gz tar -xzf bind_exporter-linux-amd64.tar.gz mv bind_exporter /usr/local/bin/ 

运行:


			   bash/usr/local/bin/bind_exporter --bind.stats-url=http://localhost:8053/ --bind.stats-groups=server,view,tasks 

配置 Prometheus:


			   yamlscrape_configs:   - job_name: 'bind'     static_configs:       - targets: ['localhost:9119'] 

关键指标:

  • bind_query_recursion_total:递归查询次数
  • bind_query_duplicates_total:重复查询次数
  • bind_responses_total:响应次数(按响应码分类)
  • bind_resolver_cache_hits_total:缓存命中次数
  • bind_resolver_cache_misses_total:缓存未命中次数

8.4 性能测试

使用 dnsperf 测试 DNS 性能:

安装:


			   bashapt install dnsperf -y      # Debian/Ubuntu yum install dnsperf -y      # CentOS/RHEL 

准备测试数据 queries.txt


			   www.example.com A api.example.com A cdn.example.com A 

执行测试:


			   bashdnsperf -s 8.8.8.8 -d queries.txt -c 10 -l 30 

参数说明:

  • -s:DNS 服务器地址
  • -d:查询数据文件
  • -c:并发查询数
  • -l:测试时长(秒)

输出示例:


			   Queries sent:         15000 Queries completed:    15000 Queries lost:         0 Response codes:       NOERROR 15000 Average Latency (s):  0.010 

九、排查路径

9.1 无法解析域名

排查路径:

  1. 确认域名拼写正确
  2. 检查本地网络连接:ping 8.8.8.8
  3. 检查 DNS 配置:cat /etc/resolv.conf
  4. 使用公共 DNS 测试:dig @8.8.8.8 www.example.com
  5. 检查 hosts 文件:cat /etc/hosts
  6. 清除 DNS 缓存
  7. 检查防火墙规则
  8. 检查权威 DNS 服务器:dig @ns1.example.com www.example.com
  9. 检查域名状态:whois example.com

9.2 解析到错误 IP

排查路径:

  1. 直接查询权威服务器确认记录:dig @ns1.example.com www.example.com
  2. 清除本地缓存
  3. 清除递归服务器缓存
  4. 检查 hosts 文件
  5. 使用多个公共 DNS 测试
  6. 检查是否存在 DNS 劫持
  7. 检查权威服务器配置

9.3 解析超时

排查路径:

  1. 检查 DNS 服务器可达性:ping 8.8.8.8
  2. 检查 DNS 端口:nc -u -v 8.8.8.8 53
  3. 更换 DNS 服务器测试
  4. 检查防火墙规则
  5. 检查递归服务器日志
  6. 检查递归服务器性能
  7. 检查网络路径:traceroute 8.8.8.8

9.4 部分地区无法解析

排查路径:

  1. 使用在线工具检查全球解析: https://dnschecker.org/
  2. 检查所有权威 DNS 服务器状态
  3. 检查 NS 记录:dig example.com NS
  4. 检查主从同步:比较 SOA 序列号
  5. 检查地理位置解析配置
  6. 等待 DNS 全球生效

9.5 邮件发送失败

排查路径:

  1. 检查 MX 记录:dig example.com MX
  2. 检查 MX 主机的 A 记录:dig mail.example.com A
  3. 检查 MX 优先级
  4. 检查 SPF 记录:dig example.com TXT
  5. 检查邮件服务器日志

十、风险提醒

10.1 修改 DNS 记录风险

  • 修改 DNS 记录后,旧记录可能在缓存中保留 TTL 时间
  • 修改前应降低 TTL,加快缓存失效
  • 修改后应验证解析结果
  • 错误的 DNS 记录会导致服务中断

10.2 清除缓存风险

  • 清除缓存后,DNS 查询会增加,可能影响性能
  • 清除递归服务器缓存会影响所有用户
  • 清除前应确认是缓存问题

10.3 修改 NS 服务器风险

  • 修改 NS 服务器需要 24-48 小时全球生效
  • 修改期间部分用户可能无法解析
  • 修改前应确认新 NS 服务器配置正确
  • 修改后应保留旧 NS 服务器运行一段时间

10.4 DNSSEC 风险

  • 启用 DNSSEC 后,如果签名错误会导致解析失败
  • 修改 DNS 记录后需要重新签名
  • DNSSEC 密钥需要定期轮换
  • DNSSEC 增加解析复杂度和延迟

10.5 递归服务器安全风险

  • 开放递归查询可能被用于 DNS 放大攻击
  • 应限制递归查询仅对内网开放
  • 应启用速率限制
  • 应禁用 ANY 查询

十一、验证方式

11.1 解析结果验证


			   bash# 验证 A 记录 dig www.example.com A +short # 验证 MX 记录 dig example.com MX +short # 验证 TXT 记录 dig example.com TXT +short # 验证 NS 记录 dig example.com NS +short 

11.2 全球解析验证

使用在线工具:

  • https://dnschecker.org/
  • https://www.whatsmydns.net/

检查不同地区的解析结果是否一致。

11.3 TTL 验证


			   bash# 第一次查询,记录 TTL dig www.example.com +noall +answer # 等待几秒后再次查询 dig www.example.com +noall +answer 

TTL 应该递减,到期后会重新查询。

11.4 缓存验证


			   bash# 清除缓存 rndc flush # 查询,记录响应时间 dig www.example.com | grep "Query time" # 再次查询,验证缓存命中 dig www.example.com | grep "Query time" 

缓存命中后查询时间应显著减少。

11.5 DNSSEC 验证


			   bash# 验证 DNSSEC 签名 dig example.com +dnssec +multiline # 检查验证状态 dig example.com +dnssec | grep "flags" 

应显示 ad 标志,表示签名验证成功。

十二、回滚方案

12.1 DNS 记录回滚

如果修改 DNS 记录后出现问题,立即回滚:

  1. 登录 DNS 管理平台
  2. 恢复旧的 DNS 记录
  3. 增加 SOA 序列号
  4. 清除递归服务器缓存:rndc flush
  5. 等待 TTL 时间后验证

12.2 NS 服务器回滚

如果修改 NS 服务器后出现问题:

  1. 登录域名注册商管理平台
  2. 恢复旧的 NS 服务器地址
  3. 等待 24-48 小时生效
  4. 期间保持旧 NS 服务器运行

12.3 配置文件回滚

如果修改 DNS 服务器配置后出现问题:


			   bash# 恢复配置文件备份 cp /etc/named.conf.bak /etc/named.conf # 检查配置语法 named-checkconf /etc/named.conf # 重启服务 systemctl restart named # 验证服务状态 systemctl status named 

十三、生产环境注意事项

13.1 修改前准备

  • 降低 TTL 到 300 秒或更低,等待旧 TTL 时间后再修改记录
  • 备份当前 DNS 记录
  • 在测试环境验证修改
  • 准备回滚方案

13.2 修改时机

  • 选择业务低峰期修改
  • 避免在节假日或重大活动期间修改
  • 提前通知相关团队

13.3 修改后验证

  • 使用多个 DNS 服务器验证解析结果
  • 使用在线工具检查全球解析
  • 监控业务指标,确认无异常
  • 查看 DNS 服务器日志

13.4 主从同步

  • 修改主服务器后,确认从服务器已同步
  • 比较主从服务器的 SOA 序列号
  • 检查从服务器日志

13.5 监控告警

  • 配置 DNS 解析监控
  • 配置 DNS 服务器可用性监控
  • 配置证书过期监控
  • 异常时及时告警

十四、总结

DNS 是互联网基础服务,故障排查需要系统性方法。

核心排查流程:


			   确认现象 → 本地排查 → 递归服务器排查 → 权威服务器排查 → 网络路径排查 → 缓存排查 → 配置排查 → 验证修复 

关键工具:

  • dig:功能最强大,输出详细
  • nslookup:交互式查询
  • host:输出简洁
  • whois:查询域名信息

常见故障:

  • 域名解析不到:检查 NS 服务器、权威服务器配置
  • 解析到错误 IP:检查记录配置、缓存、DNS 劫持
  • 解析超时:检查网络、DNS 服务器性能、防火墙
  • 部分地区无法解析:检查主从同步、地理解析、全球生效

安全防护:

  • 限制递归查询
  • 启用 DNSSEC
  • 使用 DoH/DoT 加密 DNS
  • 配置速率限制
  • 监控异常查询

生产环境操作:

  • 修改前降低 TTL
  • 选择低峰期操作
  • 准备回滚方案
  • 修改后验证
  • 配置监控告警

DNS 故障影响面广,排查要快速准确,修复要稳妥可靠。

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分