DNS 查询实战:从 DoH 协议到 16 种记录类型与 DNSSEC 验证

为什么 DNS 是开发者的必修课

每个开发者或多或少都遇到过 DNS 问题:

  • 网站访问慢,浏览器卡在「解析主机」,但 PING 又能通
  • 切换 CDN 后部分用户还能访问旧 IP,部分用户拿到新 IP
  • 邮件发送被拒,对方服务器报「SPF 验证失败」
  • HTTPS 证书由非预期 CA 签发,安全告警
  • HTTP/3 升级后浏览器仍走 HTTP/2,QUIC 握手失败
  • 域名指向新服务器后等了 2 小时仍有人访问到旧地址
  • 内网域名无法解析,但 dig 命令直接查却正常

这些场景的底层都是同一套机制:DNS 记录 + TTL 缓存 + 递归解析 + DNSSEC 验证。理解了它们,你就能在 30 秒内回答「修改 DNS 后多久生效」「为什么 1.1.1.1 解析到 A 而 8.8.8.8 解析到 B」「SPF 失败应该改哪条记录」这类问题。

配套工具:DNS 查询工具(16 种记录类型 + 3 个 DoH 服务商 + DNSSEC 验证 + dig 风格导出)、IP 子网计算器(解析出的 IP 走子网划分)、Punycode 编解码(中文域名 ACE 转换)

一、DNS 基础:从域名到 IP 的解析链路

1.1 DNS 是什么

DNS(Domain Name System,域名系统)是把人类可读的域名(如 cloudflare.com)转换为机器可识别的 IP 地址(如 104.16.132.229)的分布式数据库。整个解析过程涉及多个层级:

浏览器
  ↓ 查询 cloudflare.com 的 A 记录
本地 DNS 缓存(浏览器 → OS → 路由器 → ISP 递归解析器)
  ↓ 缓存未命中,递归解析器开始查询
根域名服务器(.)         → 返回 .com 的 NS

顶级域名服务器(.com)    → 返回 cloudflare.com 的 NS

权威 DNS 服务器           → 返回 cloudflare.com 的 A 记录

递归解析器缓存(按 TTL)→ 返回给浏览器

整个过程通常在 10-100 毫秒内完成。dig +trace cloudflare.com 命令可以看到完整链路。

1.2 递归查询与迭代查询

  • 递归查询:客户端向递归解析器(如 8.8.8.8)发起查询,由解析器负责走完整条链路,最终返回结果给客户端。客户端只需一次往返。
  • 迭代查询:解析器向根、TLD、权威依次询问,每一层只返回「下一步去问谁」,由解析器自己继续追问。

浏览器与系统 DNS 都使用递归查询;递归解析器与根/TLD/权威之间使用迭代查询。

1.3 端口与协议

协议端口加密备注
UDP DNS53传统明文查询,最常用
TCP DNS53报文超过 512 字节或区域传输时使用
DoT(DNS over TLS)853TLS 加密 DNS 查询
DoH(DNS over HTTPS)443HTTPS 加密 DNS,本工具使用的协议
DoQ(DNS over QUIC)853基于 QUIC 的新协议(RFC 9250)

DoH 的核心优势是与正常 Web 流量混在一起:端口号、协议、流量特征都和访问普通 HTTPS 网站一致,难以单独识别与干扰。

二、16 种记录类型详解

2.1 网站访问类

类型用途示例数据
A域名 → IPv4 地址93.184.216.34
AAAA域名 → IPv6 地址2606:2800:220:1:248:1893:25c8:1946
CNAME域名 → 另一域名(别名)example.com.cdn.cloudflare.net.

CNAME 的核心约束:CNAME 不能与其他记录共存(根域不能有 CNAME,否则 MX、TXT 等记录会被忽略)。这是为什么根域使用 CDN 时常用 ANAME / ALIAS(伪记录,由 DNS 服务商解析为 A)。

A vs AAAA:现代浏览器优先尝试 AAAA(Happy Eyeballs 算法),IPv6 可用时优先走 IPv6。监控 IPv6 解析率是 CDN 优化的重要指标。若需对解析到的 IP 地址进行 CIDR 子网划分,可配合 CIDR 子网掩码计算 计算网络地址与主机范围。

2.2 邮件服务类

类型用途示例数据
MX邮件服务器优先级10 mail.example.com.
TXT反垃圾配置(SPF/DKIM/DMARC)"v=spf1 include:_spf.google.com ~all"

