强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 04 章:区域文件与资源记录

本章概述

区域文件(Zone File)是 DNS 权威数据的载体,包含了一组资源记录(Resource Records, RR)。本章详细讲解区域文件的编写规范、SOA 记录的作用、各类常见记录类型的语法与使用场景。


4.1 区域文件基础

4.1.1 什么是区域文件

区域文件是纯文本文件,包含一组 DNS 资源记录,描述一个 DNS 区域(Zone)的完整数据。

# 区域文件存放位置
# Ubuntu/Debian: /var/cache/bind/ 或 /var/cache/bind/primary/
# RHEL/CentOS:   /var/named/ 或 /var/named/primary/

# 文件命名建议
example.com.zone
192.168.1.zone       # 反向区域

4.1.2 区域文件语法基础

; 这是注释(分号)
// 这也是注释
/* 这是多行注释 */

$TTL 3600            ; 默认 TTLTime To Live),单位秒
$ORIGIN example.com. ; 默认域名后缀

关键指令

指令说明
$TTL默认生存时间,记录缓存时长
$ORIGIN设置默认域名后缀
$INCLUDE引入其他文件
$GENERATE批量生成记录

4.1.3 记录格式

名称  TTL  类  类型  数据

示例:

; 完整格式
www.example.com.  3600  IN  A  93.184.216.34

