DNS Zone文件是定义DNS资源记录的区域。
一、DNS Zone区域域名
DNS Zone区域域名:Zone文件定义围绕该域名进行,比如example.com,.(根DNS服务器的DNS Zone区域域名)。
Zone文件物理名称与区域域名理论无关,但建议建立关联方便维护。
不同DNS服务器软件定义DNS Zone区域域名的语法不同。
1、BIND 9
1 | zone "example.com" IN { |
DNS Zone区域域名:example.com。
Zone文件路径和物理名称:/var/named/example.com.zone。
2、CoreDNS
1 | example.com:53 { |
DNS Zone区域域名:example.com。
Zone文件路径和物理名称:/etc/coredns/example.com.zone。
3、PowerDNS
有两种配置方案:
- 文件配置方案:语法跟BIND 9几乎一致
- 数据库配置方案:这里略
二、DNS Zone文件语法
DNS Zone文件语法主要包括“当前基准域名”语义和3类语句:
- 当前基准域名
- 注释
- 指令
- DNS资源记录定义
DNS Zone文件语法主要由RFC 1035和RFC 2308定义,也存在一些DNS服务器软件(BIND 9,PowerDNS,CoreDNS等)私自扩展的语法。
2.1、DNS Zone当前基准域名
DNS Zone当前基准域名:使用当前基准域名可简化Zone文件的配置(具体简化规则见下),其默认为DNS Zone区域域名,可通过$ORIGIN指令重设,重设的当前基准域名须为区域域名本身或其子域名,否则解析错误,支持通过多次$ORIGIN指令进行多次重设。
具体简化规则:
- 在Zone文件中,
@会被解析成当前基准域名(相应的,普通语义的@须写成.避免非预期解析,比如“admin@example.com -> admin.example.com”) - 在Zone文件中,域名A末尾不附加
.表示相对域名,会被解析成A.当前基准域名;域名A末尾附加.表示绝对域名,会被解析成A本身。比如“假定当前基准域名为example.com,那么ns1.com会被解析成ns1.com.example.com,ns1.com.会被解析成ns1.com”
2.2、注释
以;开头,注释范围从;到该行末尾。
示例:
1 | ; 这是一条注释,用于说明下方是example.com的Zone文件配置 |
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 | ; 通常跨多行书写,用括号包裹 |
SOA记录示例如下:
1 | ; 管理员邮箱admin@example.com须写为admin.example.com |
2.4.2、NS记录
NS记录用于指定域名的权威DNS服务器,在配置时要么不配,如果配置一个域名一般至少需要2条NS记录,以实现负载均衡和高可用。
NS记录有两种:
- 父域委派NS记录:父权威DNS服务器DNS Zone中声明的子域NS记录,比如“在
com域权威DNS服务器DNS Zone中的example.com. IN NS ns1.example.com.” - 权威自声明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 | @ IN NS ns1.example.com. ; 主权威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 | www IN A 192.168.1.100 ; www.example.com -> 192.168.1.100 |
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 | @ IN MX 10 mail.example.com. ; 主邮件服务器(优先级数值10) |
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 | blog IN CNAME www.example.com. ; blog.example.com是www.example.com的别名 |
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 | @ IN TXT "google-site-verification=abc123xyz789"` ; 通过TXT记录存储Google验证字符串,用于证明域名归属 |
2.4.8、PTR记录
PTR记录用于将IP地址映射到域名。Zone文件中可存在0-N(N>0)条PTR记录,在配置时一个IP可以对应多条PTR记录。
PTR记录格式如下:
1 | 名称 [TTL] IN PTR 域名 |
名称为适配分层结构的“反转IP+后缀”,详见《DNS资源记录》。
PTR记录示例如下:
1 | 10.1.168.192.in-addr.arpa. 3600 IN PTR mail.example.com. ; IPv4地址`192.168.1.10`反向解析到域名`mail.example.com`,TTL为1小时。当查询该IP的反向记录时,会返回对应的域名 |
三、Zone文件示例
实验环境叙述如下:
- 实验DNS服务器
- IP地址:
192.168.31.181 - DNS服务器实现软件:选用
BIND 9
- IP地址:
- 实验DNS客户端
- IP地址:
192.168.31.143 - DNS客户端实现软件:选用
Linux dig命令
- IP地址:
3.1、包含PTR记录的Zone文件
1、实验DNS服务器
配置文件“/etc/bind/named.conf.options”中增加以下配置,关闭递归功能,确保作为纯粹的权威DNS服务器:
1 | recursion no; |
配置文件“/etc/bind/named.conf.local”中增加以下配置,加载Zone文件:
1 | zone "10.168.192.in-addr.arpa" { |
“/etc/bind/zones/10.168.192.in-addr.arpa.zone”Zone文件内容如下:
1 | $TTL 86400 |
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 | zone "example.com" { |
“/etc/bind/zones/example.com.zone”Zone文件内容如下:
1 | $TTL 86400 |
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