MX 优先级:数字越小优先级越高。多个 MX 时低优先级做备份;主服务器宕机时发件方自动降级到次优先级。

SPF / DKIM / DMARC 三件套

  • SPF(TXT 记录):声明哪些 IP 可以发本域邮件
  • DKIM(TXT 记录,子域 selector._domainkey):邮件签名公钥
  • DMARC(TXT 记录,子域 _dmarc):策略汇总,规定 SPF/DKIM 失败后的处理(none / quarantine / reject)

收件方对 SPF/DKIM/DMARC 三重校验都通过才放行,这是邮件送达率的核心保障。

2.3 域名管理类

类型用途示例数据
NS域名的权威 DNS 服务器ns1.cloudflare.com.
SOA区域主服务器与全局参数ns.cloudflare.com. dns.cloudflare.com. 2345678901 10000 2400 604800 1800

SOA 的 7 个字段

  1. MNAME:主权威服务器
  2. RNAME:管理员邮箱(. 替代 @
  3. SERIAL:区域版本号,主从同步依据
  4. REFRESH:从服务器刷新间隔(秒)
  5. RETRY:刷新失败重试间隔
  6. EXPIRE:从服务器数据过期时间
  7. MINIMUM:默认 TTL(RFC 2308 后改为负缓存 TTL)

修改 DNS 后增加 SERIAL,从服务器才会触发同步,这是 DNS 主从架构的关键。

2.4 反向解析类

PTR:IP 反查域名,输入格式为 1.0.0.127.in-addr.arpa(IPv4)或 ...ip6.arpa(IPv6)。

反向解析常用于:

  • 邮件反垃圾:很多邮件服务器要求发件 IP 的 PTR 记录匹配正向解析
  • 网络诊断:traceroute / netstat 默认显示 PTR
  • 日志分析:将 IP 转为可读域名

注意:PTR 记录由 IP 持有方(ISP / 云厂商)配置,普通域名持有者无法直接设置,需通过 ISP 控制台或工单申请。

2.5 证书与安全类

类型用途示例数据
CAA限制可签发证书的 CA0 issue "letsencrypt.org"
TLSATLS 证书指纹绑定(DANE)3 1 1 abcd1234...
DSDNSSEC 父区对子区 KSK 签名2371 13 2 abcdef...
DNSKEY区域公钥(KSK/ZSK)257 3 13 base64...

CAA 记录:默认任何 CA 都可以为任何域名签发证书。CAA 记录让域名所有者声明「仅允许 Let’s Encrypt 等指定 CA 签发」,是防证书误签发的第一道防线。2017 年起 CA/Browser Forum 强制要求 CA 签发证书前检查 CAA。

TLSA 记录与 DANE:在 DNS 中绑定 TLS 证书指纹(或公钥),客户端校验 DNS 链可信即可确认证书可信。常用于邮件 MTA 之间的传输加密(MTA-STS 增强),避开 CA 信任链。

2.6 服务发现类

类型用途示例数据
SRV服务端口与主机10 5 5060 sip.example.com.
HTTPSHTTP 服务参数(HTTP/3)1 . alpn=h3,h2 port=443
SVCB通用服务绑定1 . alpn=h2 port=8443
NAPTRURI / 电话号码映射100 50 "S" "SIP+D2U" "" _sip._udp.example.com.

SRV 的 4 字段:优先级 / 权重 / 端口 / 目标。常用于 SIP、XMPP、Active Directory、Kerberos 等服务的自动发现。

HTTPS / SVCB 记录与 HTTP/3:传统 HTTP/3 升级需先 TCP 连接拿到 Alt-Svc 响应头,浏览器才能发起 QUIC 连接,存在一次额外往返。HTTPS 记录在 DNS 阶段就告知浏览器「该域名支持 h3 协议、端口、IPv4/IPv6 hints、ECH 公钥」,浏览器可直接发起 QUIC,节省一次往返。

ECH(Encrypted Client Hello):HTTPS 记录可携带 ECH 公钥,用于加密 TLS ClientHello 中的 SNI 字段,防止中间人识别访问的域名(即使用户访问的网站由共享 IP 的 CDN 托管)。这是 SNI 加密的现代方案,Cloudflare 与 Firefox / Chrome 已部署。

2.7 记录类型速查表

类型代码名称中文标签关键场景
1AIPv4 地址网站访问
2NS名称服务器域名管理
5CNAME别名CDN 接入
6SOA起始授权主从同步
12PTR反向解析IP 反查域名
15MX邮件交换邮件服务
16TXT文本记录所有权验证 / SPF
28AAAAIPv6 地址IPv6 访问
33SRV服务记录服务发现
35NAPTR命名授权指针URI 映射
43DS委托签名DNSSEC 链
48DNSKEYDNS 公钥DNSSEC 验证
52TLSATLS 认证DANE
64SVCB服务绑定通用服务
65HTTPSHTTPS 记录HTTP/3
257CAACA 授权证书签发限制

三、DNS over HTTPS(DoH):加密 DNS 的现代方案

3.1 传统 DNS 的安全短板

传统 UDP DNS 走 53 端口明文传输,存在三大风险:

  1. 窃听:路由器、ISP、Wi-Fi 提供商都能看到你查询了什么域名
  2. 篡改:HTTPDNS 劫持(如运营商把查询结果替换为广告页 IP)难以发现
  3. 审查:基于端口的 DNS 拦截简单粗暴,可单独屏蔽 53 端口

DoH(RFC 8484)将 DNS 查询封装在 HTTPS 请求中传输,解决了上述三个问题。

3.2 DoH 协议两种格式

  • JSON API(GET):本工具使用的格式,URL 查询参数 ?name=&type=,响应 JSON。简单易调试,适合浏览器直连。代表性端点:https://cloudflare-dns.com/dns-queryhttps://dns.google/resolve
  • Wireformat(POST):二进制 DNS 报文,与 DoT/UDP DNS 完全兼容,性能更高。适合系统级 DoH 客户端(如 Firefox / Chrome 内置)。

3.3 浏览器直连 DoH 的 CORS 考量

浏览器调用 fetch() 跨域请求 DoH 端点时,需要 DoH 服务商支持 CORS(跨域资源共享)。本工具内置 3 个明确支持 CORS 的服务商:

服务商端点CORS 支持
Cloudflare 1.1.1.1https://cloudflare-dns.com/dns-query
Google Public DNShttps://dns.google/resolve
DNS.SBhttps://doh.dns.sb/dns-query

主流厂商中 AliDNS、DNSPod 等的 DoH 端点未开放 CORS,浏览器无法直接调用,必须走服务端转发(与本站「不经本站服务器」定位冲突,故未纳入)。

3.4 DoH JSON 响应结构

{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": true,
  "CD": false,
  "Question": [{ "name": "cloudflare.com.", "type": 1 }],
  "Answer": [
    { "name": "cloudflare.com.", "type": 1, "TTL": 300, "data": "104.16.132.229" }
  ]
}

字段含义:

  • Status:DNS RCODE(0 = NOERROR,3 = NXDOMAIN)
  • TC:是否截断(响应过长被截断,需 TCP 重试)
  • RD:期望递归(客户端请求递归)
  • RA:支持递归(服务器提供递归)
  • AD:已验证(DNSSEC 验证通过)
  • CD:关闭校验(客户端请求不验证 DNSSEC)
  • Question / Answer / Authority / Additional:DNS 报文四段

四、DNSSEC:链路可信的基石

4.1 DNSSEC 解决什么问题

传统 DNS 没有签名验证,权威服务器返回什么客户端就用什么。中间人即使篡改了递归解析器的缓存(DNS 投毒),客户端也无法发现。

DNSSEC 通过对 DNS 记录数字签名实现「数据来源可信 + 数据完整性」:

  • 权威服务器用私钥签名记录
  • 递归解析器用公钥验证签名
  • 公钥本身通过 DS 记录由父区域签名
  • 形成「根 → TLD → 二级域」的信任链

4.2 DNSSEC 链路:KSK / ZSK / DS

  • KSK(Key Signing Key):签名 ZSK 的密钥,长期不变
  • ZSK(Zone Signing Key):签名具体记录的密钥,定期轮换
  • DS(Delegation Signer):父区域对子区域 KSK 的摘要签名,将信任从父域延伸到子域

信任链起点是根区域的 KSK(根信任锚),其公钥内置在解析器中。

4.3 AD / CD 字段解读

ADCD含义
10DNSSEC 验证通过,数据可信
00未通过 DNSSEC 验证(域名未部署 / 配置错误 / 链断裂)
-1客户端请求关闭验证,服务器返回原始未验证数据

调试技巧

  • 先开 DNSSEC 查 DNSKEY / DS,看链路是否完整
  • 关闭 DNSSEC(CD=1)查原始数据,对比验证失败的具体环节
  • 部署 DNSSEC 后必须更新父域 DS 记录,否则链断裂导致 SERVFAIL

4.4 部署 DNSSEC 的常见错误

  1. KSK 轮换后未更新 DS:父域的 DS 仍指向旧 KSK,新 KSK 签名的数据验证失败
  2. NSEC3 而非 NSEC 但盐值未定期更换:枚举攻击风险增加
  3. 算法选择过旧:建议使用 ECDSAP256SHA256(算法 13),性能与安全兼顾
  4. 未配置 CDS / CDNSKEY 记录:自动化 KSK 轮换机制缺失,依赖人工更新 DS

五、TTL 与多级缓存:为什么修改 DNS 不立即生效

5.1 多级缓存层级

浏览器 DNS 缓存(Chrome: //net-internals/#dns)
  ↓ 缓存未命中
操作系统 DNS 缓存(Windows: ipconfig /displaydns)
  ↓ 缓存未命中
路由器 / 本地网关缓存
  ↓ 缓存未命中
ISP / 企业递归解析器缓存(8.8.8.8、114.114.114.114 等)
  ↓ 缓存未命中
权威 DNS 服务器(最新数据)

每一层都按 TTL 缓存,因此修改 DNS 后需等所有层级 TTL 过期才全球生效。

5.2 TTL 选择策略

TTL适用场景优劣
60sCDN 切换、灰度发布切换快但查询频繁
300s中等变更频率平衡查询量与切换速度
3600s邮件 MX、静态配置查询少但变更慢
86400sNS 记录、根域配置极少变更

切换前降低 TTL 是标准做法:原 TTL 是 3600s,要切换 IP,应先将 TTL 改为 60s,等 1 小时旧 TTL 过期后切换 IP,全球生效时间从 1 小时缩短到 1 分钟。

5.3 负缓存 TTL

NXDOMAIN(域名不存在)的响应也会被缓存,TTL 由 SOA 的 MINIMUM 字段控制(RFC 2308)。因此即使删除了某域名,旧 NXDOMAIN 缓存仍可能影响后续查询。建议删除域名时主动设置较短 MINIMUM。

5.4 浏览器与系统 DNS 缓存

  • Chromechrome://net-internals/#dns 查看,chrome://net-internals/#sockets 点击 Flush socket pools 清空
  • Windowsipconfig /flushdns 清空系统缓存
  • macOSsudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
  • Linuxsudo systemd-resolve --flush-cachessudo systemctl restart systemd-resolved

注意:浏览器可能绕过系统 DNS,直接使用 DoH(如 Chrome 设置中的「安全 DNS」),此时系统 ipconfig /flushdns 无效。

六、DNS 诊断流程:从域名到访问失败的排查

6.1 五步诊断法

1. 域名解析是否存在
   dig example.com A → NXDOMAIN? 未注册或拼写错误
   
2. 解析到正确 IP 吗
   dig example.com A @1.1.1.1 vs @8.8.8.8 → IP 不一致?多解析器缓存差异
   
3. 递归链路通畅吗
   dig +trace example.com → 任何一段返回 SERVFAIL?
   
4. DNSSEC 链完整吗
   dig example.com DNSKEY +dnssec → AD=0?KSK/DS 不匹配
   
5. HTTPS 记录与 HTTP/3 正常吗
   dig example.com HTTPS → h3 / ECH 配置异常?

6.2 常见错误对照

现象可能原因排查方法
NXDOMAIN域名未注册 / 拼写错误 / 域名已删除whois 查注册状态
SERVFAILDNSSEC 配置错误 / 权威服务器宕机切换 DoH 服务商对比
REFUSED服务商策略限制 / 频率限制换服务商重试
部分用户访问旧 IPTTL 缓存未过期等待或主动清缓存
邮件被拒SPF / DKIM / DMARC 失败查 TXT 记录配置
证书签发失败CAA 记录未授权该 CA查 CAA 记录

6.3 DoH 跨服务商对比

不同 DoH 服务商的递归解析器缓存可能差异较大,对比查询结果是定位缓存问题的有效手段。本工具支持 3 个服务商一键切换,无需切换命令行工具。

6.4 dig 命令对照表

本工具的「dig 风格文本导出」与系统 dig 命令输出格式对齐,便于复制分享与对照:

本工具等价 dig 命令
查 A 记录dig cloudflare.com A
查 MX 记录dig cloudflare.com MX
指定 DoHdig @1.1.1.1 cloudflare.com
请求 DNSSEC 验证dig cloudflare.com +dnssec
关闭 DNSSEC 验证dig cloudflare.com +cd
反向解析dig -x 1.2.3.4

七、HTTPS 记录与 HTTP/3 升级

7.1 传统 HTTP/3 升级流程

1. 浏览器 TCP + TLS 连接到 443
2. 服务端响应 Alt-Svc: h3=":443"; ma=86400
3. 浏览器记录 Alt-Svc,下次连接尝试 QUIC
4. 浏览器 QUIC 连接到 443(与 TCP 端口相同)
5. QUIC 握手成功后切换协议

存在「首次访问仍走 TCP」的额外往返。

7.2 HTTPS 记录优化流程

1. 浏览器 DNS 查询 example.com HTTPS 记录
2. 拿到 alpn=h3, port=443, ipv4hint=...
3. 浏览器直接发起 QUIC 连接
4. QUIC 握手成功后开始传输

节省一次往返,首次访问即可走 HTTP/3。这是 Cloudflare、Google 等大型 CDN 已部署的优化。

7.3 ECH 与 SNI 加密

传统 TLS ClientHello 中的 SNI 字段明文,中间人可识别访问的域名(即使用户访问的网站由共享 IP 的 CDN 托管)。

ECH 通过:

  1. 客户端从 DNS HTTPS 记录获取 ECH 公钥
  2. 用 ECH 公钥加密真实 SNI 与 ClientHello 内层
  3. 外层 ClientHello 携带占位 SNI(如 cloudflare-ech.com
  4. 服务端用 ECH 私钥解密后获取真实 SNI

中间人只能看到占位 SNI,无法识别真实域名。这是 SNI 加密的现代方案,Cloudflare 与 Firefox / Chrome 已部署。

八、最佳实践与总结

8.1 DNS 配置最佳实践

  1. 根域不使用 CNAME:使用 ANAME / ALIAS 等伪记录,避免与其他记录冲突
  2. CDN 切换前降低 TTL:从 3600s 降为 60s,等旧 TTL 过期后切换 IP
  3. SPF 不要用 ~all:用 -all 严格模式,避免软失败被忽略
  4. DKIM 选择器定期轮换:避免长期使用同一密钥
  5. DMARC 从 p=none 开始:先观察汇总报告,确认无问题后升级为 p=quarantine 或 p=reject
  6. 部署 DNSSEC 时用 ECDSAP256SHA256:性能与安全兼顾
  7. 生产环境配置 CAA:仅授权实际使用的 CA,防证书误签
  8. HTTPS 记录开启 h3 + ECH:最大化性能与隐私

8.2 开发者日常 DNS 调试清单

  • 域名解析是否正常(A / AAAA)
  • 多 DoH 服务商结果是否一致(缓存差异)
  • DNSSEC 链是否完整(DNSKEY / DS / AD)
  • MX / SPF / DKIM / DMARC 是否齐全
  • CAA 是否限制了非预期 CA
  • HTTPS 记录是否开启 h3 / ECH
  • TTL 是否合理(变更前是否降低)
  • 反向解析 PTR 是否匹配正向(邮件场景)

8.3 与本站工具矩阵的协同

DNS 查询是网络诊断的起点,与之配套的工具矩阵:

8.4 总结

DNS 是互联网最底层的命名系统,理解 DNS 等于理解了互联网的「地址簿」:

  • 记录类型丰富:16 种主要记录覆盖网站、邮件、证书、服务发现等全场景
  • DoH 是现代 DNS 的标配:加密传输 + 防篡改 + 难审查
  • DNSSEC 是链路可信的基石:从根到权威的签名链确保数据未被篡改
  • TTL 与多级缓存是关键:理解缓存层级才能准确预估修改生效时间
  • HTTPS 记录开启 HTTP/3 + ECH:性能与隐私的双重提升

掌握这些核心概念,结合本站 DNS 查询工具 实操,你就能在日常开发中快速定位 DNS 相关问题,从域名到访问失败的排查思路清晰可见。