跳到主要内容

5. 主文件

Master file (主文件) 是以文本形式包含 RR 的文本文件. 由于一个 zone (区域) 的内容可以表示为 RR 列表, 主文件最常用于定义区域, 但也可用于列出缓存内容.

本节首先讨论主文件中 RR 的格式, 然后讨论在某个名称服务器中用主文件创建区域时的特殊注意事项.


5.1. 格式

主文件格式是一系列条目.

一般规则

面向行的格式:

  • 条目主要是面向行的
  • 可以使用括号将一组条目跨行延续
  • 文本文字量中可以包含 CRLF

分隔符:

  • 制表符和空格的任意组合都可作为独立项目之间的分隔符

注释:

  • 任意行末都可以带注释
  • 注释以 ; (分号) 开始
  • ; 之后该行的其余内容会被忽略

空行:

  • 带注释或不带注释的空行可以出现在文件任意位置

条目类型

定义如下条目:

<blank>[<comment>]

$ORIGIN <domain-name> [<comment>]

$INCLUDE <file-name> [<domain-name>] [<comment>]

<domain-name><rr> [<comment>]

<blank><rr> [<comment>]

控制条目

定义了两个控制条目: $ORIGIN$INCLUDE.

$ORIGIN:

  • 后跟一个域名
  • 将相对域名的当前 origin 重置为所给名称
  • 示例: $ORIGIN example.com.

$INCLUDE:

  • 将指定文件插入当前文件
  • 可以选择指定一个域名, 为被包含文件设置相对域名 origin
  • 也可以带注释
  • 注意: 无论被包含文件内部如何改变相对 origin, $INCLUDE 条目都不会改变父文件的相对 origin
  • 示例: $INCLUDE /var/named/example.com.hosts

资源记录条目

最后两种条目形式表示 RR:

Owner Name 规则:

  • 如果 RR 条目以空白开头, 则假定该 RR 由上一个声明的 owner 拥有
  • 如果 RR 条目以 <domain-name> 开头, 则重置 owner name

RR 格式:

<rr> 内容采用下列形式之一:

[<TTL>] [<class>] <type> <RDATA>

[<class>] [<TTL>] <type> <RDATA>

字段说明:

  • TTL: 可选, 十进制整数, 表示生存时间, 单位为秒
  • Class: 可选, 标准助记符 (例如 IN)
  • Type: 必需, 标准助记符 (例如 A、NS、MX)
  • RDATA: 必需, 适合该 type 和 class 的数据

默认值:

  • 省略的 class 和 TTL 值默认为最近一次显式声明的值
  • 由于 type 和 class 助记符互不重叠, 解析是唯一的

注意: 此顺序不同于示例中使用的顺序, 也不同于实际 RR 中使用的顺序; 给定顺序便于解析和默认值处理.


5.2. 主文件中的域名

<domain-name> 构成主文件中很大一部分数据.

标签表示

基本格式:

  • 域名中的标签表示为字符串, 并以点分隔
  • 引号约定允许在域名中存储任意字符

绝对名称与相对名称:

  • 绝对名称: 以点结尾的域名称为绝对名称, 并被视为完整名称

    • 示例: www.example.com.
  • 相对名称: 不以点结尾的域名称为相对名称

    • 实际域名是相对部分与 origin 的拼接, origin 可由 $ORIGIN$INCLUDE 或主文件加载例程的参数指定
    • 当没有可用 origin 时, 相对名称是错误
    • 示例: origin 为 example.com. 时, www 变为 www.example.com.

字符串

<character-string> 可通过一种或两种方式表示:

  1. 未加引号: 不含内部空格的连续字符集合
  2. 加引号: 以 " 开始并以 " 结束的字符串
    • " 分隔的字符串内部, 除 " 本身外可出现任意字符
    • " 必须使用 \ (反斜杠) 转义

5.3. 特殊编码

由于主文件是文本文件, 因此需要若干特殊编码以允许加载任意数据.

特殊字符和序列

. (点):

  • 独立的 . 表示根
  • 示例: 在 example.com. 中, 尾随的 . 表示根

@ (at 符号):

  • 独立的 @ 用于表示当前 origin
  • 示例: @ IN SOA ... 指区域 origin

\X (反斜杠转义):

  • 其中 X 是除数字 (0-9) 以外的任意字符
  • 用于引用该字符, 使其特殊含义不生效
  • 示例:
    • \. 可用于在标签中放入点字符
    • \; 可用于在字符串中包含分号 (而不是作为注释)
    • \\ 表示反斜杠字符

\DDD (十进制转义):

  • 其中每个 D 都是数字
  • 表示由 DDD 所描述的十进制数对应的八位组
  • 生成的八位组被假定为文本, 不再检查其特殊含义
  • 示例: \065 表示字符 A (ASCII 65)

