bigywater.tech
网络协议 · 69

A、AAAA、CNAME、MX、TXT、NS、SRV:记录类型实测

一个域名下可以挂很多种记录:地址、别名、邮件、委派、文本、服务发现、证书授权……它们在线上各是什么样?这篇对每种常见类型取回原始 RDATA 字节,一字节一字节地对着解读,还看了 ANY 为什么不再可用。每个回答都同时问了 8.8.8.8 来交叉核对。

4 / 16 字节
A 与 AAAA 记录的 RDATA 长度
c0 10
www.github.com 的 CNAME 记录的 RDATA:只有 2 字节的压缩指针
NOTIMP
1.1.1.1 对 ANY 查询的 RCODE(4),响应只有 29 字节

地址与别名

实测 · 本机执行输出
  A —— 问 example.com 的 A(类型号 1):RCODE 0,回答 2 条,报文 61 字节
    example.com  A  TTL 293  RDLENGTH 4  RDATA 字节:ac 42 93 f3
      解读:IPv4 172.66.147.243
    example.com  A  TTL 293  RDLENGTH 4  RDATA 字节:68 14 17 9a
      解读:IPv4 104.20.23.154
    与 8.8.8.8 比较:回答完全一致
  AAAA —— 问 example.com 的 AAAA(类型号 28):RCODE 0,回答 2 条,报文 85 字节
    example.com  AAAA  TTL 239  RDLENGTH 16  RDATA 字节:26 06 47 00 00 10 00 00 00 00 00 00 68 14 17 9a
      解读:IPv6 2606:4700:10::6814:179a
    example.com  AAAA  TTL 239  RDLENGTH 16  RDATA 字节:26 06 47 00 00 10 00 00 00 00 00 00 ac 42 93 f3
      解读:IPv6 2606:4700:10::ac42:93f3
    与 8.8.8.8 比较:回答完全一致
  CNAME —— 问 www.github.com 的 CNAME(类型号 5):RCODE 0,回答 1 条,报文 46 字节
    www.github.com  CNAME  TTL 3600  RDLENGTH 2  RDATA 字节:c0 10
      解读:名字 github.com
    与 8.8.8.8 比较:回答完全一致

A 是 4 字节,AAAA 是 16 字节,CNAME 是一个域名(可被压缩指针代替)。

邮件与委派

实测 · 本机执行输出
  MX —— 问 gmail.com 的 MX(类型号 15):RCODE 0,回答 5 条,报文 150 字节
    gmail.com  MX  TTL 461  RDLENGTH 27  RDATA 字节:00 05 0d 67 6d 61 69 6c 2d 73 6d 74 70 2d 69 6e 01 6c 06 67 6f 6f 67 6c 65 c0 12
      解读:优先级 5,邮件服务器 gmail-smtp-in.l.google.com
    gmail.com  MX  TTL 461  RDLENGTH 9  RDATA 字节:00 14 04 61 6c 74 32 c0 29
      解读:优先级 20,邮件服务器 alt2.gmail-smtp-in.l.google.com
    gmail.com  MX  TTL 461  RDLENGTH 9  RDATA 字节:00 28 04 61 6c 74 34 c0 29
      解读:优先级 40,邮件服务器 alt4.gmail-smtp-in.l.google.com
    gmail.com  MX  TTL 461  RDLENGTH 9  RDATA 字节:00 1e 04 61 6c 74 33 c0 29
      解读:优先级 30,邮件服务器 alt3.gmail-smtp-in.l.google.com
    …共 5 条,只显示前 4 条
    与 8.8.8.8 比较:回答不完全一致(条数 5 对 5;不同解析器的负载均衡 / 缓存可能给出不同子集)
  NS —— 问 example.com 的 NS(类型号 2):RCODE 0,回答 2 条,报文 84 字节
    example.com  NS  TTL 82536  RDLENGTH 21  RDATA 字节:04 68 65 72 61 02 6e 73 0a 63 6c 6f 75 64 66 6c 61 72 65 c0 14
      解读:名字 hera.ns.cloudflare.com
    example.com  NS  TTL 82536  RDLENGTH 10  RDATA 字节:07 65 6c 6c 69 6f 74 74 c0 2e
      解读:名字 elliott.ns.cloudflare.com
    与 8.8.8.8 比较:回答完全一致
  SOA —— 问 example.com 的 SOA(类型号 6):RCODE 0,回答 1 条,报文 91 字节
    example.com  SOA  TTL 1029  RDLENGTH 50  RDATA 字节:07 65 6c 6c 69 6f 74 74 02 6e 73 0a 63 6c 6f 75 64 66 6c 61 72 65 c0 14 03 64 6e 73 c0 34 90 06 f3 98 00 00 27 10 00 00 …
      解读:主名字服务器 elliott.ns.cloudflare.com,管理员邮箱 dns.cloudflare.com(第一个点代表 @),序列号 2416374680,刷新 10000,重试 2400,过期 604800,最小 TTL 1800
    与 8.8.8.8 比较:回答完全一致

MX = 优先级 + 名字;NS = 名字;SOA 含主服务器、管理员邮箱、序列号和一组计时字段,最后一个字段是负缓存时间。

文本与服务

