DNS服务器bind9用法
BIND9(Berkeley Internet Name Domain, version 9)是当前最广泛使用的开源DNS服务器软件,由Internet Systems Consortium(ISC)开发和维护
主要功能:
- BIND9的主要作用是域名解析,将域名转换为计算机可识别的IP地址实现互联网通信的基础服务
主要特性:
- 管理特定域名的DNS记录
- 响应其他DNS服务器的查询请求
- 支持主从服务器架构
- 为客户端提供完整的域名解析服务
- 缓存查询结果提高性能
- 支持DNSSEC安全扩展
- 将查询转发到其他DNS服务器
- 实现本地DNS缓存加速
应用场景:
- 企业内网:搭建内部DNS服务,管理内部域名
- 互联网服务:作为公共DNS服务器(如Google DNS、Cloudflare DNS基于BIND)
- 域名注册商:为注册的域名提供权威解析
- CDN服务:实现智能DNS解析和负载均衡
本例子中演示服务器系统为ubuntu 24.04,环境准备:
| IP | 192.168.51.246 | 192.168.51.252 | 192.168.49.224 |
| 用途 | 主DNS服务器 | 从DNS服务器 | 应用服务器 |
1、先安装bind9,执行如下命令:
apt install -y bind9 bind9-utils
安装后会自动启动,如图:

2、/etc/bind目录下有多个配置文件,如图:

- named.conf – 主配置文件,通过include语句包含其他配置文件,定义服务器运行的基本框架
- named.conf.options – 全局选项配置文件,定义监听设置、访问控制、转发器、递归查询、DNSSEC等全局参数
- named.conf.local – 本地区域配置文件,用于定义服务器管理的权威DNS区域(正向和反向解析)
- named.conf.default-zones – 默认区域配置文件,包含localhost、广播地址等系统默认的DNS区域定义
- db.local – localhost正向解析文件,将localhost解析为127.0.0.1
- db.127 – 127.0.0.0/8网段的反向解析文件,用于本地回环地址的反向解析
- db.0 – 0.0.0.0/8网段的反向解析文件
- db.255 – 255.255.255.0网段的反向解析文件
- db.empty – 空区域文件模板,用于创建新的区域文件
- rndc.key – 远程名称守护进程控制密钥文件,用于rndc工具与named进程的安全通信
- bind.keys – 根区域信任锚点文件,包含根DNS服务器的公钥,用于DNSSEC验证
- zones.rfc1918 – RFC 1918私有地址空间定义文件,包含10.0.0.0/8、172.16.0.0/12、192.168.0.0/16等私有网段的区域定义,通常用于防止私有地址泄露到公网
实际部署时,named.conf.options和named.conf.local是最频繁修改的配置文件,区域文件则根据业务需求动态更新
3、编辑全局配置文件(主服务器),添加内容如下:
options {
directory "/var/cache/bind";
listen-on port 53 {127.0.0.1;192.168.51.246;};
allow-query {
192.168.51.0/24;
192.168.49.0/24;
};
recursion yes;
forwarders {
8.8.8.8;
8.8.4.4;
};
dnssec-validation auto;
listen-on-v6 { any; };
};
#日志模块与options模块同级
logging {
channel default_file {
file "/var/log/named/named.log" versions 3 size 5m;
severity dynamic;
print-time yes;
print-severity yes;
print-category yes;
};
channel query_log {
file "/var/log/named/query.log" versions 3 size 5m;
severity dynamic;
print-time yes;
print-severity yes;
print-category yes;
};
category default { default_file; };
category queries { query_log; };
};
- directory:指定BIND9的工作目录,DNS缓存、动态区域文件、临时文件存放位置
- listen-on:指定监听的IP地址和端口,只允许这两个监听DNS查询
- allow-query:允许查询的客户端IP范围,其余网段IP将会被拒绝,默认为any(所有)
- recursion yes:启用递归查询功能,当客户端查询的域名不在本地权威区域时,BIND9会向其他DNS服务器查询,如果设为
no,只响应本地权威区域的查询,生产环境建议谨慎开启,防止DNS放大攻击 - forwarders:指定上游DNS服务器,当递归查询时,优先查询8.8.8.8和8.8.4.4
- dnssec-validation auto:DNSSEC验证设置,防止DNS欺骗和缓存投毒攻击,auto(自动),yes(强制),no(不验证)
- listen-on-v6:监听所有IPv6接口,如果不需要IPv6支持,可设为
none - logging: 记录日志信息
- category default:记录所有未明确指定类别的日志信息,系统启动/停止、配置加载、区域传输、错误信息、警告等常规运行日志
- category queries:专门记录 DNS 查询请求和响应,客户端查询的域名、查询类型、源IP、响应结果等
添加日志配置后需要配置相应权限,并重启bind9,如下:
# 创建日志目录
sudo mkdir -p /var/log/named
# 设置正确的所有者和权限
sudo chown bind:bind /var/log/named
sudo chmod 755 /var/log/named
# 重启服务
sudo systemctl restart named
从服务器(51.252)的配置跟主服务器的主要区别就在listen-on这里,IP改为从IP即可,如图:

