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,环境准备:

IP192.168.51.246192.168.51.252192.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.optionsnamed.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是否与配置一样,如图:

标签