资源记录类型
一条资源记录由名字、类型、类别、TTL 和数据组成。类型决定数据怎样解释。下面先给出可筛选的总表,再挑日常最容易写错的几种逐一说明。
类型总表#
| 类型 | 代码 | 用途 | 定义 |
|---|---|---|---|
A | 1 | IPv4 地址 | RFC 1035 |
NS | 2 | 区的权威服务器;在父区里用于委派 | RFC 1035 |
CNAME | 5 | 别名,指向规范名字 | RFC 1035 |
SOA | 6 | 区的起始授权:主服务器、联系人、序列号与计时参数 | RFC 1035 |
PTR | 12 | 指针,主要用于反向解析 | RFC 1035 |
HINFO | 13 | 主机信息;今天主要出现在对 ANY 查询的精简应答里 | RFC 1035,RFC 8482 |
MX | 15 | 邮件交换器与优先级 | RFC 1035,RFC 7505(空 MX) |
TXT | 16 | 任意文本;SPF、DKIM、DMARC、域名验证都用它 | RFC 1035 |
AAAA | 28 | IPv6 地址 | RFC 3596 |
SRV | 33 | 服务位置:优先级、权重、端口、目标主机 | RFC 2782 |
NAPTR | 35 | 基于正则的名字改写,常见于电话号码映射 | RFC 3403 |
DNAME | 39 | 整棵子树的重定向 | RFC 6672 |
OPT | 41 | EDNS(0) 伪记录,只在报文里出现,不进区文件 | RFC 6891 |
DS | 43 | 委派签名者:父区中子区密钥的摘要 | RFC 4034 |
SSHFP | 44 | SSH 主机密钥指纹 | RFC 4255 |
RRSIG | 46 | 对一个 RRset 的签名 | RFC 4034 |
NSEC | 47 | 证明不存在:列出下一个名字与本名字已有的类型 | RFC 4034 |
DNSKEY | 48 | 区的公钥 | RFC 4034 |
NSEC3 | 50 | 用散列后的名字证明不存在 | RFC 5155 |
NSEC3PARAM | 51 | NSEC3 的散列参数 | RFC 5155 |
TLSA | 52 | DANE:把 TLS 证书或公钥绑定到名字 | RFC 6698 |
CDS | 59 | 子区希望父区发布的 DS | RFC 7344 |
CDNSKEY | 60 | 子区希望父区据以生成 DS 的公钥 | RFC 7344 |
OPENPGPKEY | 61 | OpenPGP 公钥 | RFC 7929 |
CSYNC | 62 | 请求父区同步 NS 与胶水 | RFC 7477 |
ZONEMD | 63 | 整个区文件的摘要,用于校验完整性 | RFC 8976 |
SVCB | 64 | 通用服务绑定:别名、端点与连接参数 | RFC 9460 |
HTTPS | 65 | 面向 HTTPS 的 SVCB:ALPN、端口、地址提示、ECH 配置 | RFC 9460 |
TSIG | 250 | 事务签名,只在报文里出现 | RFC 8945 |
IXFR | 251 | 增量区传送(查询类型) | RFC 1995 |
AXFR | 252 | 完整区传送(查询类型) | RFC 5936 |
ANY | 255 | 请求“所有类型”;很多服务器只给精简应答 | RFC 1035,RFC 8482 |
CAA | 257 | 允许哪些证书机构为本域签发证书 | RFC 8659 |
完整的分配表在 IANA 的 “Domain Name System (DNS) Parameters” 注册表里。遇到不认识的类型,RFC 3597 规定可以写成 TYPE65534,数据写成 \# 长度 十六进制,任何实现都应能原样传递。
SOA:区的起点#
example.com. 3600 IN SOA ns1.example.com. hostmaster.example.com. (
2026091801 ; SERIAL 序列号
7200 ; REFRESH 辅服务器多久检查一次
3600 ; RETRY 检查失败后多久重试
1209600 ; EXPIRE 多久联系不上主服务器就停止应答
3600 ) ; MINIMUM 否定应答的缓存上限- MNAME(
ns1.example.com.):主服务器的名字。动态更新(RFC 2136)会把请求发到这里。 - RNAME(
hostmaster.example.com.):负责人的邮箱,第一个点代替@。邮箱用户名里本身有点时要写成\.。 - SERIAL:辅服务器靠它判断有没有新版本,每次修改必须增大,按 RFC 1982 的序列号算术比较。常见约定是
YYYYMMDDnn。 - MINIMUM:最初的含义是区内记录的默认 TTL,RFC 2308 把它改成了否定缓存时间。区内默认 TTL 现在用
$TTL指令设置。
A 与 AAAA#
同一个名字可以有多条 A 或 AAAA 记录,解析器全部返回,顺序可能被打乱。客户端怎样在多个地址之间选择不归 DNS 管:现代客户端大多按 Happy Eyeballs(RFC 8305)同时尝试 IPv6 与 IPv4,哪个先通用哪个。
www 300 IN A 192.0.2.10
www 300 IN A 192.0.2.11
www 300 IN AAAA 2001:db8::10只发布 AAAA 而 IPv6 实际不通,是“网站在某些网络打不开”的一个常见原因:客户端先尝试 IPv6,等超时后才回落。
MX:邮件往哪里送#
example.com. 3600 IN MX 10 mx1.example.com.
example.com. 3600 IN MX 20 mx2.example.com.数字是优先级,越小越优先,相同优先级之间随机分担。MX 的目标必须是有 A/AAAA 的主机名,不能是 CNAME,也不能直接写 IP 地址。不收邮件的域可以发布“空 MX”:example.com. MX 0 .(RFC 7505),发件方据此立即退信,而不是退回去尝试 A 记录。
TXT:什么都往里装#
一条 TXT 记录由一个或多个字符串组成,每个字符串最长 255 字节,更长的内容要拆成多段,读取方会把它们直接拼接。几种常见用途:
example.com. TXT "v=spf1 mx include:_spf.example.net -all"
sel1._domainkey.example.com. TXT ( "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A"
"MIIBCgKCAQEAx..." )
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"- SPF(RFC 7208):一个名字上只能有一条
v=spf1记录,多条会被判为永久错误;include等需要额外 DNS 查询的机制总共不能超过 10 次。 - DKIM(RFC 6376):公钥放在
选择器._domainkey.域名,选择器由发件方决定。 - DMARC(RFC 7489):策略放在
_dmarc.域名。 - 各类服务的“域名所有权验证”通常也是让你在某个名字上放一条 TXT。验证完通常可以删掉,长期堆积会让顶点上的应答越来越大。
SRV:服务在哪个端口#
名字格式是 _服务._协议.域名,数据依次是优先级、权重、端口、目标主机:
_sip._udp.example.com. 3600 IN SRV 10 60 5060 sip1.example.com.
_sip._udp.example.com. 3600 IN SRV 10 40 5060 sip2.example.com.
_xmpp-server._tcp.example.com. IN SRV 5 0 5269 xmpp.example.com.优先级相同的记录之间按权重比例分配,权重 0 表示“没有偏好”。目标为 . 表示服务在这个域上明确不提供。浏览器打开网页不使用 SRV,这是 HTTPS 记录出现的原因之一。
CAA:限制谁能签证书#
example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issuewild ";"
example.com. IN CAA 0 iodef "mailto:security@example.com"证书机构在签发前必须查 CAA(RFC 8659,CA/B 论坛的基线要求也这样规定)。查找从证书里的名字开始,逐级向父域上溯,用找到的第一组 CAA。issuewild ";" 表示不允许任何机构签通配符证书。CAA 只约束守规矩的证书机构,并不能阻止攻击者用别的办法拿到证书。
SVCB 与 HTTPS 记录#
HTTPS 记录让客户端在连接前就知道:这个站点支持哪些协议(ALPN)、用哪个端口、有哪些地址,以及加密 ClientHello(ECH)的公钥配置。它有两种形态:
; 别名模式(优先级 0):可以放在区顶点,效果类似 CNAME
example.com. 3600 IN HTTPS 0 cdn.example.net.
; 服务模式(优先级 ≥ 1):给出连接参数
www.example.com. 3600 IN HTTPS 1 . alpn="h3,h2" ipv4hint=192.0.2.10 ipv6hint=2001:db8::10- 目标写
.表示“就是这个名字本身”。 alpn列出支持的应用层协议。列出h3的站点,浏览器可以第一次就直接用 HTTP/3,而不必先等Alt-Svc头。ipv4hint、ipv6hint只是提示,客户端仍会查 A/AAAA,两者不一致时以 A/AAAA 为准。ech携带 ECHConfigList(base64),供 TLS Encrypted Client Hello(RFC 9849)使用。没有 DNSSEC 或加密 DNS 保护时,这个参数可能在途中被删掉,客户端就退回不加密 SNI 的握手,所以 ECH 的隐私效果依赖 DNS 本身的安全。
SVCB 是通用形式,HTTPS 是专门给 https 方案用的 SVCB。DNS 服务器自己也可以用 SVCB 公布 DoT、DoH、DoQ 端点,见解析器发现。
PTR 与反向解析#
反向解析把地址倒过来写成名字:IPv4 以字节为单位,IPv6 以半字节(十六进制位)为单位。
10.2.0.192.in-addr.arpa. IN PTR www.example.com.
0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR www.example.com.反向区由地址的持有者管理(通常是运营商或云服务商),而不是域名的持有者。邮件服务器常会检查发件 IP 的 PTR 与正向解析是否对得上(俗称 FCrDNS),这是自建邮件服务时最容易漏掉的一步。
DNSSEC 相关记录#
DNSKEY、RRSIG、DS、NSEC、NSEC3、CDS、CDNSKEY 这一组记录各自的字段和它们怎样串成信任链,放在 DNSSEC 一页集中说明。这里只提醒一点:这些记录由签名工具生成和维护,不应手工编辑;手动改过的区文件需要重新签名,否则验证会失败。