4、编辑区域配置文件name.conf.local(主服务器),如下:
zone "oa.com" {
type master; # 主服务器类型
file "/var/lib/bind/oa.com.zone"; # 区域文件路径推荐放到/var/lib/bind下,实际可自定义
allow-transfer { 192.168.51.252; }; # 允许传输到从服务器
notify yes; # 启用区域变更通知
#also-notify {ip1;ip2;ip3;};
};
- zone:定义区域名字,这个名字要和oa.com.zone中的保持一直
- type:类型为主DNS服务器
- file:定义区域文件路径,这里就是写具体的域名和IP映射
- allow-transfer:从服务器
- notify yes: 如果变更了通知从服务器
- also-notify:额外通知的服务器,没有就注释掉
给区域文件创建目录以及授权,如下:
sudo mkdir -p /var/lib/bind
sudo chown bind:bind /var/lib/bind
sudo chmod 755 /var/lib/bind
从服务器(51.252) 和主的有一些区别,没有notify参数,修改type类型,指定主服务器地址,如图:

如果有多个不同的域名需要解析,那么就需要在name.conf.local中配置多个zone(主从都要配置),如图:

注意:只需要在主服务器上创建test.com.zone这类区域文件,从不需要,会自动同步过去
5、创建/var/lib/bind/oa.com.zone区域文件(主服务器),;开头的表示注释,内容如下:
$TTL 604800
@ IN SOA ns1.oa.com. admin.oa.com. (
2025121901 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; Name Server Records
@ IN NS ns1.oa.com.
@ IN NS ns2.oa.com.
; Mail Exchange Records
@ IN MX 10 mail.oa.com.
; Address Records(解析IPv4地址,也就是常配置的域名IP解析)
@ IN A 192.168.51.100
ns1 IN A 192.168.51.246
ns2 IN A 192.168.51.252
www IN A 192.168.49.224
abcd IN A 192.168.49.15
defg IN A 192.168.49.10
gong IN A 192.168.51.15
; IPv6 Address Records
www IN AAAA 2001:db8::1
; Canonical Name Records(解析CNAME记录)
web IN CNAME www.oa.com.
imap IN CNAME mail.oa.com.
; Text Records(解析TXT)
@ IN TXT "v=spf1 a mx ~all"
_dmarc IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
; Service Records
_sip._tcp IN SRV 10 60 5060 sip.oa.com.
- TTL:DNS缓存时间,默认是秒
- ns1.oa.com. : 主权威DNS服务器,要以点(.) 结尾表示绝对域名
- 管理员邮箱,格式:
admin.oa.com.对应admin@oa.com,@符号用点(.)表示 - Serial : 序列号,格式建议:YYYYMMDDNN,每次修改必须递增,从服务器通过比较序列号判断是否需要同步
- Refresh (604800 = 7天):从服务器检查主服务器更新的时间间隔,从服务器每7天检查一次主服务器的序列号
- Retry (86400 = 1天):从服务器刷新失败后的重试间隔,主服务器不可达时,从服务器每天重试一次
- Expire (2419200 = 28天):从服务器数据过期时间,如果28天内无法联系主服务器,从服务器停止服务
- Negative Cache TTL (604800 = 7天):查询不存在的记录时,缓存否定结果的时间
- @ IN NS ns1.oa.com. 和 @ IN NS ns2.oa.com. :声明该区域的权威DNS服务器,两台可以实现高可用,@表示当前区域(oa.com)
- @ IN MX 10 mail.oa.com.:邮件交换记录,
- @ IN A 192.168.51.100 :根域名oa.com解析到192.168.51.100
- ns1 IN A 192.168.51.246:指向主DNS服务器
- ns2 IN A 192.168.51.252:指向从DNS服务器
- www IN A 192.168.49.224:www.oa.com解析到192.168.49.224
- abcd IN A 192.168.49.10:abcd.oa.com解析到192.168.49.10
- www IN AAAA 2001:db8::1:解析IPv6地址
- web IN CNAME www.oa.com. ; web.oa.com是www.oa.com的别名
- imap IN CNAME mail.oa.com. ; imap.oa.com是mail.oa.com的别名
- @ IN TXT “v=spf1 a mx ~all”:SPF记录,防止邮件伪造,允许该域名的A记录和MX记录发送邮件,~all表示软失败(建议用-all表示硬失败)
- _dmarc IN TXT “v=DMARC1; p=none; rua=mailto:dmarc@example.com”:DMARC记录,邮件认证协议,p=none:仅监控模式,不拒绝邮件,rua:聚合报告接收邮箱
- _sip._tcp IN SRV 10 60 5060 sip.oa.com.:服务定位记录,格式:
优先级 权重 端口 目标主机,优先级10,权重60,端口5060,SIP服务(VoIP)通过TCP协议在sip.oa.com:5060提供
通过如下命令测试配置是否正确,如下:
named-checkconf
注意:实际使用中最常用的就是A记录解析了,也就是域名IP映射
从服务器(51.252) 不需要手动创建oa.com.zone文件,会自动同步过来的,但是同步过来后是二进制缓存格式,不是文本格式,不可打开,如果主区域配置文件有变动,从也会同步更新,但是注意,修改主文件,要将Serial参数递增,这是DNS 主从同步机制的核心设计,从库通过比较 Serial 来判断是否需要同步更新
例如:我要在主区域文件中新增一条解析记录,需要修改两个位置,如下:
2025121902 #修改Serial,原来是2025120901,增加一位数
gong IN A 192.168.51.15 #添加解析记录
查看从库是否同步正常方法:
- 查看日志:显示transfer of ‘oa.com/IN’ from 192.168.51.246#53: Transfer completed
- 执行两条命令:dig @主库IP oa.com SOA +short 和 dig @从库IP oa.com SOA +short ,两条记录的Serial值要相等
6、验证
修改应用服务器的网卡配置,添加DNS服务器,重启网卡,查看/etc/resolv.conf,如图:

ping域名,看解析IP是否与配置一样,如图:






