0%

DNS Zone文件

DNS Zone文件是定义DNS资源记录的区域。

一、DNS Zone区域域名

DNS Zone区域域名:Zone文件定义围绕该域名进行,比如example.com.(根DNS服务器的DNS Zone区域域名)
Zone文件物理名称与区域域名理论无关,但建议建立关联方便维护。

不同DNS服务器软件定义DNS Zone区域域名的语法不同。

1、BIND 9

1
2
3
4
zone "example.com" IN {
type master;
file "/var/named/example.com.zone";
};

DNS Zone区域域名:example.com
Zone文件路径和物理名称:/var/named/example.com.zone

2、CoreDNS

1
2
3
4
5
example.com:53 {
file /etc/coredns/example.com.zone
log
errors
}

DNS Zone区域域名:example.com
Zone文件路径和物理名称:/etc/coredns/example.com.zone

3、PowerDNS
有两种配置方案:

  1. 文件配置方案:语法跟BIND 9几乎一致
  2. 数据库配置方案:这里略

二、DNS Zone文件语法

DNS Zone文件语法主要包括“当前基准域名”语义和3类语句:

  1. 当前基准域名
  2. 注释
  3. 指令
  4. DNS资源记录定义

DNS Zone文件语法主要由RFC 1035和RFC 2308定义,也存在一些DNS服务器软件(BIND 9,PowerDNS,CoreDNS等)私自扩展的语法。

2.1、DNS Zone当前基准域名

DNS Zone当前基准域名:使用当前基准域名可简化Zone文件的配置(具体简化规则见下),其默认为DNS Zone区域域名,可通过$ORIGIN指令重设,重设的当前基准域名须为区域域名本身或其子域名,否则解析错误,支持通过多次$ORIGIN指令进行多次重设。

具体简化规则:

  1. 在Zone文件中,@会被解析成当前基准域名(相应的,普通语义的@须写成.避免非预期解析,比如“admin@example.com -> admin.example.com”)
  2. 在Zone文件中,域名A末尾不附加.表示相对域名,会被解析成A.当前基准域名;域名A末尾附加.表示绝对域名,会被解析成A本身。比如“假定当前基准域名为example.com,那么ns1.com会被解析成ns1.com.example.comns1.com.会被解析成ns1.com

2.2、注释

;开头,注释范围从;到该行末尾。

示例:

1
2
3
4
5
; 这是一条注释,用于说明下方是example.com的Zone文件配置

; 注释可以单独成行,也可以跟在配置后面(如下方)

$TTL 12h ; 定义默认生存时间,单位为小时

2.3. 指令

指令用于定义Zone文件的全局属性,控制DNS服务器对DNS资源记录的处理方式。
指令以$开头,指令名不区分大小写。

下面介绍常用的3个指令。

2.3.1、$TTL

$TTL:生存时间,出现0次或者1次。

定义该Zone文件中所有DNS资源记录的默认生存时间,其含义是:DNS客户端查询到相应DNS资源记录后,缓存多久才重新查询(在“递归DNS服务器和转发DNS服务器查询相应DNS资源记录”场景,其作为DNS客户端,缓存时间也为该值)。

值格式为数值 + 默认单位秒

示例:

1
$TTL 86400 ; 默认缓存86400秒,即1天

BIND等私自扩展的值格式为数值 + 单位缩写

示例:

1
$TTL 12h ; 默认缓存12小时

2.3.2、$ORIGIN

$ORIGIN:重设当前基准域名,重设的当前基准域名须为区域域名本身或其子域名,否则解析错误,出现0次或者N(N>=1)次。

示例:

1
$ORIGIN example.com.

2.3.3、$SERIAL

$SERIAL:序列号,出现0次或者1次。

用于标识Zone文件的版本号,当主DNS服务器的Zone文件更新后,序列号需递增(通常格式为YYYYMMDDXX),从DNS服务器会通过序列号判断是否需要同步更新DNS资源记录,这是主从DNS同步的核心依据。
跟SOA记录中的序列号字段作用一致。

示例:

1
$SERIAL 2026021201

$SERIAL指令是BIND等私自扩展指令。

2.4、DNS资源记录定义

DNS资源记录是Zone文件的核心,所有DNS资源记录都遵循统一的格式。

DNS资源记录格式:

1
名称(Name)  [TTL]  类别(Class)  类型(Type)  数据(Data)