; 使用 $ORIGIN 后可以简写(假设 $ORIGIN example.com.
www               3600  IN  A  93.184.216.34

; 使用 $TTL 后可以省略 TTL
www                     IN  A  93.184.216.34

; 使用 @ 表示区域根(即 example.com.
@                       IN  A  93.184.216.34

; 空格缩进表示继承上一条记录的名称
www                     IN  A  93.184.216.34
                        IN  AAAA  2606:2800:220:1:248:1893:25c8:1946

⚠️ 重要:域名末尾的 . 非常关键!example.com 会被补全为 example.com.example.com.,而 example.com. 才是绝对域名(FQDN)。


4.2 SOA 记录(Start of Authority)

SOA 记录是每个区域文件必须存在的第一条记录,定义了区域的管理信息。

4.2.1 SOA 记录格式

$ORIGIN example.com.
$TTL 3600

@   IN  SOA  ns1.example.com. admin.example.com. (
        2026051001  ; Serial(序列号)
        3600        ; Refresh(刷新间隔,秒)
        900         ; Retry(重试间隔,秒)
        1209600     ; Expire(过期时间,秒)
        86400       ; Minimum TTL / Negative Cache TTL(秒)
    )

4.2.2 SOA 各字段详解

字段含义推荐值说明
MNAME主名称服务器ns1.example.com.主(Primary)服务器的域名
RNAME管理员邮箱admin.example.com.. 代替 @,即 [email protected]
Serial序列号YYYYMMDDNN辅助服务器判断是否需要更新
Refresh刷新间隔3600(1小时)辅助服务器查询主服务器的间隔
Retry重试间隔900(15分钟)刷新失败后的重试间隔
Expire过期时间1209600(2周)辅助服务器数据过期后停止应答
Minimum否定缓存 TTL86400(1天)NXDOMAIN 响应的缓存时间

4.2.3 Serial 号管理最佳实践

# 推荐格式:YYYYMMDDNN(年月日+序号)
# 示例:2026051001 = 2026年5月10日第1次修改

# 修改记录后必须递增 serial,否则辅助服务器不会更新!
# 2026051001 → 2026051002 → 2026051003

# 如果意外减小 serial:
# 方法1:rndc freeze → 修改并增大 → rndc thaw
# 方法2:在辅助服务器上 rndc retransfer example.com

⚠️ Serial 号是 DNS 运维中最容易出错的地方:修改区域文件后忘记更新 serial,会导致辅助服务器数据不一致。


4.3 NS 记录(Name Server)

NS 记录指明该区域由哪些 DNS 服务器负责解析。

; 区域的权威名称服务器
@           IN  NS  ns1.example.com.
@           IN  NS  ns2.example.com.
@           IN  NS  ns3.example.com.

; 名称服务器的 A 记录(Glue Record
ns1         IN  A   192.168.1.10
ns2         IN  A   192.168.1.11
ns3         IN  A   203.0.113.5

NS 记录注意事项

规则说明
至少 2 个 NS提供冗余
NS 必须是 A/AAAA 记录不能指向 CNAME
Glue Record当 NS 在本区域内时,必须提供对应的 A/AAAA 记录
与注册商一致区域文件的 NS 应与域名注册商处设置的 NS 一致

4.4 A 与 AAAA 记录

4.4.1 A 记录(IPv4)

; 基本 A 记录
@           IN  A   93.184.216.34
www         IN  A   93.184.216.34
mail        IN  A   93.184.216.35
app         IN  A   192.168.1.100

; 多个 A 记录实现轮询负载均衡
web         IN  A   10.0.1.1
web         IN  A   10.0.1.2
web         IN  A   10.0.1.3

; 泛域名解析
*.example.com.  IN  A   93.184.216.34

4.4.2 AAAA 记录(IPv6)

; 基本 AAAA 记录
@           IN  AAAA  2606:2800:220:1:248:1893:25c8:1946
www         IN  AAAA  2606:2800:220:1:248:1893:25c8:1946
mail        IN  AAAA  2606:2800:220:1:248:1893:25c8:1947

4.4.3 同时配置 IPv4 和 IPv6

; 双栈配置(推荐)
@       IN  A       93.184.216.34
@       IN  AAAA    2606:2800:220:1:248:1893:25c8:1946
www     IN  A       93.184.216.34
www     IN  AAAA    2606:2800:220:1:248:1893:25c8:1946

4.5 CNAME 记录(Canonical Name)

CNAME 记录为域名创建别名,指向另一个域名。

; 基本别名
www         IN  CNAME   example.com.          ; www  主域名
ftp         IN  CNAME   example.com.          ; ftp  主域名
blog        IN  CNAME   myblog.github.io.     ; 指向外部服务

; CDN 场景
static      IN  CNAME   d1234.cloudfront.net. ; 静态资源  CDN
cdn         IN  CNAME   d5678.cloudfront.net.

CNAME 使用限制(重要!)

规则说明
CNAME 不能与其他记录共存同一名称不能同时有 CNAME 和 A/AAAA/MX 等
CNAME 不能出现在区域顶点@ IN CNAME ... 不合法
MX/NS 不能指向 CNAME邮件服务器和名称服务器不能是别名
CNAME 可以指向外部域名但会产生额外查询
CNAME 链不宜过长增加解析延迟

⚠️ 常见错误example.com. IN CNAME something. 是无效的。区域顶点(zone apex)必须使用 A/AAAA 记录。如果需要将根域名指向另一个域名,可以使用 ALIAS/ANAME(非标准)或简单的 A/AAAA 记录。


4.6 MX 记录(Mail Exchanger)

MX 记录指定处理该域名邮件的服务器。

; MX 记录(优先级越小越优先)
@           IN  MX  10  mail1.example.com.
@           IN  MX  20  mail2.example.com.
@           IN  MX  30  mail3-backup.example.com.

; MX 指向的服务器必须有 A 记录(不能是 CNAME
mail1       IN  A   93.184.216.35
mail2       IN  A   93.184.216.36
mail3-backup IN  A   203.0.113.10

; 子域名的 MX 记录
support     IN  MX  10  mail-support.example.com.

MX 优先级说明

优先级服务器作用
10mail1.example.com.主邮件服务器
20mail2.example.com.备份邮件服务器
30mail3-backup.example.com.第三备选
发件服务器尝试顺序:
1. 尝试连接 mail1(优先级 10)
2. 如果 mail1 不可用,连接 mail2(优先级 20)
3. 如果 mail2 不可用,连接 mail3(优先级 30)

4.7 TXT 记录(Text)

TXT 记录用于存储任意文本数据,广泛用于安全验证。

4.7.1 SPF(Sender Policy Framework)

; SPF 记录:指定允许发送邮件的服务器
@   IN  TXT  "v=spf1 mx ip4:93.184.216.35 include:_spf.google.com ~all"
SPF 机制说明
v=spf1SPF 版本
mxMX 记录中的服务器可以发邮件
ip4:指定 IPv4 地址/网段
ip6:指定 IPv6 地址/网段
include:包含其他域名的 SPF 记录
~all软拒绝(建议标记为垃圾邮件)
-all硬拒绝(直接拒绝)

4.7.2 DKIM(DomainKeys Identified Mail)

; DKIM 公钥记录
selector1._domainkey  IN  TXT  (
    "v=DKIM1; k=rsa; "
    "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
)

4.7.3 DMARC(Domain-based Message Authentication)

; DMARC 策略
_dmarc    IN  TXT  "v=DMARC1; p=reject; rua=mailto:[email protected]; pct=100"

4.7.4 域名验证

; Let's Encrypt DNS-01 验证
_acme-challenge   IN  TXT  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

; Google 域名验证
@                 IN  TXT  "google-site-verification=xxxxxxxxxxxxx"

; 各种 SaaS 服务验证
@                 IN  TXT  "facebook-domain-verification=xxxxxxxx"

4.7.5 CAA 记录(Certificate Authority Authorization)

; 限制哪些 CA 可以为该域名签发证书
@   IN  CAA  0 issue "letsencrypt.org"
@   IN  CAA  0 issue "digicert.com"
@   IN  CAA  0 iodef "mailto:[email protected]"

4.8 其他常见记录类型

4.8.1 SRV 记录(Service)

SRV 记录用于服务发现,格式为 _service._proto.domain

; SRV 格式:优先级 权重 端口 目标
_sip._tcp       IN  SRV  10 60 5060 sip1.example.com.
_sip._tcp       IN  SRV  20 40 5060 sip2.example.com.

; Kubernetes etcd 发现
_etcd-server._tcp  IN  SRV  0 0 2380 etcd1.example.com.

; XMPP 服务
_xmpp-client._tcp  IN  SRV  5 0 5222 xmpp.example.com.
字段说明
优先级数值越小越优先
权重相同优先级时按权重比例分配
端口服务端口
目标服务器域名

4.8.2 PTR 记录(Pointer)

PTR 记录用于反向 DNS 解析(IP → 域名)。

; 反向区域文件 /var/named/primary/192.168.1.rev
$TTL 3600
@   IN  SOA  ns1.example.com. admin.example.com. (
        2026051001  ; Serial
        3600        ; Refresh
        900         ; Retry
        1209600     ; Expire
        86400       ; Minimum
    )
    IN  NS  ns1.example.com.
    IN  NS  ns2.example.com.

; PTR 记录(注意:IP 地址是反序的)
10  IN  PTR  ns1.example.com.
11  IN  PTR  ns2.example.com.
100 IN  PTR  app.example.com.

对应的 named.conf 配置:

zone "1.168.192.in-addr.arpa" {
    type primary;
    file "primary/192.168.1.rev";
};

4.8.3 NAPTR 记录(Naming Authority Pointer)

; ENUM 电话号码映射
1.6.5.2.4.3.2.1.6.7.9.4.e164.arpa.  IN  NAPTR  100 10 "u" "E2U+sip" \
    "!^.*$!sip:[email protected]!" .

4.9 完整区域文件示例

4.9.1 正向区域文件

; /var/cache/bind/primary/example.com.zone
;
; example.com 正向区域文件
; 最后修改: 2026-05-10
; 管理员: admin@example.com
;

$TTL 3600
$ORIGIN example.com.

; SOA 记录
@   IN  SOA  ns1.example.com. admin.example.com. (
        2026051001  ; Serial
        3600        ; Refresh (1 hour)
        900         ; Retry   (15 min)
        1209600     ; Expire  (2 weeks)
        86400       ; Minimum (1 day)
    )

; 名称服务器
    IN  NS  ns1.example.com.
    IN  NS  ns2.example.com.
    IN  NS  ns3.example.com.

; NS 服务器的 Glue Record
ns1         IN  A   192.168.1.10
ns2         IN  A   192.168.1.11
ns3         IN  A   203.0.113.5

; 主机 A 记录
@           IN  A   93.184.216.34
www         IN  A   93.184.216.34
api         IN  A   93.184.216.35
app         IN  A   93.184.216.36
dev         IN  A   192.168.1.100
staging     IN  A   192.168.1.101

; IPv6 (AAAA) 记录
@           IN  AAAA  2606:2800:220:1:248:1893:25c8:1946
www         IN  AAAA  2606:2800:220:1:248:1893:25c8:1946

; MX 记录(邮件)
@           IN  MX  10  mail1.example.com.
@           IN  MX  20  mail2.example.com.
mail1       IN  A   93.184.216.37
mail2       IN  A   93.184.216.38

; CNAME 别名
ftp         IN  CNAME   www.example.com.
blog        IN  CNAME   myblog.github.io.
static      IN  CNAME   d1234.cloudfront.net.
cdn         IN  CNAME   d5678.cloudfront.net.

; TXT 记录
@           IN  TXT  "v=spf1 mx ip4:93.184.216.37 include:_spf.google.com ~all"
@           IN  TXT  "google-site-verification=abcdef123456"
_dmarc      IN  TXT  "v=DMARC1; p=reject; rua=mailto:[email protected]"

; SRV 记录
_sip._tcp   IN  SRV  10 60 5060 sip.example.com.
_xmpp._tcp  IN  SRV  5  0  5222 xmpp.example.com.

; CAA 记录
@           IN  CAA  0 issue "letsencrypt.org"
@           IN  CAA  0 iodef "mailto:[email protected]"

; 泛域名(可选)
*.dev       IN  A   192.168.1.100  ; 所有 dev 子域名指向开发服务器

4.9.2 反向区域文件

; /var/cache/bind/primary/192.168.1.rev
;
; 192.168.1.0/24 反向解析区域
;

$TTL 3600
@   IN  SOA  ns1.example.com. admin.example.com. (
        2026051001  ; Serial
        3600        ; Refresh
        900         ; Retry
        1209600     ; Expire
        86400       ; Minimum
    )

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

; PTR 记录
10  IN  PTR  ns1.example.com.
11  IN  PTR  ns2.example.com.
34  IN  PTR  www.example.com.
35  IN  PTR  api.example.com.
36  IN  PTR  app.example.com.
37  IN  PTR  mail1.example.com.
38  IN  PTR  mail2.example.com.
100 IN  PTR  dev.example.com.
101 IN  PTR  staging.example.com.

4.10 区域文件检查与验证

# 检查区域文件语法
sudo named-checkzone example.com /var/cache/bind/primary/example.com.zone

# 预期输出:
# zone example.com/IN: loaded serial 2026051001
# OK

# 检查反向区域
sudo named-checkzone 1.168.192.in-addr.arpa /var/cache/bind/primary/192.168.1.rev

# 在 named.conf 中添加区域后重载
sudo named-checkconf
sudo rndc reload example.com

# 验证解析
dig @127.0.0.1 example.com A +short
dig @127.0.0.1 example.com NS
dig @127.0.0.1 example.com MX
dig @127.0.0.1 example.com SOA
dig @127.0.0.1 -x 192.168.1.10    # 反向解析

4.11 常见错误排查

错误现象原因解决方法
missing ';'语句末尾缺少分号检查并添加分号
unknown RR type 'CNAME'CNAME 与其他记录冲突删除冲突记录
CNAME and other data同一名称有 CNAME 和其他记录改用 A 记录或使用不同名称
辅助服务器不更新Serial 未递增递增 Serial 号
反向解析不工作反向区域名写错确认格式为 1.168.192.in-addr.arpa
NXDOMAIN记录不存在检查 $ORIGIN 和完整域名
non-glue recordNS 记录缺少 Glue Record为 NS 添加 A/AAAA 记录

4.12 本章小结

记录类型用途关键注意事项
SOA区域管理信息Serial 必须递增,每个区域只能有一个
NS名称服务器至少 2 个,需 Glue Record
A/AAAAIP 地址映射A = IPv4,AAAA = IPv6
CNAME别名不能与同名其他记录共存,不能用于区域顶点
MX邮件服务器优先级越小越优先,不能指向 CNAME
TXT文本数据SPF/DKIM/DMARC/域名验证
SRV服务发现优先级 + 权重 + 端口 + 目标
PTR反向解析IP 反序书写

💡 小技巧

  1. 始终使用 FQDN:以 . 结尾,避免自动补全带来的错误。
  2. Serial 用 YYYYMMDDNN:便于追踪修改时间。
  3. 修改后双检查named-checkzone + rndc reload
  4. TXT 记录多行:BIND 支持括号内多行书写。
  5. 保留注释:区域文件的注释是重要的运维文档。

📖 扩展阅读