BIND DNS 服务器搭建完全教程 / 第 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 ; 默认 TTL(Time 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 | 否定缓存 TTL | 86400(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 优先级说明:
| 优先级 | 服务器 | 作用 |
|---|---|---|
| 10 | mail1.example.com. | 主邮件服务器 |
| 20 | mail2.example.com. | 备份邮件服务器 |
| 30 | mail3-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=spf1 | SPF 版本 |
mx | MX 记录中的服务器可以发邮件 |
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 record | NS 记录缺少 Glue Record | 为 NS 添加 A/AAAA 记录 |
4.12 本章小结
| 记录类型 | 用途 | 关键注意事项 |
|---|---|---|
| SOA | 区域管理信息 | Serial 必须递增,每个区域只能有一个 |
| NS | 名称服务器 | 至少 2 个,需 Glue Record |
| A/AAAA | IP 地址映射 | A = IPv4,AAAA = IPv6 |
| CNAME | 别名 | 不能与同名其他记录共存,不能用于区域顶点 |
| MX | 邮件服务器 | 优先级越小越优先,不能指向 CNAME |
| TXT | 文本数据 | SPF/DKIM/DMARC/域名验证 |
| SRV | 服务发现 | 优先级 + 权重 + 端口 + 目标 |
| PTR | 反向解析 | IP 反序书写 |
💡 小技巧
- 始终使用 FQDN:以
.结尾,避免自动补全带来的错误。 - Serial 用 YYYYMMDDNN:便于追踪修改时间。
- 修改后双检查:
named-checkzone+rndc reload。 - TXT 记录多行:BIND 支持括号内多行书写。
- 保留注释:区域文件的注释是重要的运维文档。