详细说明:

  • 字段间以“空格”或者“制表符”分隔,不能用逗号、顿号等其他符号,否则无法解析
  • 名称(Name):需要解析的域名
  • [TTL]:可选,DNS资源记录的生存时间,其含义是:DNS客户端查询到相应DNS资源记录后,缓存多久才重新查询(在“递归DNS服务器和转发DNS服务器查询相应DNS资源记录”场景,其作为DNS客户端,缓存时间也为该值)。跟$TTL指令的关系是:两者含义相同,TTL字段优先级高于$TTL指令
  • 类别(Class):几乎所有场景都用IN(Internet,互联网类别),表示该DNS资源记录用于互联网解析,其他类别(如CH、HS)极少用到,可忽略
  • 类型(Type):DNS资源记录的类型,比如“NS”,“A”
  • 数据(Data):根据DNS资源记录类型不同,格式不同,一般为一行,支持跨多行(用括号包裹)

接下来介绍常用的8种DNS资源记录。

2.4.1、SOA记录

SOA记录用于描述区域的全局特性。Zone文件中必且唯一存在一条SOA记录,且作为第一条DNS资源记录。

SOA记录格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; 通常跨多行书写,用括号包裹

; 名称:必须为区域域名

; 主DNS服务器:从DNS服务器从主DNS服务器同步数据

名称 [TTL] IN SOA 主DNS服务器 管理员邮箱 (

序列号(SERIAL) ; 如2026021201,序列号须随文件更新递增,否则主从DNS无法同步

刷新时间(REFRESH) ; 从DNS多久查询一次主DNS更新,如1h(1小时)

重试时间(RETRY) ; 刷新失败后,多久重试一次,如15m(15分钟)

过期时间(EXPIRE) ; 多次重试失败后,从DNS放弃同步,如3w(3周)

不存在记录负生存时间(NXDOMAIN TTL) ; DNS客户端查询不到相应DNS资源记录后,间隔多久才重新查询(在“递归DNS服务器和转发DNS服务器查询不到相应DNS资源记录”场景,其作为DNS客户端,间隔时间也为该值)。注意与“$TTL指令”和“DNS资源记录中TTL字段”含义的区别

)

SOA记录示例如下:

1
2
3
4
5
6
7
8
9
; 管理员邮箱admin@example.com须写为admin.example.com

example.com. IN SOA ns1.example.com. admin.example.com. (
2026021201 ; 序列号 (SERIAL)
7200 ; 刷新时间 (REFRESH, 2小时)
3600 ; 重试时间 (RETRY, 1小时)
1209600 ; 过期时间 (EXPIRE, 14天)
3600 ; 不存在记录负生存时间 (NXDOMAIN TTL, 1小时)
)

2.4.2、NS记录

NS记录用于指定域名的权威DNS服务器,在配置时要么不配,如果配置一个域名一般至少需要2条NS记录,以实现负载均衡和高可用。

NS记录有两种:

  1. 父域委派NS记录:父权威DNS服务器DNS Zone中声明的子域NS记录,比如“在com域权威DNS服务器DNS Zone中的example.com. IN NS ns1.example.com.
  2. 权威自声明NS记录:本权威DNS服务器DNS Zone中声明的本域NS记录,比如“在example.com域权威DNS服务器DNS Zone中的example.com. IN NS ns1.example.com.

权威自声明NS记录:RFC规范要求必须有权威自声明NS记录,其用来对外宣告我就是被授权管理这个域的权威DNS服务器,从而建立一个完整的信任链,如果没有“权威自声明NS记录”可能导致解析故障。

根据以上可知,在DNS Zone文件中必有权威自声明NS记录,故Zone文件中NS记录数量必大于1。

NS记录格式如下:

1
名称  [TTL]  IN  NS  权威DNS服务器

NS记录示例如下:

1
2
@  IN  NS  ns1.example.com.  ; 主权威DNS服务器
@ IN NS ns2.example.net. ; 备权威DNS服务器

2.4.3、A记录

A记录用于将域名映射到IPv4地址,是关键DNS资源记录。Zone文件中可存在0-N(N>0)条A记录,在配置时一个域名可以对应多条A记录,以实现负载均衡和高可用。

A记录格式如下:

1
名称  [TTL]  IN  A  IPv4地址 

A记录示例如下(假定当前基准域名为example.com):