( ) (括号):

  • 括号用于将跨越行边界的数据分组
  • 实际上, 括号内不识别行终止
  • 适用于 SOA 记录和其他多行条目

; (分号):

  • 分号用于开始注释
  • 该行剩余内容会被忽略

5.4. 使用主文件定义区域

当主文件用于加载区域时, 如果主文件中遇到任何错误, 应抑制该操作.

理由

这样做的理由是, 单个错误可能造成广泛后果. 例如:

  • 假设定义委派的 RR 存在语法错误
  • 则服务器会对该子区域中的所有名称返回权威名称错误
  • (除非该子区域也存在于该服务器上)

有效性检查

除确保文件语法正确外, 还应执行若干有效性检查:

  1. Class 一致性: 文件中的所有 RR 应具有相同 class

  2. SOA 要求: 区域顶部应恰好存在一个 SOA RR

  3. Glue 信息: 如果存在委派且需要 glue 信息, 则该信息应存在

  4. 权威数据: 区域内权威节点之外出现的信息应为 glue 信息, 而不应是 origin 或类似错误的结果


5.5. 主文件示例

以下是一个可用于定义 ISI.EDU 区域的示例文件, 以 ISI.EDU 为 origin 加载:

@   IN  SOA     VENERA      Action\.domains (
20 ; SERIAL
7200 ; REFRESH
600 ; RETRY
3600000; EXPIRE
60) ; MINIMUM

NS A.ISI.EDU.
NS VENERA
NS VAXA
MX 10 VENERA
MX 20 VAXA

A A 26.3.0.103

VENERA A 10.1.0.52
A 128.9.0.32

VAXA A 10.2.0.27
A 128.9.0.33


$INCLUDE <SUBSYS>ISI-MAILBOXES.TXT

示例分析

SOA 记录:

  • @ 表示区域 origin (ISI.EDU.)
  • VENERA 是主名称服务器 (相对名称, 变为 VENERA.ISI.EDU.)
  • Action\.domains 是负责人的邮箱 ([email protected])
    • 注意使用 \ 转义电子邮件地址中的点
  • 序列号: 20
  • Refresh: 7200 秒 (2 小时)
  • Retry: 600 秒 (10 分钟)
  • Expire: 3600000 秒 (约 41.67 天)
  • Minimum: 60 秒

NS 记录:

  • 三个名称服务器: A.ISI.EDU. (绝对), VENERA (相对), VAXA (相对)

MX 记录:

  • 主邮件交换器: VENERA, preference 为 10
  • 辅助邮件交换器: VAXA, preference 为 20

A 记录:

  • A.ISI.EDU. 有一个 IPv4 地址
  • VENERA.ISI.EDU. 有两个 IPv4 地址 (多宿主)
  • VAXA.ISI.EDU. 有两个 IPv4 地址 (多宿主)

$INCLUDE 指令:

  • 包含一个含有 mailbox 记录的外部文件

被包含文件示例

文件 <SUBSYS>ISI-MAILBOXES.TXT 包含:

    MOE     MB      A.ISI.EDU.
LARRY MB A.ISI.EDU.
CURLEY MB A.ISI.EDU.
STOOGES MG MOE
MG LARRY
MG CURLEY

说明:

  • MB 记录定义单个 mailbox
  • MG 记录定义 mail group
  • STOOGES mail group 包含三个成员
  • 空白行表示继续使用前一个 owner name

5.6. 常见主文件模式

模式 1: 简单区域文件

$ORIGIN example.com.
$TTL 86400

@ IN SOA ns1.example.com. admin.example.com. (
2024010101 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum

IN NS ns1.example.com.
IN NS ns2.example.com.

ns1 IN A 192.0.2.1
ns2 IN A 192.0.2.2
www IN A 192.0.2.10

模式 2: 委派子域

; Delegation to subdomain
subdomain IN NS ns1.subdomain.example.com.
IN NS ns2.subdomain.example.com.

; Glue records (required if name servers are in subdomain)
ns1.subdomain IN A 192.0.2.20
ns2.subdomain IN A 192.0.2.21

模式 3: 多个 A 记录 (负载均衡)

; Round-robin DNS for load balancing
www IN A 192.0.2.10
IN A 192.0.2.11
IN A 192.0.2.12

5.7. 最佳实践

  1. 外部引用始终使用绝对名称: 区域外名称应以点结尾

  2. 谨慎使用 $ORIGIN: 在开头设置它, 并避免不必要地更改

  3. 包含序列号: 每次变更时始终递增序列号

  4. 使用注释: 用注释记录区域文件

  5. 部署前测试: 使用 named-checkzone 等工具验证语法

  6. 保持一致性: 保持格式一致以提高可读性

  7. 备份: 修改前始终保留可工作区域文件的备份


下一节: 6. 名称服务器实现