2. AXFR 消息 (AXFR Messages)
一个 AXFR session 由单个 TCP 连接组成, 并由一条 DNS query message 发起. 该 query message 决定要传输的区域以及会话的若干特征. 如果查询成功, 随后会传输区域内容, 最后终止连接.
本文档使用以下定义. "AXFR client" 是发起 TCP 连接并发送 DNS AXFR query 的主机. "AXFR server" 是接收 AXFR query 并发送 AXFR response(s) 的主机. "AXFR session" 由一个 AXFR query 以及对应该查询的一系列 AXFR responses 组成.
AXFR 是为 DNS 定义的若干查询类型 (QTYPE) 之一. 不过与大多数查询类型不同, AXFR 可能需要多条 DNS 消息才能完整响应一个查询. 初始查询和响应消息的格式都是标准 DNS 消息, 定义于 RFC 1035 及后续文档. 当查询类型为 AXFR 时, DNS 消息中的某些字段还会受到进一步限制.
在本文档中, AXFR 查询和响应将按照 DNS 消息结构划分为各个 section. 五个 section 分别是: (1) Header, (2) Question, (3) Answer, (4) Authority, 和 (5) Additional.
本节记录查询和响应消息, 包括对查询的限制以及对服务器的要求. 本节也说明 TCP 连接的使用.
2.1. AXFR 查询 (AXFR Query)
本小节描述发起 AXFR session 的 query message 的格式和语义. 术语 "normal DNS" 用于描述由标准 DNS 规范 (RFC 1034, RFC 1035 及其更新) 管辖的行为.
AXFR query 类似于 QTYPE 为 AXFR 的 normal DNS query message. 不过, "well-formed AXFR query" 还受到额外限制. 发送 AXFR query 的 AXFR client 应该遵循 well-formed query 的规则. 对于不符合这些规则的 AXFR query, AXFR server 必须以处理任何格式不正确查询时相同的方式响应. (这通常是 FORMERR 响应.)
well-formed AXFR query 具有以下特征:
-
DNS header 的 OPCODE 必须为零 (standard query).
-
DNS header 的 question section (QDCOUNT) 必须为 1.
-
DNS header 的 answer section count (ANCOUNT), authority section count (NSCOUNT), 和 additional section count (ARCOUNT) 必须全部为 0.
-
Question section 必须包含一个 question, 其具有:
- QTYPE 等于 AXFR [RFC5395] (十进制 252);
- QCLASS 等于区域 class 或 ANY;
- QNAME 等于要传输区域的名称.
-
AXFR responses 可以使用高于查询的 DNS 协议版本.
2.1.1. Header 值 (Header Values)
QR: 必须为 0 (Query)
OPCODE: 必须为 0 (Standard Query)
AA: 不检查 (与查询无关)
TC: 必须为 0 (Not Truncated) - TC 设置为 1 的 AXFR query 格式不正确.
RD: 可以为 0 或 1 - Recursion Desired bit 会被 AXFR server 忽略. 它既不影响 AXFR query 的行为, 也不在权威传输中发挥作用. AXFR query message 中 RD bit 的设置并不能可靠地表明该查询是递归查询.
RA: 不检查 (仅在响应中使用)
Z: 必须为 0 (reserved for future use) - 根据 DNS 规范要求, reserved bits 在查询中必须为零, 在响应中必须被忽略. 因此, AXFR client 必须将 Z bits 设置为零, AXFR server 必须忽略其值. 如果 AXFR query 中任何 reserved (Z) bits 被设置为非零值, 则该查询格式不正确.
AD: 必须为 0 - Authentic Data bit 仅为响应定义 [RFC4035].
CD: 可以为 0 或 1 - Checking Disabled bit 只与响应相关, 因此对区域传输查询没有定义的含义. AXFR client 可以设置此 bit; AXFR server 必须忽略其值.
RCODE: 必须为 0 (No Error) - response code 字段仅为响应定义.
QDCOUNT: 必须为 1
ANCOUNT: 必须为 0
NSCOUNT: 必须为 0
ARCOUNT: 必须为 0. 如果查询包含 EDNS(0) [RFC2671], TSIG [RFC2845], 或 SIG(0) [RFC2931] 选项, 则可以大于零.
关于 EDNS(0), TSIG, 和 SIG(0) 的考虑见第 2.2.5 节.
2.1.2. Question Section
Question section 必须符合 RFC 1035 中的规定, 并包含一个具有以下特征的 question:
QNAME: 要传输区域的名称, 该名称必须是有效的 DNS domain name.
QTYPE: 依据 [RFC5395], 其值为 252 (表示 AXFR).
QCLASS: 要传输区域的 class. 由于 AXFR query 可能构成重大安全风险, AXFR server 很可能通过某种策略 (通过 Access Control Lists, TSIG authentication 等) 限制区域传输访问, 且不应向任意查询方提供区域传输. 特殊 QCLASS 值 * (ANY, 十进制 255) 可以用于向后兼容. 当 QCLASS 为 ANY 时, AXFR server 不应返回所有可用数据 class 的区域数据, 而是可以选择一个 class 并传输该区域, 或拒绝该查询. (后者对 general-purpose DNS implementation 是推荐.) 编写严谨的 AXFR clients 会通过特定 class 请求区域传输.
2.1.3. Answer Section
AXFR query 中的 answer section 必须为空 (ANCOUNT 必须为 0).
2.1.4. Authority Section
AXFR query 中的 authority section 必须为空 (NSCOUNT 必须为 0).
2.1.5. Additional Section
AXFR query message 的 additional section 可以包含 EDNS(0) resource records (RRs) [RFC2671], 用于指示 EDNS 支持和参数. 它也可以包含 TSIG [RFC2845] 或 SIG(0) [RFC2931] RRs, 用于认证目的. TSIG 或 SIG(0) 选项的存在允许对 AXFR query 进行认证, 从而可能使 AXFR server 采用更宽松的授权策略.
使用 EDNS(0) 时, OPT pseudo-RR 放在 additional section 中, 并相应增加 ARCOUNT. EDNS(0) 公告的版本号表示愿意接受按该版本格式化的数据包. 不感知 EDNS 的 AXFR client 会将 ARCOUNT 设置为 0, 且不包含 OPT RR. 不感知 EDNS 的 AXFR server 会忽略 OPT RR, 并且如果 ARCOUNT 大于 0 且启用了附加处理 (检查这些 additional RRs), 它可以选择将查询视为 malformed.
带有 SIG(0) 的 AXFR query 的 ARCOUNT 将等于 1 加上 additional section 中 OPT RRs 的数量. TSIG RR 不计入 ARCOUNT, 因为 TSIG 是 DNS 中另一种消息认证技术. TSIG 相关考虑见 [RFC2845].
TSIG 和 EDNS(0) 可以同时使用.
2.2. AXFR 响应 (AXFR Response)
本小节描述对 AXFR queries 的响应的格式和语义. 响应在 TCP 连接建立且 AXFR query 被解析之后发送.
AXFR server 必须能处理带有意外, 未定义, 或不支持的 flags 或 attributes 的查询, 方式是返回标准 DNS error response. 导致各种错误的条件在以下小节中进一步说明.
AXFR server 对 AXFR query 的响应有四类:
-
Malformed response: 如果通过 TCP 收到的 AXFR query 不是合法 DNS query message, 或 DNS message 不符合第 2.1 节所规定的 well-formed AXFR query 要求, 则产生此类响应. 对 malformed query 的响应应该是一条 DNS response message, 并带有适当的 RCODE (FORMERR, NOTIMP, REFUSED 等).
-
Refused response: 如果收到的 DNS message 是合法 AXFR query, 但策略考虑表明该特定 AXFR client 不允许执行区域传输 (针对相关区域或一般情形), 则响应应该是一条带有 RCODE REFUSED 的 DNS response message.
-
Empty response: 如果要传输的区域为空 (区域顶点的所有权威数据均在区域之外), AXFR server 应该返回一条 response message, 其 answer section 中只有一个 SOA RR. 该 SOA RR 将是区域中唯一的 RR. 空区域的条件极不常见, 且通常是带外操作 (区域编辑, 动态更新, 或其他手段) 从区域中移除除强制 SOA 之外所有内容的结果.
-
Successful response: 假定不存在策略或格式问题, AXFR server 会用一条或多条 DNS response messages 响应, 这些消息合起来包含被传输区域的全部权威数据, 但受第 3 节描述的若干特定包含和排除规则约束.
前三类响应通过单条 DNS message 传送. 最后一类, 即 successful response, 可以由一条或多条 DNS response messages 组成, 并在 TCP 连接上顺序发送.
实现 EDNS(0), TSIG, 或 SIG(0) 的 AXFR server 必须准备好接收不包含相应选项的 AXFR query messages. 反过来, AXFR server 可以选择忽略 query message 中 EDNS(0), TSIG, 或 SIG(0) 选项的存在 (例如, 当它不支持或不要求这些选项时). 但是, 如果 AXFR server 实现 EDNS(0), TSIG, 或 SIG(0), 并选择使用请求中这些选项的信息, 它必须在其 AXFR response messages 中包含适当的选项信息.
AXFR client 必须准备好接收 TC (truncation) bit 未被使用或不具意义的 AXFR responses. 因为 AXFR 运行在 TCP 之上, 且允许在响应序列中使用多条 DNS messages, 所以不需要截断. (TC bit 的使用在第 2.2.1 节中明确说明.)
2.2.1. Header 值 (Header Values)
QR: 必须为 1 (Response)
OPCODE: 必须为 0 (Standard Query)
AA: AA (Authoritative Answer) bit 应该在所有 response messages 中设置为 1. 虽然 AXFR server 很可能对被传输区域具有权威性, 但并无严格要求必须如此.
TC: 必须为 0 (Not Truncated) - 因为 AXFR 运行在 TCP 之上并可使用多条 response messages, 所以无需设置 TC bit.
RD: 响应中的 RD bit 复制查询中的 RD bit (依据 DNS 规范). RD bit 对 AXFR 没有意义; 其值不影响 AXFR 行为.
RA: RA (Recursion Available) bit 可以根据 AXFR server 的一般策略在响应中设置或清除. 对区域传输而言, 递归不适用, 因此 RA 的值在此上下文中没有意义.
Z: 必须为 0 (Reserved) - AXFR server 必须将 reserved bits 设置为零, AXFR client 必须忽略这些 bits.
AD: 可以为 0 或 1 - 对于服务 DNSSEC-signed zones 且感知 DNSSEC 的 AXFR servers, AD (Authentic Data) bit 可以根据 DNSSEC 要求 [RFC4035] 在 AXFR responses 中设置. 对于未使用 DNSSEC 签名的区域, AD bit 应该为 0. 不感知 DNSSEC 的 AXFR client 会忽略 AD bit.
CD: 应该为 0 - CD (Checking Disabled) bit 只与 resolvers 相关, 与 authoritative servers 无关. 对于 AXFR responses, CD bit 应该为 0, 且没有定义的含义.
RCODE: response code 指示 AXFR query 的结果. 常见值包括:
- NOERROR (0): 传输成功 (successful AXFR response sequence 中所有 answer messages 的 RCODE 均设置为 NOERROR).
- FORMERR (1): 查询存在格式错误.
- SERVFAIL (2): 处理请求时服务器失败.
- NOTIMP (4): 查询类型未实现.
- REFUSED (5): 区域传输被策略拒绝.
- NOTAUTH (9): 服务器对所请求区域不具权威性 (定义于 [RFC2136]).
对于 successful AXFR response, AXFR session 中所有 DNS response messages 的 RCODE 必须设置为 NOERROR. 如果 AXFR session 中某条 DNS response message 的 RCODE 设置为 NOERROR 以外的任何值, AXFR client 必须认为区域传输已经失败.
QDCOUNT: 必须为 1 - question section 在每条 response message 中重复, 复制查询中的 question.
ANCOUNT: 指示 answer section 中 RR 的数量. 该值会随每条 response message 可容纳的 RR 数量而变化.
NSCOUNT: 必须为 0 - AXFR response messages 中不包含 authority section.
ARCOUNT: 必须为 0. 如果使用 EDNS(0), TSIG, 或 SIG(0), 则可以更大. 通常, AXFR responses 的 ARCOUNT 为 0.
2.2.2. Question Section
响应中的 question section 必须与对应 AXFR query 中的 question section 完全相同. 这意味着 QDCOUNT 必须为 1, 且单个 question 必须与查询中的 question 匹配.
2.2.3. Answer Section
Answer section 包含正在传输的区域数据. 对 answer section 内容的要求如下:
-
SOA RRs: AXFR response 的第一条 answer message 中第一个 RR 必须是该区域的 SOA RR. AXFR response 的最后一条 answer message 中最后一个 RR 也必须是该区域的 SOA RR (即同一个 SOA RR 出现在传输的开头和结尾).
-
Intermediate RRs: 在两个 SOA RRs (第一个和最后一个) 之间, response message(s) 的 answer section 包含该区域的所有其他权威 RRs (受第 3 节中的限制约束).
-
Order: answer section 中 RR 的顺序 (除第一个和最后一个 SOA RRs 外) 未定义. 但是, 为提高效率, 同一 RRset (相同 owner name, class, 和 type) 的所有 RRs 应该分组在一起.
-
Multiple messages: 如果区域数据无法放入单条 DNS response message, AXFR server 会发送多条 response messages. 第一条之后的每条 response message 继续承载后续区域数据, 最后一条 message 以尾随 SOA RR 结束.
2.2.4. Authority Section
AXFR response messages 中的 authority section 必须为空 (NSCOUNT = 0). 明确禁止在 AXFR response 的 authority section 中包含 NS records 或其他 authority data.
2.2.5. Additional Section
AXFR response messages 的 additional section 通常为空, 但如果协商了或正在使用 EDNS(0), TSIG, 或 SIG(0), 则可以包含这些 RRs.
EDNS(0): 如果 AXFR query 包含 EDNS(0) OPT RR, AXFR server 可以在其 response messages 的 additional sections 中包含 OPT RRs. AXFR responses 中的 EDNS(0) 主要用于发送扩展能力和缓冲区大小信号.
TSIG: 如果使用 TSIG 进行认证, TSIG RRs 会包含在 AXFR response messages 的 additional section 中. 在多消息 AXFR responses 中, TSIG 签名的应用方式不同:
- successful AXFR sequence 中第一条 response message 必须包含 TSIG RR.
- Intermediate messages 可以省略 TSIG RR (允许未签名的中间消息).
- 最后一条 response message 必须包含 TSIG RR.
详细 TSIG 考虑见 [RFC2845].
SIG(0): 如果使用 SIG(0), 每条包含 SIG(0) 的 response message 都会相应增加 ARCOUNT.
2.3. TCP 连接中止 (TCP Connection Aborts)
AXFR client 或 AXFR server 可以通过关闭 TCP 连接来中止正在进行的 AXFR session. 中止连接的原因包括:
- Malformed 或意外的 DNS messages.
- Timeouts (读超时或写超时).
- Authorization failures (例如 TSIG validation 失败).
- Internal server errors.
- Resource exhaustion.
被中止的连接必须由 AXFR client 解释为失败的区域传输. AXFR client 不应该提交连接关闭之前收到的任何部分区域数据.
AXFR server 可以使用 TCP connection closure 向 AXFR client 表明区域传输已经失败.