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.
- 实际域名是相对部分与 origin 的拼接, origin 可由
字符串
<character-string> 可通过一种或两种方式表示:
- 未加引号: 不含内部空格的连续字符集合
- 加引号: 以
"开始并以"结束的字符串- 在
"分隔的字符串内部, 除"本身外可出现任意字符 "必须使用\(反斜杠) 转义
- 在
5.3. 特殊编码
由于主文件是文本文件, 因此需要若干特殊编码以允许加载任意数据.
特殊字符和序列
. (点):
- 独立的
.表示根 - 示例: 在
example.com.中, 尾随的.表示根
@ (at 符号):
- 独立的
@用于表示当前 origin - 示例:
@ IN SOA ...指区域 origin
\X (反斜杠转义):
- 其中 X 是除数字 (0-9) 以外的任意字符
- 用于引用该字符, 使其特殊含义不生效
- 示例:
\.可用于在标签中放入点字符\;可用于在字符串中包含分号 (而不是作为注释)\\表示反斜杠字符
\DDD (十进制转义):
- 其中每个 D 都是数字
- 表示由 DDD 所描述的十进制数对应的八位组
- 生成的八位组被假定为文本, 不再检查其特殊含义
- 示例:
\065表示字符A(ASCII 65)
( ) (括号):
- 括号用于将跨越行边界的数据分组
- 实际上, 括号内不识别行终止
- 适用于 SOA 记录和其他多行条目
; (分号):
- 分号用于开始注释
- 该行剩余内容会被忽略
5.4. 使用主文件定义区域
当主文件用于加载区域时, 如果主文件中遇到任何错误, 应抑制该操作.
理由
这样做的理由是, 单个错误可能造成广泛后果. 例如:
- 假设定义委派的 RR 存在语法错误
- 则服务器会对该子区域中的所有名称返回权威名称错误
- (除非该子区域也存在于该服务器上)
有效性检查
除确保文件语法正确外, 还应执行若干有效性检查:
-
Class 一致性: 文件中的所有 RR 应具有相同 class
-
SOA 要求: 区域顶部应恰好存在一个 SOA RR
-
Glue 信息: 如果存在委派且需要 glue 信息, 则该信息应存在
-
权威数据: 区域内权威节点之外出现的信息应为 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记录定义单个 mailboxMG记录定义 mail groupSTOOGESmail 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. 最佳实践
-
外部引用始终使用绝对名称: 区域外名称应以点结尾
-
谨慎使用 $ORIGIN: 在开头设置它, 并避免不必要地更改
-
包含序列号: 每次变更时始终递增序列号
-
使用注释: 用注释记录区域文件
-
部署前测试: 使用
named-checkzone等工具验证语法 -
保持一致性: 保持格式一致以提高可读性
-
备份: 修改前始终保留可工作区域文件的备份
下一节: 6. 名称服务器实现