Linux中Bind9(dns)配置详解

发布时间:2019-11-02编辑:脚本学堂
Linux中Bind9配置详解

1、bind简介 
BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现,包括域名服务器 (named)、DNS解析库函数、DNS服务器运行调试所用的工具,是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护 的,按照ISC的调查报告,BIND是世界上使用最多最广泛的域名服务系统。不论你的邮件服务器,WEB服务器或者其他的services如何的安全可 靠,DNS的故障会给你带来用户根本无法访问这些服务。
BIND,也是我们常说的named,由于多数网络应用程序使用其功能,所以在很多BIND的弱点及时被发现。主要分为三个版本:

v4 
1998年多数UNIX捆绑的是BIND4,已经被多数厂商抛弃了,除了OpenBSD还在使用。OpenBSD核心人为BIND8过于复杂和不安全,所以继续使用BIND4。这样一来BIND8/9的很多优点都不包括在v4中。

v8 
就是如今使用最多最广的版本,其详细内容可以参阅 BIND 8+ 域名服务器安全增强

v9 
最新版本的BIND,全部重新写过,免费(但是由商业公司资助),也添加了许多新的功能(但是安全上也可能有更多的问题)。

2、软件的相关资源 
官方网站: http://www.bind.com/
最新版本: 9.3.2 http://www.isc.org/sw/bind/bind9.3.php#download
帮助文档: http://www.isc.org/sw/bind/
配置文件样例: http://www.bind.com/bind.html
FAQ: http://www.nominum.com/getOpenSourceResource.php?id=6

3、配置环境 
环境:GNU/linux Debian/testing Linux 2.6.8-2-386
版本:bind9  9.3.2-2
测试域名:mydebian.org
测试ip: 192.168.102.47  主域名服务器  
192.168.102.48  纯缓存域名服务器
192.168.102.49  辅助域名服务器
192.168.102.49  测试客户机

4、配置文件说明 
安装bind9的命令:
~# aptitude update
~# aptitude install bind9 bind9-host dnsutils
配置文件族:
# ls /etc/bind/ -l
total 44
-rw-r--r-- 1 root root  237 Jan 16  2006 db.0
-rw-r--r-- 1 root root  271 Jan 16  2006 db.127
-rw-r--r-- 1 root root  237 Jan 16  2006 db.255
-rw-r--r-- 1 root root  353 Jan 16  2006 db.empty
-rw-r--r-- 1 root root  256 Jan 16  2006 db.local
-rw-r--r-- 1 root root 1507 Jan 16  2006 db.root
-rw-r--r-- 1 root bind 1611 Jan 16  2006 named.conf
-rw-r--r-- 1 root bind  165 Jan 16  2006 named.conf.local
-rw-r--r-- 1 root bind  672 Jan 16  2006 named.conf.options
-rw-r----- 1 bind bind   77 Aug  4 08:41 rndc.key
-rw-r--r-- 1 root root 1317 Jan 16  2006 zones.rfc1918

配置文件说明
named.conf 
设置一般的named参数,指向该服务器使用的域数据库的信息源
named.conf.options 
全局选项
db.root 
根服务器指向文件, 由Internet NIC创建和维护, 无需修改, 但是需要定期更新
db.local 
localhost正向区文件,用于将名字localhost转换为本地回送IP地址 (127.0.0.1)
db.127 
localhost反向区文件,用于将本地回送IP地址(127.0.0.1)转换为名字localhost
其中,主配置文件/etc/named.conf的配置语句 
 命令  用法 
 acl   定义IP地址的访问控制清单 
 control       定义ndc使用的控制通道 
 include       把其他文件包含到配置文件中 
 key   定义授权的安全密钥 
 logging       定义日志写什么,写到哪 
  opitons       定义全局配置选项和缺省值  
 server定义远程服务器的特征 
 trunsted-keys 为服务器定义DNSSEC加密密钥 
 zone  定义一个区
默认情况下, 内容如下:
 

复制代码 代码如下:
include "/etc/bind/named.conf.options";
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
include "/etc/bind/named.conf.local";
 

其中type项的值:
master:表示定义的是主域名服务器 
slave :表示定义的是辅助域名服务器 
hint:表示是互联网中根域名服务器 
在Debian环境中,options语句的配置内容, 被移至named.conf.options文件中:
 

复制代码 代码如下:
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you might need to uncomment the query-source
// directive below.  Previous versions of BIND always asked
// questions using port 53, but BIND 8.1 and later use an unprivileged
// port by default.
// query-source address * port 53;
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
//      0.0.0.0;
// };
auth-nxdomain no;    # conform to RFC1035
};

5、 创建主域名服务器 
a. 首先, 在在192.168.102.47机器上安全bind9

b. 使用编辑器,比如vi, 编辑配置文件/etc/bind/named.conf
加入如下内容
 

复制代码 代码如下:
zone "mydebian.org" {
type master;    //定义此区为主服务器
file "/etc/bind/db.mydebian";   指定区资源文件的位置
};
zone "102.168.192.in-addr.arpa" {
type master;    //定义此区为主服务器
file "/etc/bind/db.192";//指定区资源文件的位置
};