1
2
www  IN  A  192.168.1.100  ; www.example.com -> 192.168.1.100
blog IN A 192.168.1.101 ; blog.example.com -> 192.168.1.101

2.4.4、AAAA记录

AAAA记录用于将域名映射到IPv6地址,是关键DNS资源记录。Zone文件中可存在0-N(N>0)条AAAA记录,在配置时一个域名可以对应多条AAAA记录,以实现负载均衡和高可用。

AAAA记录格式如下:

1
名称  [TTL]  IN  AAAA  IPv6地址 

AAAA记录示例如下(假定当前基准域名为example.com):

1
www  IN  AAAA  2400:3200::1  ; www.example.com -> 2400:3200::1

2.4.5、MX记录

MX记录用于指定负责接收该域名邮件的邮件服务器。Zone文件中可存在0-N(N>0)条MX记录,在配置时一个域名可以对应多条MX记录,以实现负载均衡和高可用,多条时需通过优先级数值(0-65535)区分,优先级数值越小优先级越高。

MX记录格式如下:

1
名称  [TTL]  IN  MX  优先级数值  邮件服务器

MX记录示例如下:

1
2
@  IN  MX  10  mail.example.com.  ; 主邮件服务器(优先级数值10)
@ IN MX 20 mail2.example.com. ; 备邮件服务器(优先级数值20)

2.4.6、CNAME记录

CNAME记录用于为一个域名设置别名,比如将blog.example.com设置为www.example.com的别名,访问blog.example.com时,会自动跳转解析到www.example.com对应的IP地址,常用于简化配置和灵活切换解析目标。Zone文件中可存在0-N(N>0)条CNAME记录,在配置时一个域名可以对应多条CNAME记录。

CNAME记录格式如下:

1
别名  [TTL]  IN  CNAME  原域名

CNAME记录示例如下(假定当前基准域名为example.com):

1
2
blog  IN  CNAME  www.example.com.  ; blog.example.com是www.example.com的别名
ftp IN CNAME ftp.example.net. ; ftp.example.com是ftp.example.net的别名

2.4.7、TXT记录

TXT记录用于存储任意文本信息,最初用于域名注释,现在核心用于域名所有权验证、邮件安全(SPF/DKIM/DMARC)、服务配置等机器可读场景。Zone文件中可存在0-N(N>0)条TXT记录,在配置时一个域名可以对应多条TXT记录。

TXT记录格式如下:

1
名称  [TTL]  IN  TXT  TXT内容 

TXT记录示例如下(假定当前基准域名为example.com):

