DNS 手册域名系统参考

资源记录类型

一条资源记录由名字、类型、类别、TTL 和数据组成。类型决定数据怎样解释。下面先给出可筛选的总表,再挑日常最容易写错的几种逐一说明。

最后修订 · 约 10 分钟读完

类型总表#

类型代码用途定义
A1IPv4 地址RFC 1035
NS2区的权威服务器;在父区里用于委派RFC 1035
CNAME5别名,指向规范名字RFC 1035
SOA6区的起始授权:主服务器、联系人、序列号与计时参数RFC 1035
PTR12指针,主要用于反向解析RFC 1035
HINFO13主机信息;今天主要出现在对 ANY 查询的精简应答里RFC 1035,RFC 8482
MX15邮件交换器与优先级RFC 1035,RFC 7505(空 MX)
TXT16任意文本;SPF、DKIM、DMARC、域名验证都用它RFC 1035
AAAA28IPv6 地址RFC 3596
SRV33服务位置:优先级、权重、端口、目标主机RFC 2782
NAPTR35基于正则的名字改写,常见于电话号码映射RFC 3403
DNAME39整棵子树的重定向RFC 6672
OPT41EDNS(0) 伪记录,只在报文里出现,不进区文件RFC 6891
DS43委派签名者:父区中子区密钥的摘要RFC 4034
SSHFP44SSH 主机密钥指纹RFC 4255
RRSIG46对一个 RRset 的签名RFC 4034
NSEC47证明不存在:列出下一个名字与本名字已有的类型RFC 4034
DNSKEY48区的公钥RFC 4034
NSEC350用散列后的名字证明不存在RFC 5155
NSEC3PARAM51NSEC3 的散列参数RFC 5155
TLSA52DANE:把 TLS 证书或公钥绑定到名字RFC 6698
CDS59子区希望父区发布的 DSRFC 7344
CDNSKEY60子区希望父区据以生成 DS 的公钥RFC 7344
OPENPGPKEY61OpenPGP 公钥RFC 7929
CSYNC62请求父区同步 NS 与胶水RFC 7477
ZONEMD63整个区文件的摘要,用于校验完整性RFC 8976
SVCB64通用服务绑定:别名、端点与连接参数RFC 9460
HTTPS65面向 HTTPS 的 SVCB:ALPN、端口、地址提示、ECH 配置RFC 9460
TSIG250事务签名,只在报文里出现RFC 8945
IXFR251增量区传送(查询类型)RFC 1995
AXFR252完整区传送(查询类型)RFC 5936
ANY255请求“所有类型”;很多服务器只给精简应答RFC 1035,RFC 8482
CAA257允许哪些证书机构为本域签发证书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 一页集中说明。这里只提醒一点:这些记录由签名工具生成和维护,不应手工编辑;手动改过的区文件需要重新签名,否则验证会失败。

DNS 手册 · 内容依据 IETF RFC 与各运营方公开资料整理,出现分歧时以原文为准。回到顶部