c. 创建区资源文件:
创建区资源文件/etc/bind/db.mydebian内容如下
 

复制代码 代码如下:
;
; BIND data file for local loopback interface
;
$TTL    604800
$ORIGIN mydebian.org.
@       IN      SOA     mydebian.org. root.mydebian.org. (
2006080401      ; Serial
 604800 ; Refresh
  86400 ; Retry
2419200 ; Expire
 604800)       ; Negative Cache TTL
;
IN      NS      ns
IN      MX      0       mail.mydebian.org.
@       IN      A       192.168.102.47
ns      IN      A       192.168.102.47
www     IN      A       192.168.102.47
webserver       IN      CNAME   www
mail    IN      A       192.168.102.47
ftp     IN      A       192.168.102.48
ns2     IN      A       192.168.102.48
ns3     IN      A       192.168.102.49
 

第一行是TTL设定,生存时间记录字段。它以秒为单位定义该资源记录中的信息存放在高速缓存中的时间长度。这里定义为604800秒,也就是1周.
第二行是$ORIGIN设定,说明下面的记录出自何处.请您加倍留意最后的一个小小数点"."
然后,第三行,是一个 SOA 记录的设定,在这里我们看到一个特殊字符 @ ,它就是 ORIGIN 的意思,也就是刚刚所定义的$ ORIGIN mydebian.org. 的内容,您可以写成 mydebian.org. 也可以用 @ 来代替。
假如这个文件前面没有定义 $ ORIGIN 的话, 那這个 @ 的值就以 named.conf 里的 zone . 
接着 SOA 后面,指定了这个区域的授权主机和管理者的信箱,这里分别是"mydebian.org." 和"root.mydebian.org."。我们平时使用的信箱通常是
[email=“user@host]“user@host[/email]
”这样的格式,但因为@在 DNS 记录中是个保留字符,所以在 SOA 中就用“.”来代替了@。目前这个信箱是 "root@mydebian.org."。 

接下来的 SOA 设置,是被括在“()”之间的 5 组数字,主要作为和 slave 服务器同步 DNS 资料所使用的资料: 
Serial: 其格式通常会是“年月日+修改次序”(但也不一定如此,您自己能够记得就行)。当 slave 要进行资料同步的时候,会比较这个号码。如果发现在这里的号码比它那边的数值“大”,就进行更新,否则忽略。不过设 serial 有一个地方您要留意:不能超过 10 位数字!
Refresh:这里是是告诉 slave 要隔多久要进行资料同步(是否同步要看 Serial 的比较结果)。
Retry:如果 slave 在进行更新失败后,要隔多久再进行重试。
Expire:这是记录逾期时间:当 slave 一直未能成功与 master 取得联系,那到这里就放弃 retry,同时这里的资料也将标识为过期( 
expired)。

Minimum:这是最小默认 TTL 值,如果您在前面没有用“$TTL”来定义,就会以此值为准。 
请 注意:SOA 记录中这对 “ () ”符号之第一个 “ (”括号一定要和 SOA 写在同一行,而不能用 Enter 断行到下一行去,而且其左边最好有一个空格键或 tab 建。而最后一个 “)”括号也不能写在注解符号 “ ;”的右边。 置 DNS 的 RR 记录档,其格式要求非常严格,我们丝毫不能掉以轻心。比方说:如果句子不是以空格键、Tab 键、 或注解符号 (;)开头,也不在 SOA 的 “ () ”之内, 则表示要定义一个“新记录项 (Entry) ”;如果句子是以空格键或 tab 键开始的话,其设置被视为上一个“记录项”的内容。所以,如果您要为“同一个记录项”定义多个记录设置,而不想重复打字,您倒可以偷懒:在接着它的后面几 行用空白或 Tab 来缩排就可以了。
NS表明负责mydebian.org.这个域的Name Server是mydebian.org这台主机。
MX记录标明发往mydebian.org域的邮件由mail.mydebian.org这台服务器接收。
A记录标明了IP地址和域名之间的对应关系

接下来创建该区的反向映射资源文件
/etc/bind/db.192内容如下:
 

复制代码 代码如下:
;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     mydebian.org. root.mydebian.org. (
2006080401      ; Serial
 604800 ; Refresh
  86400 ; Retry
2419200 ; Expire
 604800)       ; Negative Cache TTL
;
@       IN      NS      mydebian.org.
47      IN      PTR     mail.mydebian.org.
47      IN      PTR     www.mydebian.org.
47      IN      PTR     ns.mydebian.org.
48      IN      PTR     ftp.mydebian.org.
48      IN      PTR     ns2.mydebian.org.
49      IN      PTR     ns3.mydebian.org.
 

其中PTR记录用来解析IP地址对应的域名

