Bind安装实战(以centos7.8为例)
环境准备
系统操作版本:CentOS7 x64
安装方式:yum源码安装
背景
1.1 DNS
DNS ( Domain Name Service) 作为一个非常让人耳熟能详的概念,可以把复杂难记的IP地址转化成为一个容易被记住域名供人们去调用,这样人们只需要记住每一个网站的域名而不需要记住非常复杂的IP地址。此外,由于网络组网通讯的局限性,不能将所有的网站的IP地址一一规划用,因此 DNS 也提供了网络地址转换的相关功能。
DNS ZONE:
DNS Zone,DNS域,被用来划分DNS主域。传统的DNS域类似一个树状的结构,被分成不同的区域,这些区域可区分一个DNS服务器中命名空间中不同的区域。
DNS区域是构成DNS命名空间的一部分,由特定组织或管理员加以管理,其可以对权威性域名服务器等DNS组件更加精细的控制。 域名空间是一个分层数,其中DNS的根域位于顶部,DNS区域始于该树中的一个域,并且可以扩展到下边的子域。
常见的资源记录类型:
A :Address地址, IPv4
AAAA:Address地址 IPv6
NS :Name Server域名服务器
SOA:Start of Authority 起始授权机构
MX:Mail Exchanger 邮件交换
CNAME:Canonical Name规范名
PTR:Pointer 指针,即反向DNS系统,用于查询IP地址时给出相关的域名,即查询IP地址的PTR记录给出该IP指向的域名,在 Zone 文件中被设置;
TXT:Text,网络名称系统的记录,可讲文字信息提供给网络意外的来源,其中有一个非常重要的功能就是当外部查询需要显示BIND的相关版本号时,可以指定 TXT查询,这个配置是默认的;谷歌会使用 TXT 记录来验证网站的拥有权以及确保电子邮件的安全;
SRV:Service 记录,域名中用于指定服务器并提供服务的位置:主机好、端口号;一般在 Zone File 中被定义;
CNAME
CNAME-records ( Canonical name for an alias )是域名的别名。一个服务器的域名地址 nyc3.example.com 这个主机域名可能会提供不同的服务,比如说域名 nyc3.example.com 指向的主机即要去提供 web服务,也要提供 ftp 服务,那么这个时候就需要一个别名域名来指向原来的域名,这个时候就可以使用一个 A 记录来管理多个域名,为DNS后期修改配置提供方便。举个例子:
我想要搭建一个博客网站后台为博客网页提供web服务,我想要节省我服务器搭建的成本开销,只想租用一个服务器并配置相关域名解析,我的博客网站现在提供的服务有评论,分享,登陆授权,注册,这个时候我需要同时在这个服务器上开通这些服务,一开始你的博客网站默默无闻,访问量以及下载量并不是那么大,这个时候你的服务器负载并不是那么严重;当你的访问量暴增的时候,这个时候就需要考虑到你的服务器的流量转发问题了~原始服务器的流量暴增已经让你的服务器性能急剧下降,你需要将原来的提供服务的服务器的相关模块提供一个内容分发模块 (CDN),这个CDN提供商要求你的域名做一个Pointer来指向他们为你提供的 DNS地址,这个时候你的 CName 就可以指向他们提供的域名,做到对DNS流量的分发,从而实现网站的流量负载均衡作用。
NS (Name Server)
域名服务器,NS,用于确定哪些服务器(注意不是单个服务器)为一个局域网传递DNS信息以及确定域名由哪个服务器进行解析。
一般NS配置在 BIND9 中的 db 文件中进行配置,在 SOA 配置之后。NS记录 和 SOA记录是任何一个DNS区域都不能或缺的两条记录。
在 BIND 的配置中,可以在 Zone 文件中指定多个 Name Server,一般来说 Name Server 需要搭配 SOA 进行配置;
SOA( Start of Authority)
SOA 又被称作 起始授权机构记录, 被标记成在众多NS记录中哪一台是主服务器。
SOA 记录表示此域名的权威解析服务器地址,当要查询的域名在所有递归解析服务器没有域名的解析缓存时,会回源到请求此域名的SOA 记录,也叫做权威解析记录。
SOA 作为所有区域文件的强制性记录,他必须是 ZONE 文件中的第一个记录。
SRV (Service)
SRV 记录是从 RFC2052 中对 SRV资源进行了定义。SRV 被用来记录服务器提供什么样的服务。
1.2 FQDN
FQDN(Fully Qualified Domain Name) 完全合格域名/全程域名,即域名可以通过DNS进行解析,其公式 FQDN = HostName + Domain。
这门技术解决了一个多个主机的问题,一个网站或者服务器集群一般都是有多个主机一起协作的,比如说包括正向代理服务器、反向代理服务器、Web服务器、Email服务器、OA服务器、FTP服务器等等,这个时候就涉及是不是需不需要为每一个主机申请一个域名。 有了这个技术之后每一个主机都可以自己申请一个 Hostname
来区别于其他的主机,这个时候就只需要一个域名就可以做到管理所有的主机。
比如我申请了一个域名: doheras.com
现在我有两个服务器需要用到这个域名,一个 FTP服务器,一个Web服务器,这两个服务器都需要用到 doheras.com
这个域名,根据公式,我们知道可以采用 hostname
的方式来访问不同的主机:
Web 服务器: web.doheras.com
FTP 服务器: ftp.doheras.com
因此, FQDN 服务可以简化在服务和应用中的配置流程,提高配置文件的可维护性。
在配置DNS的过程中,因为服务端的工作在UDP协议端口53上,DNS需要FQDN提供正向解析 (FQDN --> IP)以及反向解析 (IP --> FQDN) 的服务。
1.3 BIND
BIND(Berkeley Internet Name Domain)作为一款目前市面是最主流的开源DNS软件,占据了市面上DNS服务器软件的九成,目前由 互联网系统协会 (Internet Systems Consortium) 负责开发和维护。目前,最新的稳定版BIND已经更新到了 BIND 9 版本。
目前市面上的主流操作系统( Linux/Windows/Windows Server) 都可以承载BIND的DNS服务,从官网上来看,目前支持的主流的Linux操作系统及其服务器种类有: Ubuntu、Debian、Fedora/CentOS。其中对于Fedora的版本支持已经涵盖了最新版本:Fedora 33。在Linux平台上可以做到对 BIND 源码的编译和特殊功能定制的操作,对于该软件在实际运行过程中的安全性的探讨研究。其基本功能支持在服务器或者是本机上搭建定制的DNS服务并做到域名解析功能。对于将该软件部署到Linux平台最具有优势的方面是定制化的DNS服务,因为源码对于每一个开发人员和网络管理人员都是透明的,因此可以做到对该软件相关功能的定制以及二次开发。
另外,对于使用较为广泛的Windows操作系统,BIND也给出了可以运行的解决方案,但是其定制化的功能因为平台的原因收到了限制和Windows 10 操作系统的相关问题,因此我认为不推荐 BIND 在 Windows上的实验。
1.4 搭建模拟DNS服务网络虚拟设备架构示意图
172.16.2.11
作为主要的 (Master) DNS解析服务器,主要为客户端提供域名解析服务,所有客户端的首要访问的DNS解析服务器是 NS1
;
172.16.2.12
作为一个灾备的服务器NS2
,被当作一个灾备DNS服务器使用,在主机无法提供域名解析服务的时候被启用,其配置流程与NS2基本上一样,唯一的区别是配置需要分清与NS1的主次关系;172.16.2.5
/172.16.2.6
/172.16.2.7
做为模拟请求客户端的虚拟机,其用来模拟和重现配置DNS解析客户端的配置流程;172.16.2.0
作为虚拟机连接本机的 NAT 网络的网关地址,用于与 主机进行通信;
一、安装教程
- CentOS7最小化安装后使用yum完成以下软件安装
yum -y install net-tools iptables-services vim gcc* tcpdump cmake bind-utils zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel libxml* git wget libtool libuv libuv-devel libnghttp2* libcap* epel-release libuv libuv-devel libcap-devel
- 安装Python3环境做好编译前工作
yum install -y epel-release
yum install -y python3
pip3 install setuptools ply
- 创建named用户及相关目录,使用53端口作为named组和named用户的ID号
groupadd -g 53 -r named
useradd -u 53 -s /sbin/nolgin -r named -g named
- 访问官网下载bind最新稳定版本(Stable)的源码包,解压并开始编译
wget https://downloads.isc.org/isc/bind9/9.18.25/bind-9.18.25.tar.xz
tar -xvf bind-9.18.25.tar.xz
cd bind-9.18.25
./configure --prefix=/usr/local/bind
# --prefix=指定安装的目录路径
- 执行安装
make && make install
- 安装成功后目录架构如下
[root@localhost bind-9.18.25]# ll /usr/local/bind/
总用量 8
drwxr-xr-x. 2 root root 4096 4月 7 04:37 bin 一些工具可执行程序例如nslookup等
drwxr-xr-x. 2 root root 23 4月 7 04:37 etc 主配置文件
drwxr-xr-x. 10 root root 100 4月 7 04:37 include
drwxr-xr-x. 3 root root 4096 4月 7 04:37 lib
drwxr-xr-x. 2 root root 90 4月 7 04:37 sbin 编译后的程序文件例如named、rndc等
drwxr-xr-x. 3 root root 17 4月 7 04:37 share 文档
二、初始化bind
- 使用rndc工具管理bind-dns操作
cd /usr/local/bind
sbin/rndc-confgen > etc/rndc.conf
cd /usr/local/bind/etc/
tail -10 rndc.conf | head -9 | sed s/#\ //g > named.conf
向named.conf文件末尾新增内容如下
options {
directory "/usr/local/bind/var/run";
pid-file "named.pid";
recursion no;
allow-query { any; };
listen-on port 53 { any; };
};
recursion no;一般不建议开启递归查询
- 检查配置文件合规性
chown -R named:named /usr/local/bind
cd /usr/local/bind
sbin/named -u named -g
如遇到chmod: 无法访问"/usr/local/bind9/var/run": 没有那个文件或目录;尝试执行并赋予权限
mkdir -p /usr/local/bind/var/run && chmod o+w /usr/local/bind/var/run
三、运行bind
- 使用named用户权限启动bind,并查看是否启动成功
/usr/local/bind/sbin/named -u named -c /usr/local/bind/etc/named.conf
ps -ef|grep named
netstat -anp|grep 53
dig @127.0.0.1 www.baidu.com
- 设置为开机自启
编写一个shell脚本,脚本名称named
#!/bin/bash
#chkconfig: 545 35 75
#description: named DNS service manager
data=" /usr/local/bind/sbin/named -u named -c /usr/local/bind/etc/named.conf"
function START(){
eval $data && echo -e "BIND9 start\033[32m ok\033[0m"
}
function STOP(){
kill `cat /usr/local/bind/var/run/named.pid` && echo -e "BIND9 stop\033[32m ok\033[0m"
}
case "$1" in
start)
START
;;
stop)
STOP
;;
restart)
STOP
sleep 3
START
;;
*)
echo "Usage: named (start|stop|restart)"
;;
esac
移动脚本至系统开机目录并检查脚本格式是否正确
mv named /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/named
chkconfig --add named
chkconfig named on
#可选项,检查服务是否可用
service named start
ps -ef|grep named
service named stop
ps -ef|grep named
service named restart
ps -ef|grep named
- 配置环境变量
echo 'export PATH=$PATH:/usr/local/bind/sbin' >> /etc/profile
source /etc/profile
四、配置标准权威区(named.conf)
named.conf中配置权威区需要注意的细节如下:
使用zone语句定义权威区的名称,并用花括号括起来,记得末尾的分号,否则报错。
子语句中首先必须包含type关键字,type的常用类型可以是master(代表主区)、slave(代表辅区)、forward(转发区)、hint(根名字服务器集合)、static-stub(静态存根区)、stub(存根区)、redirect(重定向区)。
区选项file用来指定test.com区文件的名称和位置,如果没有指定路径则此文件应该在options选项中directory设置的目录中。
2.1 CONF 文件
acl
一般来说,ACL模块用来承担控制主机可以访问域名解析服务器的角色,其设置不会让控制文件的配置非常冗余和庞大。采用这个配置可以有效防范DOS以及Spoofing攻击。一般来说定义这部分的内容来规定IP是否能够被接入以及Blocklist来阻止某些特定的IP地址介入到域名解析服务器中。
ACL匹配客户端是否能够接入到域名服务器基于三个基本的特征:
- 客户端的IPv4或者IPv6地址
- 用于签署请求的 TSIG 和 SIG(0) 密钥
- 在DNS客户端子网选项中编码的前缀地址
匹配 acl
定义以及使用规则如下: string
是用来命名IP地址集的一个变量名,可以随意地被命名;
acl <string> { <address_match_element>; ... };
举一个在 named.conf.options
文件中被定义的例子:
acl bogusnets {
0.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3;
10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16;
}; // 这个部分
// Set up an ACL called our-nets. Replace this with the
// real IP numbers.
acl our-nets { 172.16.2.11/24; 172.16.2.12/24; }; //子网的名称
logging
logging
部分的配置为DNS解析服务器提供了日志记录的功能,DNS服务器上的所有日志记录被存储到了指定的文件中。其通用的配置文件为:
logging {
category <string> { <channel_name_string>; ... };
channel <string> {
buffered <boolean>;
file <quoted_string> [ versions ( unlimited | <integer> ) ]
[ size <size> ] [ suffix ( increment | timestamp ) ];
null;
print-category <boolean>;
print-severity <boolean>;
print-time ( iso8601 | iso8601-utc | local | <boolean> );
severity <log_severity>;
stderr;
syslog [ <syslog_facility> ];
};
};
从上边的通用配置格式可以看出来,logging
模块分为两个部分,category
和 channel
,channel的作用是指定输出的方式、日志格式的选项和事件的严重性,每一个channel 可以指定一个 category 来指定记录的事件类型。其中 category 用来区分不同的事件产生的类别或者场景,比如:客户端请求-client request
、配置文件解析处理-Configuration file parsing and processing
。
如果在 named.conf.options
文件中没有指定 logging
模块系统会给出一个默认的配置
logging {
category default { default_syslog; default_debug; };
category unmatched { null; };
};
channel
的配置规则:
-
所有的日志输出都需要 channel 来指定输出格式,BIND9 对于创建 channel 的数量没有限制。
-
每一个 channel 都需要为该通道的日志信息指定一个
destination clause
- 目的句柄,目的句柄在 channel 阶段被配置,这个目的句柄用来区分: 1)输出到具体的文件的名字 -file
;2)输出到具体的系统日志工具中(syslog/syslogd)-syslog
;3)输出到终端显示- 标准错误流(standard error stream);4)或者该错误消息直接被丢弃 -null
。其次,channel 的配置可以规定每一个错误日志消息的响应级别,默认的响应级别是
info
,channel 可以规定接受错误消息的级别;此外,channel 还可以控制输出错误日志消息的格式,可以包含:响应时间戳、category名字、严重等级等。
channel
的配置参数:
-
buffered
: 用来规定是否刷新错误日志的文件,其参数值为<boolean>
,在 BIND9 中<boolean>
值的参数值为yes
/no
,如果设置成为yes
那么日志消息流(一般每一个错误日志消息都是一个 Log Entry)就不会刷新,而是被保存在缓冲区中了,不会刷新到文件中。 -
file
: 类似于Linux的通道概念,file 将日志输出流通过通道直接输出给文件,从上边的通用配置可以看出来可以为 file 指定文本文件的大小 -size
;指定 log 文件的版本号 -version
;指定用于命名备份版本的格式 -suffix
size
用来限制log文件的大小,如果log文件的大小设置超过了设定的阈值,那么系统会自动停止输出内容到文件中;versions
: 用于指定新创建的 log文件数存储到本地的上限值,默认的参数值为unlimited
,当指定的文件的大小超过设定的size
值得时候,如果没有指定versions
,那么系统就不会继续写进log;如果制定了versions
,那么就会继续写入;suffix
:设定用来命名log
文件的方式;好像没啥用,我添加这个参数没有什么反应...; -
syslog
:将通道定向到系统的日志文件流中; 常用的支持日志文件服务为:dameon
、syslog
、local6
、local7
; -
severity
:用来承担定义日志严重级别的定义角色,相当于syslog
-priorities
。比如说定义了日志的严重级别为Debug
,那么会输出日志事件Debug
以上的错误到文件中。一般常用的严重等级:debug[level]
、notice
、warning
、dynamic
- 与当前服务器的日志保持一致;一般的 DNS服务器的日志等级调成info
即可; -
stderr
:将通道指向服务器的标准错误流。这是为了在服务器作为前台进程运行时使用; -
print-time
:yes
/no
/local
/iso8601
/iso8061-utc
可以设定不同的输出到日志文件的时间格式; -
print-category
:打印日志消息配置category
的信息到你设定的日志文件中; -
print-severity
: 打印日志的严重等级
category
词组配置规则:category <config_string> { <channel_name_string>; ... };
client
: 客户端请求;cname
:由于是CNAME而不是a /AAAA记录 的域名服务器;config
: 配置文件解析和处理过程;database
:与名称服务器内部用于存储区域和缓存数据的数据库相关的消息;general
: 没有被归类的category
类别的其他种类的日志文件信息;lame-servers
: 远程服务器中的错误配置,BIND 9在解析期间试图查询这些服务器时发现;network
: 网络操作;notify
: 通知协议;queries
:记录所有查询 DNS服务器的 query;query-errors
: 关于导致某些失败的查询的信息;xfer-in
:区域传输服务器正在接收;xfer-out
:区域传输服务器正在发送的信息;zoneload
:加载区域和创建自动空区域;
怎么去配置这个服务?
配置的 logging
服务会创建指定的日志文件,该日志文件从服务挂起的时候被创建,用于记录DNS服务中的相关的配置信息以及交换信息。在 Debian9 的默认存储目录为 /var/cache/bind/*
。你也可以为其指定你想要存储的位置,我个人喜欢将 BIND 日志和系统日志保存在一起,即保存路径为:/var/log/bind
。这个路径不是在你安装 BIND 时候就已经创建了,需要你自己创建对应的文件目录;
如果你想要配置成一个自己的目录,首先你需要创建一个自定义的目录,比如说我指定了我想要存放日志的文件的目录: /var/log/bind
,如果不为这个文件使用 chown
命令指定权限的话会出现 isc_stdio_open '/var/log/example.log' failed
的报错:
- 首先你必须手动创建自己的文件到指定目录下;
- 解决方法是:
sudo chown bind:root /var/log/bind/*
;
现在我们已经基本上了解了 logging 的工作原理,其工作机制简单地来说就是,首先你需要创建一个 channel 来规定输出日志流的格式还以及日志文件名、文件版本,每一个 channel 可以被多个 category 调用使用,每一个 category 相当于一个 BIND9 内嵌的服务模块,服务模块去调用日志配置模最后输出格式化日志。
在这里我之前并没有给出对应的配置示例,现在给出示例:
// named.conf.options 文件中给出logging的配置示例
logging {
// 在我自己使用BIND进行DNS解析的时候,出现了 TIME_OUT 的相关错误,这个错误是需要在 client 进行日志记录
// 因此对于客户端的解析需要有相关的日志配置,才能发现在解析时的问题
//
//
//
category client { default_client; } // 指定 client 所有的错误
channel default_client {
file "/var/log/bind/err/client.log" version 1 size 20m
print-category yes;
print-time iso8061;
severity debug 3;
}
}
- 配置named.conf
文件路径:/usr/local/bind/etc/named.conf
···············
/*
named.conf末行插入
*/
//创建test.com权威区
zone "test.com" {
type master;
file "/usr/local/bind/etc/test.com.zone";
};
- 创建区(zone)文件
新建文件路径:/usr/local/bind/etc/
(与named.conf同级)
在指定的目录下创建zone文件名称==test.com.zone==内容如下。
$TTL 3h
@ IN SOA dns1.test.com. manager.test.com. (
1 ;Serial
3h ;Refresh after 3 hours
1h ;Retry after 1 hour
1w ;Expire after 1 week
1h) ;Negative caching TTL of 1 hour
;
@ IN NS dns1.test.com.
@ IN NS dns2.test.com.
;
;server domain
;
dns1 3600 IN A 111.10.10.10
dns2 3600 IN A 111.10.10.20
www 300 IN A 101.10.10.10
hello 20 IN A 101.10.10.20
a 20 IN CNAME hello
mail 300 IN A 101.10.10.30
;
;mail server
;
@ 3600 IN MX 10 mail
;
;example defaut TTL
$TTL 50
b IN A 1.1.1.1
区文件的相关说明如下:
第一行以$TTL 3h开始,此行设置了域名记录的默认TTL值,如果整个zone文件中没有其他的同类TTL默认设置,那么这个就是全局的域名默认TTL设置。BIND8.2之前的版本是用区的SOA记录额的最后一个字段来设置默认TTL,RFC2308发布后,SOA的最后一个字段是否定缓存TTL。
第二行是test.com区的SOA记录(start of authority,起始授权机构),一个区文件中必须有而且只能有一个SOA记录。dns1.test.com是test.com的master名称服务器(DNS)的名称。manager.test.com是区域负责人的邮件地址,把第一个点替换成@则为manager@test.com。后面括号内的大部分字段都是供slave(辅)服务器用的,后面我们专题介绍。
@是一种简写方法,这个位置等同于test.com,bind启动后会把zone名称作为一种“来源域名”引入,在zone中的域名如果与来源域名相同,那么这个域名就可以简写为@。
上面提到的“来源域名”会附加在zone文件中的每个记录名称后面,所以zone文件中例如www.test.com域名就可以简写为www,bind会自动的附加这个来源域名后缀。当然我们在zone文件中直接写www.test.com.也是可以的,注意域名后面有一个(“.”),否则域名其实是www.test.com.test.com
分号开头代表注释,适当的空行和注释对zone文件的维护有好处。
b.test.com域名上$TLL 50代表从这往下的域名如果没有指定TTL则默认TTL为50秒。
- 合规校验
完成zone文件配置后可以使用bind自带的检查工具对zone文件配置合规性进行检查,检查举例如下:
/root/bind-9.18.25/bin/check/named-checkzone test.com /usr/local/bind/etc/test.com.zone
五、开启bind日志记录
BIND日志记录的重要的概念:
- 通道channel
用于指定日志数据的流向,如syslog、文件 - 类别categories
用于指定记录哪些日志,如查询日志queries、动态更新日志update、解析器的递归查询处理日志resolver等。
安装严重性递减的顺序排列是==critical–>error–>warning–>notice–>info–>debug [level]–>dynamic==
debug日志可以指定级别,如果不指定则默认BIND会认为是1级。默认的严重级别是info,这意味着如果要看调试日志则必须修改严重级别。
- name新建日志文件夹并开启日志记录
mkdir -p /usr/local/bind/log
chown -R named:named /usr/local/bind
logging {
channel query_log {
file "/usr/local/bind/log/query.log" versions 5 size 50m;
print-time yes;
severity info;
};
category queries { query_log;};
channel general_log {
file "/usr/local/bind/log/general.log" versions 5 size 50m;
print-time yes;
print-category yes;
print-severity yes;
severity info;
};
category default { general_log; };
category general { general_log; };
};
- 配置文件中通过channel定义了2个日志,日志数据流向均是服务器本地的文件中,通过file自语句来指定。channel的名称是根据情况自己定义。
- query_log这个channel中通过category语句指定了日志的类别是queries即查询日志,而general_log这个channel通过category语句指定了default和general两种类别的日志均输入到这个channel中。通过category设置类别的语法可见,如果需要多个类别那么则写多个即可,类别后面的花括号指定这类日志归属那个channel。
- print-time代表在日志数据中打印时间戳信息,通常如果日志流向syslog则不需要这个设置,因为syslog有也记录日期和时间。
- print-category代表日志数据中打印类别的名称。
- print-severity yes代表日志数据中打印级别。
- severity 日志级别。
- version选项用于指定文件保存多少备份版本(几个文件回滚),如果设置为unlimited则代表没有限制,此时bind将保留99个版本文件。如设置为3,那么BIND将保留file、file0、file1、file2共4个文件,每次文件的轮转顺序是把file1改为file2,把file0改为file1把file改为file0,然后新建一个file。
- size选项用于限制日志文件的增长,K代表kilobytes、M代表megabytes、G代表gigabytes。
六、DNS动态更新
DNS动态更新是一种允许客户端设备在网络上动态注册和更新其域名和 IP 地址的过程。
- 生成密钥并将其配置到需要进行动态更新的区域中
#生成密钥并写入named.conf
tsig-keygen -a hmac-md5 mytest > mytest.key
cat mytest.key >> /usr/local/bind/etc/named.conf
#将其配置到需要进行动态更新的区域
vim /usr/local/bind/etc/named.conf
#配置完成后重启bind生效
service named restart
七、搭建bind主/辅DNS
主/辅DNS重要概念
在正式搭建主/辅DNS之前,必须要了解一些重要的概念,如下:
- master上执行动态更新后,master会立即发送notify消息给slave。
- 此时slave请求的是IXFR增量区数据更新,并且master应答的也是增量的数据即fff.test.com这个域名的更新。
- primary master和slave
primary名字服务器就是主DNS,通常我们也称之为master;slave名字服务器就是辅DNS,有的时候我们也叫sencondary。slave DNS也可能是其他DNS的master(串联~),通过这个机制我们可以构建一个多主+多辅的DNS系统。当然,大多时候不需要搞这么复杂,最重要的是不能只有1台DNS! - zone transfer
slave DNS通过网络从master DNS那里加载数据,这个过程被称作区域传输即zone transfer。 - AXFR
完全区域传输(Full zone transfer)或者称DNS全量更新协议,它传送的是整个区域的数据。 - IXFR
增量区域传输(Incremental zone transfer),slave名称服务器告诉master服务器自己目前所持有得区域数据是哪个版本,而只要求发生该版本和当前版本之间有变动的部分数据即可。这样就可以大幅降低区域数据传输的大小和时间。 - NOTIFY
众所周知,slave DNS通过区域的SOA记录中的refresh 时间定期的询问master DNS实现区域数据的自动更新。占位置轮询的机制导致区域数据变更后DNS系统全局生效有一段间隔时间。RFC 1996给出一种机制,允许master DNS通知slave DNS,区域数据已经变更,这个机制就是 DNS NOTIFY。 - 区数据传输时的端口和协议
master和slave之间在进行zone transfer过程中会用到UDP和TCP的53端口,这个我们下面的举例会详细介绍。 - SOA中的几个数值说明
例如:dns1.test.com. manager.test.com. 14 10800 3600 604800 800
dns1.test.com:test.com区的primary DNS。
manager.test.com:test.com区的管理员邮箱 manager@test.com
14:serial number当slave联系master服务器获取区域数据时,会首先请求SOA记录,并查看这个serial number是不是比master服务器的小,如果小就表示slave的区数据过时的,然后slave才会下载一份新的区域数据副本。所以管理员要是在master 服务器上手动维护zone文件,那么一定要在每次更新zone文件时更新这个serial number。有时候管理员习惯用YYYYMMDDNN来设置这个数值,YYYY代表年份,MM代表月份,DD代表天,NN代表当日区数据被修改的次数。
10800:更新间隔时间refresh,用于告知区域的slave间隔多长时间检查一次区数据是否有更新。
3600:重试时间retry,如果slave服务器在更新时间到来后无法访问其master服务器(估计是挂了),它会开始每隔这个重试时间尝试重新连接一次。通常这个时间比refresh时间短。
604800:过期时间expire,如果slave服务器在过期时间到来时无法联系到其master服务器,则slave就会使该区域失效。这个时候如果向slave查询相关域名的时候会应答SERVFAIL。理由是:与其提供旧的数据还不如不提供的好。
800:否定缓存时间negative caching TTL,否定响应NXDOMAIN在递归服务器上的缓存时间。
- 创建test.com的辅区
- 在slave节点的named.conf配置文件中创建test.com辅区,配置语句块如下。
zone "test.com" {
type slave;
masters { 192.168.3.160; };
file "/usr/local/bind/etc/test.com.zone";
};
master节点的named.conf中test.com区相关配置语句如下:
zone "test.com" {
type master;
allow-update { key mytest; };
allow-transfer { 10.1.40.129; }
file "/usr/local/bind/etc/test.com.zone";
};
===============================================
参考链接
源码安装问题报错汇总
bind9安装教程