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,全部重新写过,免费(但是由商业公司资助),也添加了许多新的功能(但是安全上也可能有更多的问题)。BIND9在2000年十月份推出,现在稳定版本是9.3.2。

 软件的相关资源

官方网站: [url]http://www.bind.com/[/url]

最新版本: 9.3.2 [url]http://www.isc.org/sw/bind/bind9.3.php#download[/url]

帮助文档: [url]http://www.isc.org/sw/bind/[/url]

配置文件样例: [url]http://www.bind.com/bind.html[/url]

FAQ: [url]http://www.nominum.com/getOpenSourceResource.php?id=6[/url]
 配置环境

            环境: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  测试客户机

 配置文件说明

安装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

            };

 创建主域名服务器

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."。我们平时使用的信箱通常是“user@host”这样的格式,但因为@在 DNS 记录中是个保留字符,所以在 SOA 中就用“.”来代替了@。目前这个信箱是 "[email][email protected][/email]."。

接下来的 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     [url]www.mydebian.org.[/url]
            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<<- opcode: QUERY, status: NOERROR, id: 41793
            ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

            ;; QUESTION SECTION:
            ;mydebian.org.                  IN      A

            ;; ANSWER SECTION:
            mydebian.org.           604800  IN      A       192.168.102.47

            ;; AUTHORITY SECTION:
            mydebian.org.           604800  IN      NS      ns.mydebian.org.

            ;; ADDITIONAL SECTION:
            ns.mydebian.org.        604800  IN      A       192.168.102.47

            ;; Query time: 31 msec
            ;; SERVER: 192.168.102.47#53(192.168.102.47)
            ;; WHEN: Mon Aug 14 09:16:27 2006
            ;; MSG SIZE  rcvd: 79


            tonybox2:~# dig @192.168.102.47 ftp.mydebian.org

            ; <<>> DiG 9.3.2 <<>> @192.168.102.47 ftp.mydebian.org
            ; (1 server found)
            ;; global options:  printcmd
            ;; Got answer:
            ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63890
            ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

            ;; QUESTION SECTION:
            ;ftp.mydebian.org.              IN      A

            ;; ANSWER SECTION:
            ftp.mydebian.org.       604800  IN      A       192.168.102.48

            ;; AUTHORITY SECTION:
            mydebian.org.           604800  IN      NS      ns.mydebian.org.

            ;; ADDITIONAL SECTION:
            ns.mydebian.org.        604800  IN      A       192.168.102.47

            ;; Query time: 22 msec
            ;; SERVER: 192.168.102.47#53(192.168.102.47)
            ;; WHEN: Mon Aug 14 09:16:41 2006
            ;; MSG SIZE  rcvd: 83

反向查询

            tonybox2:~# dig @192.168.102.47 -x 192.168.102.47

            ; <<>> DiG 9.3.2 <<>> @192.168.102.47 -x 192.168.102.47
            ; (1 server found)
            ;; global options:  printcmd
            ;; Got answer:
            ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21885
            ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

            ;; QUESTION SECTION:
            ;47.102.168.192.in-addr.arpa.   IN      PTR

            ;; ANSWER SECTION:
            47.102.168.192.in-addr.arpa. 604800 IN  PTR     [url]www.mydebian.org.[/url]
            47.102.168.192.in-addr.arpa. 604800 IN  PTR     mail.mydebian.org.
            47.102.168.192.in-addr.arpa. 604800 IN  PTR     mydebian.org.

            ;; AUTHORITY SECTION:
            102.168.192.in-addr.arpa. 604800 IN     NS      mydebian.org.

            ;; ADDITIONAL SECTION:
            mydebian.org.           604800  IN      A       192.168.102.47

            ;; Query time: 33 msec
            ;; SERVER: 192.168.102.47#53(192.168.102.47)
            ;; WHEN: Mon Aug 14 09:17:00 2006
            ;; MSG SIZE  rcvd: 138

 纯缓存域名服务器

192.168.102.48 为我们的dns 缓存服务器,首先, 在在192.168.102.48 机器上安全bind9, 在配置前我们用dig 进行测试

            tonybox2:/etc/bind# dig @192.168.102.48 [url]www.mydebian.org[/url]

            ; <<>> DiG 9.3.2 <<>> @192.168.102.48 [url]www.mydebian.org[/url]
            ; (1 server found)
            ;; global options:  printcmd
            ;; Got answer:
            ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 34137
            ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

            ;; QUESTION SECTION:
            ;[url]www.mydebian.org.             [/url] IN      A

            ;; Query time: 1844 msec
            ;; SERVER: 192.168.102.48#53(192.168.102.48)
            ;; WHEN: Tue Aug  8 12:05:17 2006
            ;; MSG SIZE  rcvd: 34

修改named.conf.options文件

            tonybox2:/etc/bind# cat 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 {
                            192.168.102.47;  //主域名服务器的IP地址
                     };

                    auth-nxdomain no;    # conform to RFC1035

            };

然后再进行测试

            tonybox2:/etc/bind# dig @192.168.102.48 [url]www.mydebian.org[/url]

            ; <<>> DiG 9.3.2 <<>> @192.168.102.48 [url]www.mydebian.org[/url]
            ; (1 server found)
            ;; global options:  printcmd
            ;; Got answer:
            ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54332
            ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

            ;; QUESTION SECTION:
            ;[url]www.mydebian.org.             [/url] IN      A

            ;; ANSWER SECTION:
            [url]www.mydebian.org.      [/url] 604800  IN      A       192.168.102.47

            ;; AUTHORITY SECTION:
            mydebian.org.           604800  IN      NS      mydebian.org.

            ;; ADDITIONAL SECTION:
            mydebian.org.           604800  IN      A       192.168.102.47

            ;; Query time: 44 msec
            ;; SERVER: 192.168.102.48#53(192.168.102.48)
            ;; WHEN: Tue Aug  8 12:05:47 2006
            ;; MSG SIZE  rcvd: 80

所谓的 forwarder,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 查询请求的时候,将不直接向 "." zone 查询而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。

我们知道,当DNS服务器接到客户端主机的查询请求时,首先会检查这个查询是否属于本机管辖,否则将转向 "." zone 再逐级的查询下去,最后再把查询结果告诉客户端。

在这个过程之中,DNS服务器还会将查询到的结果存放到缓存中。只要缓存中的 TTL 没过期,在下次遇到同样查询的时候,就可以直接将结果响应给客户端,而无需再重复上次的查询流程。

如果DNS服务器上指定了forwarder,那这个DNS发现缓存中没有记录时,将不向 "." 查询,而是向 forwarder 送出同样的请求(转发),然后等待查询结果,即把逐级往下查询这个耗费精力的动作,交给 forwarder 负责。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,DNS服务器都会保存一份数据在缓存中。

这样,以后的相同查询就快多了,这对于DNS所服务的 客户端而言查询效率会提高很多。

            /var/named/named.ca
            dig @a.root-servers.net . ns > /var/named/named.ca

 辅助域名服务器

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