1
2
3
4
5
@  IN  TXT  "google-site-verification=abc123xyz789"`  ; 通过TXT记录存储Google验证字符串,用于证明域名归属

@ 86400 IN TXT "v=spf1 ip4:203.0.113.10 include:mail.example.com ~all" ; 域名`example.com`的SPF规则指定允许发送来自`example.com`域名邮件的服务器IP为`203.0.113.10`和`mail.example.com域名SPF规则中的服务器IP`,`~all`表示从非允许的服务器发送的`example.com`邮件应标记为软失败

dkim._domainkey 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ..." ; 子域名dkim._domainkey.example.com存储DKIM公钥,用于接收方验证邮件是否被篡改,v=DKIM1表示DKIM版本

2.4.8、PTR记录

PTR记录用于将IP地址映射到域名。Zone文件中可存在0-N(N>0)条PTR记录,在配置时一个IP可以对应多条PTR记录。

PTR记录格式如下:

1
名称  [TTL]  IN  PTR  域名 

名称为适配分层结构的“反转IP+后缀”,详见《DNS资源记录》

PTR记录示例如下:

1
2
3
10.1.168.192.in-addr.arpa.  3600  IN  PTR  mail.example.com.   ; IPv4地址`192.168.1.10`反向解析到域名`mail.example.com`,TTL为1小时。当查询该IP的反向记录时,会返回对应的域名

1.0.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. 86400 IN PTR server.example.com. ; IPv6地址`2001:db8::1`反向解析到域名`server.example.com`,TTL为24小时。当查询该IP的反向记录时,会返回对应的域名

三、Zone文件示例

实验环境叙述如下:

  • 实验DNS服务器
    • IP地址:192.168.31.181
    • DNS服务器实现软件:选用BIND 9
  • 实验DNS客户端
    • IP地址:192.168.31.143
    • DNS客户端实现软件:选用Linux dig命令

3.1、包含PTR记录的Zone文件

1、实验DNS服务器
配置文件“/etc/bind/named.conf.options”中增加以下配置,关闭递归功能,确保作为纯粹的权威DNS服务器:

1
recursion no;

配置文件“/etc/bind/named.conf.local”中增加以下配置,加载Zone文件:

1
2
3
4
zone "10.168.192.in-addr.arpa" {
type master; // 这是主DNS服务器
file "/etc/bind/zones/10.168.192.in-addr.arpa.zone"; // Zone文件路径和物理名称
};

“/etc/bind/zones/10.168.192.in-addr.arpa.zone”Zone文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$TTL 86400

; SOA记录
@ IN SOA ns1.example.com. admin.example.com. (
2025092501 ; 序列号
3600 ; 刷新时间
900 ; 重试时间
604800 ; 过期时间
86400 ; 不存在记录负生存时间
)

; NS记录
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.

; PTR记录:IP最后一段 IN PTR 域名.
10 IN PTR mail.example.com.
20 IN PTR web.example.com.
30 IN PTR dns.example.com.

2、客户端

执行命令 结果
dig -x 192.168.10.10 @192.168.31.181 +short mail.example.com.
dig -x 192.168.10.20 @192.168.31.181 +short web.example.com.
dig -x 192.168.10.30 @192.168.31.181 +short dns.example.com.

3.2、包含A、AAAA、TXT、MX、CNAME等记录的Zone文件

1、实验DNS服务器
配置文件“/etc/bind/named.conf.options”中增加以下配置,关闭递归功能,确保作为纯粹的权威DNS服务器:

1
recursion no;

配置文件“/etc/bind/named.conf.local”中增加以下配置,加载Zone文件:

1
2
3
4
zone "example.com" {
type master; // 这是主DNS服务器
file "/etc/bind/zones/example.com.zone"; // Zone文件路径和物理名称
};

“/etc/bind/zones/example.com.zone”Zone文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$TTL    86400
$ORIGIN example.com.

; SOA记录
@ IN SOA ns1.example.com. admin.example.com. (
2026022201 ; 序列号
3600 ; 刷新时间 (1小时)
1800 ; 重试时间 (30分钟)
604800 ; 过期时间 (7天)
86400 ; 不存在记录负生存时间 (24小时)
)

; NS记录
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.

; A记录
@ IN A 192.168.1.100 ; 主域名 example.com 指向的IPv4
ns1 IN A 192.168.1.101 ; 域名服务器 ns1.example.com 的IPv4
ns2 IN A 192.168.1.102 ; 域名服务器 ns2.example.com 的IPv4
www IN A 192.168.1.100 ; www.example.com 指向的IPv4
mail IN A 192.168.1.103 ; mail.example.com 指向的IPv4

; AAAA记录
@ IN AAAA 2001:db8::100 ; 主域名 example.com 的IPv6
www IN AAAA 2001:db8::100 ; www.example.com 的IPv6
mail IN AAAA 2001:db8::103 ; mail.example.com 的IPv6

; MX记录
@ IN MX 10 mail.example.com. ; 主邮件服务器,优先级10
@ IN MX 20 backup.mail.example.com. ; 备用邮件服务器,优先级20

; CNAME记录
ftp IN CNAME www.example.com. ; ftp.example.com 是 www.example.com 的别名
blog IN CNAME www.example.com. ; blog.example.com 是 www.example.com 的别名
imap IN CNAME mail.example.com. ; imap.example.com 是 mail.example.com 的别名
smtp IN CNAME mail.example.com. ; smtp.example.com 是 mail.example.com 的别名

; TXT记录
@ IN TXT "v=spf1 mx a ~all" ; SPF记录,允许本域名的MX和A记录发送邮件

2、客户端

执行命令 结果
dig A ns1.example.com @192.168.31.181 +short 192.168.1.101
dig AAAA www.example.com @192.168.31.181 +short 2001:db8::100
dig mx example.com @192.168.31.181 +short 10 mail.example.com.
20 backup.mail.example.com.
dig cname ftp.example.com @192.168.31.181 +short www.example.com.
dig txt example.com @192.168.31.181 +short “v=spf1 mx a ~all”

参考文献

[1]https://www.ietf.org/rfc/rfc1035.txt
[2]https://www.ietf.org/rfc/rfc2308.txt

您的支持将鼓励我继续分享!