BIND(Berkeley Internet Name Domain)是目前互联网上使用最广泛的DNS服务器软件,BIND9是其现代版本,支持DNSSEC、IPv6、动态更新等特性。要把BIND9正确部署起来,核心在于理解主配置文件named.conf与区域数据文件的分工:named.conf负责全局参数、日志、访问控制以及声明哪些区域由本服务器负责;区域文件则保存具体的资源记录。本文以Ubuntu 22.04和CentOS 7/8为例,介绍从安装到验证的完整过程,并重点指出容易出错的地方。

安装BIND9与准备环境
在Debian/Ubuntu系统上,执行sudo apt update和sudo apt install bind9 bind9utils bind9-doc即可完成安装。CentOS/RHEL系则使用sudo yum install bind bind-utils或sudo dnf install bind bind-utils。安装完成后,服务名通常是named或bind9,Ubuntu下为bind9,CentOS下为named。建议先确认服务状态:systemctl status named(或bind9)。如果之前系统自带了解析服务(如systemd-resolved),需要停用或调整端口,因为BIND默认监听53端口。
生产环境建议规划好目录结构。主配置文件通常位于/etc/bind/named.conf(Ubuntu)或/etc/named.conf(CentOS),区域文件默认放在/var/named/或/etc/bind/zones/。为了管理方便,可以统一创建/etc/bind/zones/目录存放自定义区域文件,并通过include指令引入。同时注意文件权限:BIND服务通常以bind或named用户运行,区域文件必须对该用户可读,否则启动会报权限错误。
主配置文件named.conf关键参数解析
先看一个最简权威服务器配置示例。打开named.conf,全局options块中设置监听地址、工作目录、转发器以及安全选项。以下代码展示了一个只允许本机和内网查询、关闭递归的配置片段:
options {
directory "/var/cache/bind";
listen-on port 53 { 127.0.0.1; 192.168.1.10; };
allow-query { localhost; 192.168.1.0/24; };
recursion no;
dnssec-validation auto;
forwarders { 223.5.5.5; 8.8.8.8; };
};其中directory指定区域文件的相对路径基准目录;listen-on限定BIND监听的IP地址,若不写则监听所有接口;allow-query控制哪些客户端能向本服务器发起查询,没有列出的网段会收到REFUSED响应;recursion no关闭递归,如果这台服务器只提供权威解析(比如公司内网的域名服务器),必须关闭递归,否则可能被利用进行DNS放大攻击。若需要同时为内网客户端提供递归查询,可以将recursion设为yes,并用allow-recursion限制来源。
之后声明区域。正向区域示例:
zone "ipipp.com" IN {
type master;
file "/etc/bind/zones/db.ipipp.com";
allow-update { none; };
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "/etc/bind/zones/db.192.168.1";
};第一段声明负责ipipp.com域名的权威解析,区域文件路径为/etc/bind/zones/db.ipipp.com;第二段是反向解析区域,用于将IP地址映射回主机名。注意反向区域名的写法:网段192.168.1.0/24对应的区域名是1.168.192.in-addr.arpa,IP地址段倒序书写。如果使用IPv6,则用ip6.arpa后缀。写完区域声明后保存文件。
编写正向与反向区域文件
正向区域文件由SOA记录、NS记录、A记录、CNAME记录等组成。SOA记录是每个区域的起始记录,包含主DNS服务器名称、管理员邮箱(将@替换为点)、序列号、刷新时间等参数。以下是一个完整示例:
$TTL 3600
@ IN SOA ns1.ipipp.com. admin.ipipp.com. (
2025031501 ; 序列号,格式YYYYMMDDNN
7200 ; 刷新时间
3600 ; 重试时间
1209600 ; 过期时间
3600 ) ; 否定缓存TTL
IN NS ns1.ipipp.com.
IN NS ns2.ipipp.com.
ns1 IN A 192.168.1.10
ns2 IN A 192.168.1.11
www IN A 192.168.1.20
mail IN A 192.168.1.30
@ IN MX 10 mail.ipipp.com.
ftp IN CNAME www.ipipp.com.注意几点:域名结尾的点表示绝对域名,如果不写点则会被自动补全为当前区域名;SOA记录中的@代表区域名本身;管理员邮箱admin.ipipp.com.实际对应admin@ipipp.com;序列号每次修改区域文件后必须递增,否则从服务器不会同步更新。NS记录指明该区域的权威名称服务器,A记录将主机名映射到IPv4地址,MX记录指定邮件服务器及优先级,CNAME用于别名。
反向区域文件则主要包含PTR记录。示例:
$TTL 3600
@ IN SOA ns1.ipipp.com. admin.ipipp.com. (
2025031501
7200
3600
1209600
3600 )
IN NS ns1.ipipp.com.
10 IN PTR ns1.ipipp.com.
11 IN PTR ns2.ipipp.com.
20 IN PTR www.ipipp.com.
30 IN PTR mail.ipipp.com.在反向区域中,记录名只写IP地址的主机部分,例如10对应192.168.1.10。PTR记录的值必须是完整域名且以点结尾。正向和反向区域可以同时存在,便于通过IP反查域名。建议在修改完区域文件后,使用named-checkzone ipipp.com /etc/bind/zones/db.ipipp.com检查语法,该命令会解析文件并报告错误位置。
启动服务与验证解析
配置完成后,先运行named-checkconf检查主配置文件语法,再运行named-checkzone检查每个区域文件。如果没有任何输出,说明语法正确;有错误会显示具体行号。然后重启服务:systemctl restart bind9(或systemctl restart named)。查看日志journalctl -u bind9 -f可实时观察启动过程。常见的启动失败原因包括:区域文件路径不存在、文件权限不足、SOA记录中缺少点、序列号格式错误等。
验证解析使用dig命令。在本机执行dig @127.0.0.1 www.ipipp.com A,如果返回状态为NOERROR且answer section中有A记录,说明正向解析正常。测试反向解析:dig @127.0.0.1 -x 192.168.1.20。如果配置了递归查询,还可以测试dig @127.0.0.1 www.baidu.com看是否能转发到上游。注意测试时指定的服务器地址必须与listen-on和allow-query匹配,否则会得到connection refused或REFUSED。
另外,使用rndc status可以查看BIND运行状态。rndc是BIND的管理工具,需要先配置rndc.key或使用rndc-confgen生成密钥。如果没有配置rndc,启动时可能报错,但不影响DNS查询功能。对于生产环境,建议开启日志记录:在named.conf中添加logging { channel query_log { file "/var/log/named/query.log"; severity info; }; category queries { query_log; }; };,方便排查客户端请求。