实测 · 本机执行输出
  TXT —— 问 gmail.com 的 TXT(类型号 16):RCODE 0,回答 4 条,报文 308 字节
    gmail.com  TXT  TTL 156  RDLENGTH 65  RDATA 字节:40 67 6c 6f 62 61 6c 73 69 67 6e 2d 73 6d 69 6d 65 2d 64 76 3d 43 44 59 58 2b 58 46 48 55 77 32 77 6d 6c 36 2f 47 62 38 …
      解读:1 个字符串(各 ≤255 字节,前缀 1 字节长度):globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8=
    gmail.com  TXT  TTL 156  RDLENGTH 68  RDATA 字节:43 79 61 68 6f 6f 2d 76 65 72 69 66 69 63 61 74 69 6f 6e 2d 6b 65 79 3d 2b 65 5a 77 49 50 53 67 52 78 6b 41 55 7a 44 74 …
      解读:1 个字符串(各 ≤255 字节,前缀 1 字节长度):yahoo-verification-key=+eZwIPSgRxkAUzDtqT8Qhk+j4A1JF6V/wtGoyGTkELY=
    gmail.com  TXT  TTL 156  RDLENGTH 32  RDATA 字节:1f 76 3d 73 70 66 31 20 72 65 64 69 72 65 63 74 3d 5f 73 70 66 2e 67 6f 6f 67 6c 65 2e 63 6f 6d
      解读:1 个字符串(各 ≤255 字节,前缀 1 字节长度):v=spf1 redirect=_spf.google.com
    …共 4 条,只显示前 3 条
    与 8.8.8.8 比较:回答完全一致
  SRV —— 问 _imaps._tcp.gmail.com 的 SRV(类型号 33):RCODE 0,回答 1 条,报文 73 字节
    _imaps._tcp.gmail.com  SRV  TTL 86400  RDLENGTH 22  RDATA 字节:00 05 00 00 03 e1 04 69 6d 61 70 05 67 6d 61 69 6c 03 63 6f 6d 00
      解读:优先级 5,权重 0,端口 993,目标 imap.gmail.com
    与 8.8.8.8 比较:回答完全一致
  CAA —— 问 google.com 的 CAA(类型号 257):RCODE 0,回答 1 条,报文 55 字节
    google.com  CAA  TTL 86400  RDLENGTH 15  RDATA 字节:00 05 69 73 73 75 65 70 6b 69 2e 67 6f 6f 67
      解读:flags 0,tag "issue",value "pki.goog"
    与 8.8.8.8 比较:回答完全一致

TXT 是带长度前缀的字符串(SPF 就是一条 TXT);SRV 给出优先级、权重、端口和目标;CAA 限定哪些 CA 可以签发证书。

反向与新类型

实测 · 本机执行输出
  反向名字的构造:IPv4 地址 1.1.1.1 的四段倒过来,加后缀 .in-addr.arpa → 1.1.1.1.in-addr.arpa;一个任意地址 a.b.c.d 就是 d.c.b.a.in-addr.arpa;IPv6 要把 32 个十六进制位逐位倒过来加 .ip6.arpa
  PTR —— 问 1.1.1.1.in-addr.arpa 的 PTR(类型号 12):RCODE 0,回答 1 条,报文 67 字节
    1.1.1.1.in-addr.arpa  PTR  TTL 32  RDLENGTH 17  RDATA 字节:03 6f 6e 65 03 6f 6e 65 03 6f 6e 65 03 6f 6e 65 00
      解读:名字 one.one.one.one
    与 8.8.8.8 比较:回答完全一致
  HTTPS —— 问 cloudflare.com 的 HTTPS(类型号 65):RCODE 0,回答 1 条,报文 105 字节
    cloudflare.com  HTTPS  TTL 213  RDLENGTH 61  RDATA 字节:00 01 00 00 01 00 06 02 68 33 02 68 32 00 04 00 08 68 10 84 e5 68 10 85 e5 00 06 00 20 26 06 47 00 00 00 00 00 00 00 00 …
      解读:SvcPriority 1,TargetName .,SvcParams 58 字节
    与 8.8.8.8 比较:回答完全一致

PTR 用倒过来的地址加 in-addr.arpa;HTTPS(SVCB)在连接前就给出 alpn 和地址提示。

ANY

实测 · 本机执行输出
  问 example.com 的 ANY:RCODE 4,回答 0 条:[];报文 29 字节
  问 cloudflare.com 的 ANY:RCODE 4,回答 0 条:[];报文 32 字节
  类型号表(本篇用到的):A=1,NS=2,CNAME=5,SOA=6,PTR=12,MX=15,TXT=16,AAAA=28,SRV=33,HTTPS=65,CAA=257

被拿来做放大攻击,现在 1.1.1.1 直接回 NOTIMP。

分步演示

记录类型
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64(Apple 芯片)/ Python 3.14.8 / tcpdump(libpcap)/ scapy 2.8 / dpkt / dnspython / h2 / aioquic / OpenSSL / curl 8.7.1;抓包在 lo0(环回)上做,少数实验用真实网卡 en0(这台机器上 en0 是 Wi-Fi,tcpdump 看到的是系统转成以太网格式的帧,所以文中的“以太网头”都指这个 14 字节的头)或访问公网(会在文章里注明);需要丢包 / 延迟 / 限速时,用一个只作用于 lo0 端口 9400-9499 的 dummynet 辅助脚本(netlab);所有服务端都是本机自己起的进程;时间戳取自 tcpdump 的 -tt,数字每次运行会有小幅抖动。向 1.1.1.1 取记录、向 8.8.8.8 交叉核对;RDATA 解读是我按各类型的格式手写的解析器;TXT 里的第三方验证串不在文章里展示;TTL 每次运行不同
    • 没有验证:gmail.com 的 MX 在两个解析器之间“不完全一致”的原因(没有逐条比较);DNSSEC 相关记录(DNSKEY、RRSIG、DS,下一篇有 DNSSEC 专题);DNAME、NAPTR、TLSA、SSHFP 等较少见的类型;SVCB / HTTPS 的 SvcParams 逐个字段的解析(只看到了前几个字节);权威服务器上直接取记录(这里都是经过递归解析器的)
    京ICP备2026067502号-1京公网安备11010502063487号