d. 重启DNS服务
/etc/init.d/bind9 restart
此时查看系统日志,可了解BIND的启动情况,比如如下输出,则说明引导正常
tonybox:~# tail /var/log/syslog
Aug 14 08:36:45 localhost named[2792]: zone 127.in-addr.arpa/IN: loaded serial 1
Aug 14 08:36:45 localhost named[2792]: zone 102.168.192.in-addr.arpa/IN: loaded serial 2006080801
Aug 14 08:36:45 localhost named[2792]: zone 255.in-addr.arpa/IN: loaded serial 1
Aug 14 08:36:45 localhost named[2792]: zone localhost/IN: loaded serial 1
Aug 14 08:36:45 localhost named[2792]: zone mydebian.org/IN: loaded serial 2006080801
Aug 14 08:36:45 localhost named[2792]: running
Aug 14 08:36:45 localhost named[2792]: zone mydebian.org/IN: sending notifies (serial 2006080801)
Aug 14 08:36:45 localhost named[2792]: zone 102.168.192.in-addr.arpa/IN: sending notifies (serial 2006080801)
Aug 14 08:36:45 localhost named[2792]: client 192.168.102.47#1030: received notify for zone 'mydebian.org'
Aug 14 08:36:45 localhost named[2792]: client 192.168.102.47#1030: received notify for zone '102.168.192.in-addr.arpa'

e. 在客户机上的设置
# cat /etc/resolv.conf
search mydebian.org
nameserver 192.168.102.47

f. 测试:
使用nslookup 测试
tonybox2:~# nslookup
> set type=any
> mydebian.org
Server: 192.168.102.47
Address:192.168.102.47#53
mydebian.org
origin = mydebian.org
mail addr = root.mydebian.org
serial = 2006080801
refresh = 604800
retry = 86400
expire = 2419200
minimum = 604800
mydebian.org    nameserver = ns.mydebian.org.
mydebian.org    mail exchanger = 0 mail.mydebian.org.
Name:   mydebian.org
Address: 192.168.102.47
使用dig测试
tonybox2:~# dig @192.168.102.47 mydebian.org
; > DiG 9.3.2 > @192.168.102.47 mydebian.org
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER> DiG 9.3.2 > @192.168.102.47 ftp.mydebian.org
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER> DiG 9.3.2 > @192.168.102.47 -x 192.168.102.47
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER> DiG 9.3.2 > @192.168.102.48 www.mydebian.org
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER> DiG 9.3.2 > @192.168.102.48 www.mydebian.org
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER /var/named/named.ca

7、 辅助域名服务器 
a. 192.168.102.49 为我们的dns 缓存服务器,首先, 在在192.168.102.49 机器上安全bind9,

b. 在主配置文件/etc/named.conf中加入如下内容:
 

复制代码 代码如下:
zone "mydebian.org" {
type slave;
file "/etc/bind/slaves/db.mydebian";
masters {192.168.102.47;};
};
zone "102.168.192.in-addr.arpa" {
type slave;
file "/etc/bind/slaves/db.192";
masters {192.168.102.47;};
};
 

type后面的值已经成为slave; 表示定义的是辅助域名服务器 
file 后面也可以是别的文件名不必与主域DNS服务器的设置一样 
masters 后为主域DNS服务器的IP地址, 可以是多个IP,型如
masters {ip1;ip2;ip3;};

c. 创建/etc/bind/slaves/目录
tonybox2:/etc/bind# mkdir slaves
tonybox2:/etc/bind# chown bind.bind slaves

d. 重启dns服务
tonybox2:/etc/bind/slaves# /etc/init.d/bind9 restart
named进程第一次启动时,辅助域名服务器就下载主域名服务器的信息;辅助域名服务器根据主域名服务器的对应SOA记录规定的刷新时间间隔,去主域名服务器查询相关信息。
tonybox2:/etc/bind/slaves# ls -l
total 8
-rw-r--r-- 1 bind bind 410 2006-08-08 12:23 db.192
-rw-r--r-- 1 bind bind 430 2006-08-08 12:23 db.mydebian
查看 /etc/bind/slaves 目录,我门会发现已经从主域名服务器获取了相应的资源文件
如果用户bind对于/etc/bind/slaves目录没有写权限, 则查看 /var/log/syslog 会出现如下类似错误:
tonybox:~# tail /var/log/syslog
Aug  8 12:30:09 tonybox2 named[3849]: zone mydebian.org/IN: Transfer started.
Aug  8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: connected using 192.168.102.15#1075
Aug  8 12:30:09 tonybox2 named[3849]: dumping master file: /etc/bind/tmp-VHTxU6CT5n: open: permission denied
Aug  8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: failed while receiving responses: permission denied
Aug  8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: end of transfer
Aug  8 12:30:10 tonybox2 named[3849]: zone 102.168.192.in-addr.arpa/IN: Transfer started.
Aug  8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: connected using 192.168.102.15#1076
Aug  8 12:30:10 tonybox2 named[3849]: dumping master file: /etc/bind/tmp-dxbiD1JtTK: open: permission denied
Aug  8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: failed while receiving responses: permission denied
Aug  8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: end of transfer