bind9配置的核心在于/etc/named.conf和zone文件,把这个文件结构和语法规则琢磨透了,绝大多数配置问题都能自己定位解决。 配置bind9很像搭积木,主配置文件管“规则”,zone文件管“数据”,两者配合才能跑起一台完整的DNS服务器,这篇bind9配置教程不会绕弯子,直接带你从目录结构走到主从同步。
bind9安装后的目录结构与核心文件
装好bind9之后,你会看到一堆文件,但真正需要关心的只有两类:主配置和zone数据文件,以CentOS和Ubuntu两个主流发行版为例,文件位置略有差异,逻辑完全一样。
| 路径 | 作用 |
|---|---|
| /etc/named.conf | bind9主配置,控制全局行为 |
| /var/named/ 下zone文件 | CentOS系域名数据文件 |
| /etc/bind/ 下db文件 | Ubuntu系域名数据文件 |
| /var/named/slaves/ | 从服务器自动同步的zone文件目录 |
bind9配置文件参数详解
named.conf看起来长,其实就三类内容:options全局段、zone区域段、include引入段,初次上手的人容易被options里密密麻麻的参数吓到,实际高频使用的只有那么几个。
listen-on port 53:监听的IP和端口,默认监听本机所有网卡,内网DNS建议改成具体内网IP。allow-query:允许哪些客户端发起DNS查询,写any代表全放开,内网服务建议限定网段。recursion:是否允许递归查询,给公司内部用的DNS开yes,对外公共DNS多半设no。allow-transfer:是否允许zone数据被“抓走”,这个参数在主从同步时尤其重要。
zone文件里则是一行行DNS记录,常见类型包括A记录(域名指向IPv4)、AAAA记录(IPv6)、CNAME别名、MX邮件交换记录、NS域名服务器记录,这些记录共同描述一个域名“该去哪儿”。
zone文件的记录类型

写zone文件时,格式上的坑比内容本身更常见,开头必须有$TTL声明默认缓存时长,紧接着是SOA起始授权记录,然后是NS记录,SOA记录末尾的括号不能省,括号里依次是序列号、刷新时间、重试时间、过期时间、最小TTL,记录里的域名结尾必须带点,没有点的会被自动补上主域名,这是新手最容易出错的地方。
bind9配置教程:手把手配置一个域名解析
以一个内部域名example.com为例,完整配置正向解析只需要三步。
正向解析zone配置实操
先在named.conf末尾追加一个zone区域,文件名可以自定义,但建议和域名保持一致。
zone "example.com" {
type master;
file "example.com.zone";
allow-query { 192.168.1.0/24; };
};
然后在/var/named/目录下创建example.com.zone文件:
$TTL 600
@ IN SOA ns1.example.com. admin.example.com. (
2024010101
7200
3600
1209600
300 )
IN NS ns1.example.com.
ns1 IN A 192.168.1.10
www IN A 192.168.1.10
mail IN A 192.168.1.20
最后运行named-checkzone example.com /var/named/example.com.zone检查语法,没问题就重启named服务,整个流程下来,一台内网DNS服务器就能正常回答example.com的解析请求了。
反向解析zone配置实操
反向解析解决的问题是“这个IP属于哪个域名”,常用于邮件服务器反查和网络排障,配置方法和正向几乎一样,只是zone名称要写成反向网段形式。
zone "1.168.192.in-addr.arpa" {
type master;
file "192.168.1.zone";
};
$TTL 600
@ IN SOA ns1.example.com. admin.example.com. (
2024010101
7200
3600
1209600
300 )
IN NS ns1.example.com.
10 IN PTR ns1.example.com.
20 IN PTR mail.example.com.
注意PTR记录的格式,IP的最后一段写在前面,域名末尾必须加点,行业共识认为,反向解析属于“平时用不上、出问题排查半天”的配置项,提前配好能省很多事。

bind9主从配置与安全加固
单台DNS服务器一旦宕机,整个域名的解析就跟着瘫痪,所以生产环境里主从架构是标配,bind9对这种需求支持得非常成熟。
bind9主从配置步骤
主服务器和从服务器的配置各改一小段就能跑起来。
主服务器端,在named.conf里的example.com区域中加入:
allow-transfer { 192.168.1.11; };
这句话的含义是:只有从服务器的IP才允许拉取zone数据。
从服务器端,区域类型改为slave,指定master服务器地址:
zone "example.com" {
type slave;
masters { 192.168.1.10; };
file "slaves/example.com.zone";
};
配置完两边重启named,从服务器会自动从主服务器同步数据,同步依赖SOA记录里的序列号,每次修改zone数据都要把序列号加一,否则从服务器会忽略更新,这是主从同步失败最常见的原因。
bind9安全配置
DNS服务器暴露在公网上风险很高,最常见的攻击方式是DNS放大攻击,bind9安全配置的核心思路就一句话:只给该用的人提供服务。
- 内部DNS服务器把
allow-query限定为内网网段,外部查询一律拒绝。 - 递归查询如果没有强烈需求,直接在options里设
recursion no;,防止被外界利用做递归放大。 - 内外网分离的场景可以用view视图,根据客户端来源返回不同解析结果,比如内网访问内网服务器IP,外网访问公网IP。
- 区域传送务必用TSIG签名,避免zone数据被未授权主机拖走。
bind9安全配置不是越复杂越好,而是根据你的部署环境做最小化开放,内部服务器没必要把端口暴露到公网,公网DNS也尽量不要开递归。
bind9配置后不生效怎么办
配置完bind9但域名解析不动,这种场景我见过太多次,其实排查路径非常固定:先查语法,再查日志,最后查权限。

排查手段:语法检查与日志
bind9自带两个校验工具,绝大多数配置问题在这一步就能暴露。
named-checkconf /etc/named.conf
named-checkzone example.com /var/named/example.com.zone
一个查主配置,一个查zone文件,没有输出通常意味着通过,如果配置文件有问题,比如漏了分号或括号不匹配,这两个命令会直接报错并指出行号。
服务起不来的情况,用systemctl status named看状态,再用journalctl -u named -f看实时日志,日志里出现permission denied大概率是文件权限问题,检查zone文件属主是否为named用户。
常见配置错误
- SOA序列号没有递增,导致主从不同步。
- zone文件忘记结尾的点,记录被自动拼接成错误域名。
- 文件权限不对,named进程读不到zone文件。
- 防火墙或安全组没有放行UDP/TCP 53端口。
- CentOS下SELinux拦截了named读取文件,运行
restorecon -Rv /var/named可恢复上下文。
多数的bind9配置错误集中在上述五类,按顺序排查基本一轮就能定位。
bind9常见配置问题解答
bind9配置错误排查时,优先看哪里?
先看named-checkconf的报错,这是最直接的信息来源,没有报错再看日志和文件权限,按这个顺序走,多数问题在五分钟内解决。
bind9主从同步失败的原因有哪些?
序列号未递增是最常见的原因,其次是从服务器无法连接主服务器的53端口,以及allow-transfer漏写了从服务器IP,bind9主从配置步骤中,序列号管理和防火墙放行必须同时搞定。
bind9配置内网DNS需要开启递归吗?
视场景而定,内网终端需要递归解析外网域名时,必须开启recursion并把allow-query限定在内网段,仅做权威解析时,完全没有必要开启。
bind9配置的最终形态就是熟练操作named.conf和zone文件这两个核心,配合语法检查和日志定位,再复杂的解析需求也能落地。
