首页 > 代码库 > DNS与BIND学习笔记-基础知识及配置详解

DNS与BIND学习笔记-基础知识及配置详解

转自 http://blog.chinaunix.net/uid-14825809-id-333591.html

 

标签:DNS 多线 智能 服务器 bind

一直想系统的学习和了解DNS的原理,包括看相关的rfc文件,一看和dns相关的rfc文件,妈呀,居然有86个之多。能看多少是多少吧。先把DNS的原理研究透彻了。在看rfc文件我想会事半功倍的:)

1. ICANN是干什么的?和他的一些相关资讯?

ICANN全称是叫:Internet Corporation for Assigned Names and Numbers(互联网名称与数字地址分配机构),是一个非盈利性的国际组织,负责互联网协议(IP)地址的空间分配,协议标示符的指派,通用顶级域名 (gTLD)以及国家和地区顶级域名(ccTLD)系统的管理,以及根服务器系统的管理。官方网址是:http://www.icann.org/。 除了几个大家熟知的顶级域:.com (商业公司).net(网络提供商).edu(教育机构).org(非盈利组织).gov(政府机构).int(国际性组织).mil(军事机 构).arpa(IP地址数的地位点)之外。ICANN还在2000年推出了7个新的通用顶级域:.aero , .biz , .coop , .info , .museum , .name , .pro 。

ICANN的作用:是负责协调管理DNS各技术要素以确保普遍可解析性,使所有的互联网用户都能够找到有效的地址。它是通过监督互联网运作当中独特的技术标示符的分配以及顶级域名的授权来做到这点的。

2. 能不能注册com.com这样的域名?

这在过去是被禁止的,包括所有的顶级域的组合,但是现在已经可以了,可以用whois查看结果:

Domain Name: com.com

Registrar Name: Alldomains.com
Registrar Whois: whois.alldomains.com
Registrar Homepage: http://www.alldomains.com

Administrative Contact:
Host Master
(NIC-1500677)
CNET Networks, Inc
235 Second Street
San Francisco
CA
94105
US
hostmaster@cnet.com
+1.4153442000
Fax- +1.4153442000
Technical Contact, Zone Contact:
Host Master
(NIC-1500677)
CNET Networks, Inc
235 Second Street
San Francisco
CA
94105
US
hostmaster@cnet.com
+1.4153442000
Fax- +1.4153442000

Created on…………..: 1995-Apr-13.
Expires on…………..: 2013-Apr-14.
Record last updated on..: 2003-Sep-22 00:11:40.

Domain servers in listed order:

NS.CNET.COM         216.239.126.10
NS2.CNET.COM       206.16.0.71

从资料以及ip地址可以得出这是一个美国加州的组织(个人)注册了这个域名。佩服阿!这也被你小子抢掉了。记得有这样一个案例:科罗拉多州有个家伙把所有的滑雪场的域名都抢注了,然后再把它们倒卖给滑雪场,赚了一大笔阿!!!我当时怎么就没有想到这样的好方法呢:(

3. 怎样注册一个二级域名?

访问http://www.apnic.net/(超级慢的网站)-> 然后填写域名注册表格 -> 确定一位技术联系人,一位管理联系人以及至少两台作为域名服务器的主机 -> 选择一个尚未使用的域名。

4. BIND的介绍?

BIND:全称是Berkeley Internet Name Domain(伯克利因特网名字域系统)。官方网址:http://www.isc.org/。 它主要有3个版本:BIND 4,BIND 8,BIND9。非常奇怪,他没有5,6,7这几个版本,一下子就跳到8了,这点和sendmail很像。一种说法是因为BIND8是和4.4BSD一起 发布的,因而所有的版本号都升到8。还有一种好玩的说法是因为:BIND8作者认为是一个意义重大的更新版本以至于不用2倍的老号码太对不起它了:)确实 在BIND8里融合了许多提高效率,稳定性和安全性的技术。而BIND9则增加了一些超前的理念:IPv6支持,公开密钥加密,多处理器支持,线程安全操 作,增量区传送等。BIND9是全部重新设计和实现的(崇拜一下)。不过配置基本相同(伟大)。

5. BIND的组成?

  • named守护进程–用来回答查询结果的
  • 去联系DNS分布式数据库的服务器用来解析主机查询的库例程
  • DNS的一些重要命令:nslookup,dig和host

6. BIND中名字服务器的分类以及区别:

  • 权威--一个区的正式代表
    • 主服务器:每个区都有的一个主名字服务器,保存着本区数据的正式拷贝。SA通过编辑这上面的数据文件来更改区数据。
    • 从服务器:每个区可以有多个从服务器(至少一个),它通过“区传送”操作从主服务器上获取它的数据。
    • 存根:类似于从服务器,不过不是必须的,它仅装载主服务器上的NS记录。
  • 非权威--从缓存中读取记录来回答查询,可能数据已过期
    • 高速缓存名字服务器:从一个文件中加载一些根服务器的地址,然后通过缓存由它解析的各个查询的回答来积累它的其余数据。它本身没有数据。
  • 递归--名字服务器要么是递归要么是不递归的。递归的含义是如果它不能回答你的查询,它将自己替你向上级进行查询,知道有结果(真实的结果或者错误的消息)。
  • 非递归--如果对于你的查询它能回答的,那么它将提供正确的响应,否则它将返回它所推荐的可能知道正确答案的其他域的权威性服务器。客户机必须准备接受并对这些推荐服务器进行操作。

7. DNS的工作方式是怎么样的?

named查询使用的是UDP协议和端口53。响应通过UDP返回,除非他们大于512K,这种情况使用TCP。服务器之间的“区传送”则都使用TCP。

  • 委托:所有的名字服务器都知道根服务器。而根服务器 又都知道gTLD,顺着这条链进一步往下,edu知道fudan.edu,com知道china.com…依次类推。实例:假设我希望从机器 marco.comp.fudan.edu查询机器cs.military.china.com,这里假设查询之前,除了根服务器的名称和IP地址之外没 有高速缓存任何这里需要用到的信息。顺序是这样的(主机marco询问它的本地名字服务器ns.comp.fudan.edu,而 ns.comp.fudan.edu是一个递归的名字服务器,因此,它将代替主机marco来查询。由于它不知道这个地址,且不知道有关 military.china.com或china.com甚至不知道.com的任何信息。不过它知道根域的一些服务器,根域知道有关.com的数据,因 此发送引用给ns.comp.fudan.edu,本地名字服务器随后就将查询发送到.com,返回一个china.com的推荐,同样重复发送查询到 china.com,返回military.china.com服务器的推荐,这样military.china.com对于这个查询信息是权威的,并返 回cs的地址。这样就完成了整个过程,哦,不对,还有一点,ns.comp.fudan.edu会在这个过程进行中告诉缓存主机cs的地址,同时缓存 了.com,china.com,military.china.com的服务器列表。
  • 高速缓存和效率:高速缓存机制在过去仅能用于肯定的 回答,如果找不到主机名则布包存这种实际情况。而RFC1034和RFC2308则先后定义并升级了用于否定告诉缓存的方案。在BIND8.2中是一个可 选功能,而在9中已经成为一个必选的功能了。它将保存一下否定类型的回答(其中前两种否定数据的类型缓存时间为1-3小时,其他类型缓存5分钟):
    • 没有与要查询的名称匹配的主机或域
    • 该主机不存在要查询的数据类型
    • 询问的服务器无响应
    • 因为网络问题,服务器不可达
  • 扩展的DNS协议:90年代末期,EDNS0(扩展 DNS,版本0)解决了今天的因特网中DNS协议的一些缺点。它允许发言人宣告其组装缓冲区大笑,可支持选项和通信协议版本。如果接受方的名字服务器以一 条错误消息作为响应,那么发送方就退回去使用原来的DNS协议。BIND9在服务器和解析器中都实现了EDNS0。^_^。

8. resolv.conf文件
unix系统上都会有这样一个文件,如果要使用DNS则必须要设置这个文件。(当然你可能在某些系统上修改/etc/nsswitch.conf,告诉它使用DNS而不是NIS。具体位置是:/etc/resolv.conf,它的格式是:
search 域名
nameserver IP地址
主要讲的就是“search 域名”的作用,在老版本BIND中是使用“domain”这个关键字的。它列出了如果某主机名不完整的时候,自动补上后面所写的域名。如我在文件中加入 “search com.”那么重启network,只需要ssh china,就等于ssh china.com这个命令。
而nameserver最多只能列出三个,而且必须要是递归服务器才可以。

9. BIND服务器配置
BIND非常消耗内存。它的数据库都保留在内存中,所以随着named进程的运行,高速缓存会逐渐增大。不过BIND9支持多线程并且可以充分利用多处理 器系统,还包括控制named资源使用的配置选项。新版本的BIND启动,停止用了新的命令:ndc start|stop|restart|status 。而不是以前的init.d中的脚本了。
配置文件:named.conf
每条语句以分号结束。格式非常重要少一个空格或者少一个分号就会让你郁闷1小时:( ,每条语句以一个标示语句类型的关键词开始。
option语句:指定全局选项,在BIND8中大约有30个选项,9的选项超过50个。这里只介绍常用的。格式如下:
options{
option;
option;

};
version “string”; [服务器的真实版本号] #可以将它真实地版本号隐藏
directory “path”; [启动服务器的目录] #可以让named程序cd到这个目录(绝对路径)中。推荐将所有与BIND相关的配置文件(除了named.conf和resolv.conf)放在/var之下的子目录中。例如/var/named
notify yes | no; [yes]  #如果设为yes,并且named是一个或多个区的主服务器,那么每当区数据库有变化时,将自动通知相应区的从服务器。
recursion yes | no; [yes]  #指定named是否代表客户机查询其它名字服务器。
allow-recursion {address_match_list}; [所有主机] #可以结合上面的选项设置成对自身的客户机允许递归,但对外查询禁止递归
allow-query {address_match_list}; [所有主机]  #指定哪些主机(或网络)可以查询这台名字服务器。
allow-transfer {address_match_listh}; [所有主机]  #指定哪些主机(或网络)可以请求区数据的块传输。
blackhole {address_match_list}; [空]  #标示出您从不希望与之进行通信的服务器,named将不接受来自这些服务器的查询,也不会向他们询问答案。

acl语句:它必须是named.conf中的顶级语句。
acl acl_name{
address_match_list
};
其中,有4个列表是预先定义的:any,localnets,localhost,none

zone语句:是named.conf中的核心语句。将告诉named它具有权威性的区域。并为管理每个区设置适当的选项。zone语句格式根据named在(主服务器,从服务器)中所扮演的角色不同而不同。
1. 配置一个区的主服务器
zone “domain_name”{
type master;
file “path”;
allow-query {address_match_list};      [所有]
allow-transfer {address_match_list};   [所有]
allow-update {address_match_list};     [无]
ixfr-base “pat”;                       [domain_name.ixfr(仅版本8)]
};

2. 配置一个区的从服务器:正常情况下,从服务器会保留区数据库的一个完整的副本。不过,如果服务器的类型设置为stub,而不是slave,那么将只传送NS记录。
zone “domain_name”{
type slave | stub;
file “path”;
ixfr-base “path”;                  [仅版本8]
masters {ip_addr; ip_addr; …};   [无默认值]
allow-query {address_match_list};  [所有]
allow-transfer {address_match_list};  [所有]
};

3. 设置一个转发区:如果您的组织和其它组织或公司有战略合作关系,并且希望绕过标准的查询路径,直接把流量汇聚到该公司的名字服务器上,则可以使用forward区,您可以使用这样的安排来访问对外界不可见的名字服务器。
zone “domain_name”{
type forward;
forward only | first;
forwarders {ip_addr; ip_addr; …};
};

10. 什么是DNS数据库?有什么用?
一个域的DNS数据库是由该域的主名字服务器的系统管理员维护的一个文本文件集合。这些文本文件成为区文件。就是你在”named.conf”中定义的file。
他们包括2种类型的项:分析器命令(如$ORIGIN和$TTL)和资源记录(Resource Records)。资源记录是数据库的真实地部分,而分析器命令只是提供输入记录的一些简便途径。
资源记录的基本格式:
[name] [ttl] [class] type data
name字段:表示一个主机或者一个域。我经常在配置文件中看到“@”,其实就是代表本域,可以写全。待会实验中作测试。
ttl字段:以秒为单位,和TCP/IP中的ttl差不多含义,就是存活时间,只是网络中ttl是指跳数(好像是这样)。在BIND9中,要用$TTL指令,而在8里面,则没有这个指令。一般将存活时间设为一周,这样,可以明显减少网络流量和DNS的负载。
class字段:一般都使用“IN”,对应的是internet。
type字段:有SOA,A,NS,PTR,MX,CNAME等,我待会会详细看这些类型。
data字段:根据type字段不同而不同。
一般,一个区的资源记录写在最前面,然后是NS记录,其他顺序可以任意。
下面我将列出来一些经常用到的记录。并且结合实例说明。
(1)SOA记录:每个区仅有一个SOA记录,该区一直延伸到遇见另一个SOA记录为止。SOA记录包括区的名字,一个技术联系人和各种不同的超时值。下面是例子:
; 在named.conf中指定的zone语句中指定的名字。假设为marco.fudan.edu
@ IN SOA ns.marco.fudan.edu. admin.marco.fudan.edu. (
20040701    ;Serial
8H          ;Refresh, 8 hours
1H          ;Retry,   1 hour
2W          ;Expire,  2 weeks
1D )        ;Minimum, 4 days
详细说明:
“@”是当前区名的简写。在这里可以用marco.fudan.edu.代替(千万不可忘了最后的”.”,后面也是)。它的值是在named.conf文件中的zone语句中指定的名字;可以在这个区文件中使用$ORIGIN分析器指令进行更改。
这里没有ttl字段。
class当然是IN了。
ns.marco.fudan.edu.是该区的主名字服务器(注意后面的”.”哦)
admin.marco.fudan.edu.是域管理员的邮箱,要把第一个”.”换成”@”,并且舍弃最后一个”.”才行。
圆括号不能乱放,用来让SOA记录跨越好几行。不过在9中可以随便放。做实验时测试。
第一个数值Serial代表这个区的序列号。可以供从服务器判断何时获取新数据的。这里我设成今天的日期。更新数据文件必须要更新这个序列号,否则从服务器将不更新。切记!!!
第二个数值Refresh指定多长时间从服务器要与主服务器经行核对。(当然现在有了notify这个参数,一旦更新了主服务器,将立即通知从服务器进行更新,那这个参数有什么用呢?用来当notify参数关闭时…嘻嘻)
第三个数值Retry代表如果从服务器试图检查主服务器的序列号时,主服务器没有响应,则经过这个时间后将重新进行检查。
第四个数值Expire将决定从服务器在没有主服务器的情况下权威地持续提供域数据服务的时间长短
第五个数值Minimum指高速缓存否定回答的存活时间。可能指客户机如果要解析某台服务器的ip,而这台服务器是不代表客户查询的存活时间。
$TTL,expire和minimum参数最终决定使用DNS的每个人放弃旧数据值。

(2)NS记录:识别对一个区有权威性的服务器(即所有主服务器和从服务器),并把子域委托给其他机构。
格式为:
zone [ttl] IN NS hostname
例如:
marco.fudan.net. IN NS ns.marco.fudan.net.

marco.fudan.net. IN NS anchor.marco.fudan.net.

marco.fudan.net. IN NS ns.marco.tj.net.

(3)A记录:是DNS数据库的核心。他们提供了以前在/etc/hosts文件中指定的主机名到IP地址的映射。一个主机必须为它的每个网络接口得到一条A记录。
格式为:
hostname [ttl] IN A ipaddr
例如:
anchor IN A 192.168.1.10
表示anchor.marco.fudan.net.的ip为192.168.1.10

(4)PTR记录:从ip地址到主机名的反向映射。与A记录一样,必须为每个网络接口有一条PTR记录。
先介绍in-addr.arpa:这下面的域的命名类似于反向字节顺序的IP地址。例如,我们的243子网的区是243.151.128.in-addr.arpa。
格式为:
addr [ttl] IN PTR hostname
例如,在243.151.128.in-addr.arpa区中与anchor的A记录相对应的PTR记录为:
100 IN PTR auchor.marco.fudan.net.

(5)MX记录:电子邮件系统就是使用MX记录来更有效的路由邮件。
格式为:
name [ttl] IN MX preference host …
例如:
(1)除非停机否则自己接收邮件。这里列出了3个,当前2个都停机时,将发送给第三个。而第3个必须写全,因为他不是默认域的成员。
yuyu IN MX 10 yuyu
IN MX 20 mailbox
IN MX 50 lpq.com.
(2)自己不接收邮件
yuyu IN MX 10 mailbox
IN MX 20 anchor
IN MX 50 lpq.com.
说明一点,中间的优先级自己定,中间隔开一点是为了将来能够插入新的主机而不用重新编号。

(6)CNAME记录:为主机分配额外的名字。用来缩短一个长主机名或者用来和某种功能联系起来。
格式为:
nickname [ttl] IN CNAME hostname
当BIND遇到一条CNAME记录时,它就会停止对该昵称的查询,并切换到真实的名称。并且注意,如果一台主机引用了别名,那么他的A,NS,MX等都必须用真实名称。
例如:
colo-gw IN A 128.138.243.25
colo IN CNAME colo-gw
www IN CNAME colo

其余的诸如LOC记录,SRV记录,TXT记录,IPv6资源记录,A6记录,DNAME记录等我认为自己几乎用不到,即使用到了再查也可以,不用去用心记住这些并不常用的记录。也根本记不住:(


11. 更新区文件的步骤是什么?
如果你对某个区做了一次更改时,你就要做:
(1)主服务器上的数据文件必须更新
(2)必须增加区的SOA记录中的系列号
(3)运行ndc reload,发信号通知named实施这些更改
(4.a)如果notify是打开的,则从服务器会马上更新更新后的区数据。
(4.b)如果notify是关闭的,则需要等SOA记录中的refresh后才能得到新的区数据,或者在从服务器上运行ndc reload

假设我是搭建在内部局域网中的一个DNS(仅用测试嘛~)。

1. 第一步肯定是要规划一下自己域内的DNS该怎么配!
希望配置到my.net的主域名服务器为10.1.1.198。而marco.my.net是公司的web和ftp服务器,它的ip是10.1.1.201。yuyu.my.net是mail server指向10.1.1.202

2. 根据上面的想法配置/etc/named.conf
options {
version “4.0.0″;
directory “/var/named”;
pid-file “/var/named/named.pid”;
};

zone “my.net” {
type master;
file “db.my.net”;
};

zone “0.0.127.in-addr.arpa” {
type master;
file “db.127.0.0″;
};

zone “1.1.10.in-addr.arpa” {
type master;
file “db.10.1.1″;
};

3. 根据配置文件写具体的DNS数据文件
(1) db.my.net
$TTL    86400

@   1D  IN SOA ns.my.net. root.my.net.  (
20040701 ;serial
3H       ;refresh
15M      ;retry
1w       ;expiry
1D )     ;minimum

@       IN NS ns.my.net.

ns      IN A 10.1.1.198
marco   IN A 10.1.1.201
yuyu    IN A 10.1.1.202

yuyu    IN MX 10 yuyu

www     IN CNAME marco
ftp     IN CNAME marco
mail    IN CNAME yuyu


说明:这些都是根据我前2天看书而配置的。因此配起来比较简单。首先先定义一个$TTL,因为我是用的9的版本。然后根据顺序分别记录SOA记录,NS记录,后面几个记录的顺序没有关系。

(2) db.127.0.0
$TTL    86400

@   1D  IN SOA ns.my.net. root.my.net.  (
20040701 ;serial
3H       ;refresh
15M      ;retry
1w       ;expiry
1D )     ;minimum

@       IN NS ns.my.net

1       IN PTR localhost
说明: 本来一开始我这里没有写NS记录.不过后来看log发现有这个的信息,虽然不影响正常使用,不过总看的不舒服,就加上了:)
错误信息:(/var/adm/messages)
Jul  2 11:36:01 marco named[597]: [ID 295310 daemon.warning] Zone “0.0.127.in-addr.arpa” (file db.127.0.0): no NS RRs found at zone top
Jul  2 11:36:01 marco named[597]: [ID 295310 daemon.warning] master zone “0.0.127.in-addr.arpa” (IN) rejected due to errors (serial 20040701)

(3) db.10.1.1
$TTL    86400

@ 1D IN SOA ns.my.net. root.my.net.  (
20040701 ;serial
3H       ;refresh
15M      ;retry
1w       ;expiry
1D )     ;minimum

@       IN NS ns.my.net.

198 IN PTR ns.my.net.
201 IN PTR marco.my.net.
202 IN PTR yuyu.my.net.
说明:这里和上面的db.127.0.0一样,最好也写上NS记录。还有这里记录的PTR记录最后别忘了“.”

(4) 万事ok,只待启动咯~~~
bash-2.03# ndc start
new pid is 676
最好tail /var/adm/messages一下,如果是出现下面的语句那说明至少配置文件的语法是正确的,named已经启动了:
Jul  2 12:54:43 marco named[675]: [ID 295310 daemon.notice] starting.  in.named BIND 8.2.2-P5 Thu Jan 29 07:06:27 PST 2004
Jul  2 12:54:43 marco   Generic Patch-5.8-January 2004
Jul  2 12:54:43 marco named[676]: [ID 295310 daemon.notice] Ready to answer queries.

(5) 设置/etc/resolv.conf,将nameserver设成10.1.1.198(就是ns.my.net)

(6) 用nslookup和dig进行测试。

最后说明:因为我这边是局域网内做测试,因此不需要hint类型。如果是正式DNS SERVER,则必须加上(在/etc/named.conf中添加一段)
zone “.” {
type hint;
file “named.root”;
};
然后执行命令:
bash-2.03# cd /var/named/
bash-2.03# dig @a.root-servers.net . ns > named.root
问题:我用的明明就是
bash-2.03# named -v
BIND 9.3.0rc1
但是为什么日志里显示出in.named BIND 8.2.2-P5?
难道in.named这个文件是bind 8.2.2-P5?

—来自网络

BIND9详解 (原创)

BIND9详解
作者:CBCHEN   11/13/2003

ISC的bind一直以来基本上都是DNS的工业标准,不过BIND一直是漏洞不断,直到出了BIND9,isc的开发人员对bind9进行了重写,才相对好了一点.
BIND9的安装就不用多说了,这里使用最新版本9,.2.3,说白了也就是需要named这个可执行文件就可以了,其他的配置文件完全可以自己来写.如 果需要进行服务的控制的话,则需要rndc这个文件了.named大约有4M多,strip一下也就1M多点,再裁减裁减完全可以做到400K的,做嵌入 式的朋友也不妨考虑考虑这个了.
服务的启动与停止可以完全自己来写一个脚本来控制,启动的话先判断是否已经启动,pidof named,如果已经启动,则提示已经启动,否则执行named –c /etc/named.conf,停止的时候先判断是否已经启动,是的话则killproc named,否的话提示没有启动,具体可在网上查找.
下面重点来说说BIND9的新功能.
Named.conf是bind9的最先读取的一个文件,named支持如下语句:
Acl
Controls
Include
Key
Logging
Lwres
Options
Server
Trusted-keys
View
Zone
其中主要的是acl,controls,include,logging,key,options,view,zone其他的很少用到我们就来详细的对这些进行解释一下.
Acl用来对bind的访问进行限制,是一个全局的设置,前面配置的acl在整个bind中都适用,和路由器里面的access-list有同工之处,语法是
acl acl-name {
address_match_list
};
其中的address match list是一个地址列表,如”192.168.0.0/24;”,记住最后一定得有分号,有多个的话中间用分号格开,如192.168.0.0/32;192.168.1.0/24;
bind内置了4个acl分别是:
any(不是all)        对应所有的,也就是0.0.0.0/0.
none        对应为空.
localhost        对应本地机器.
localnets        对应本地网络.

Controls主要用于对bind进行控制,如:
key “rndc-key” {
algorithm hmac-md5;
secret “VkMaNHXfOiPQqcMVYJRyjQ==”;
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { “rndc-key”; };
};
设置rndc控制的端口以及端口,keys用来设置控制的密钥,
include是一个非常有用的选项,如果需要写程序来读写bind的配置文件,这个将会用到,因为bind的配置文件很不规则,但是用了include后,就可以变的很规则,就和数据库一样了?,功用和c语言里面的include一样.
Options是用于设置bind的一些选项,我们将重点介绍,BING9支持的选项如下:
options {
blackhole { <address_match_element>;; … };
coresize <size>;;
datasize <size>;;
deallocate-on-exit <boolean>;; // obsolete
directory <quoted_string>;;
dump-file <quoted_string>;;
fake-iquery <boolean>;; // obsolete
files <size>;;
has-old-clients <boolean>;; // obsolete
heartbeat-interval <integer>;;
host-statistics <boolean>;; // not implemented
interface-interval <integer>;;
listen-on [ port <integer>; ] { <address_match_element>;; … };
listen-on-v6 [ port <integer>; ] { <address_match_element>;; … };
match-mapped-addresses <boolean>;;
memstatistics-file <quoted_string>;; // not implemented
multiple-cnames <boolean>;; // obsolete
named-xfer <quoted_string>;; // obsolete
pid-file <quoted_string>;;
port <integer>;;
random-device <quoted_string>;;
recursive-clients <integer>;;
rrset-order { [ class <string>; ] [ type <string>; ] [ name
<quoted_string>; ] <string>; <string>;; … }; // not implemented
serial-queries <integer>;; // obsolete
serial-query-rate <integer>;;
stacksize <size>;;
statistics-file <quoted_string>;;
statistics-interval <integer>;; // not yet implemented
tcp-clients <integer>;;
tkey-dhkey <quoted_string>; <integer>;;
tkey-gssapi-credential <quoted_string>;;
tkey-domain <quoted_string>;;
transfers-per-ns <integer>;;
transfers-in <integer>;;
transfers-out <integer>;;
treat-cr-as-space <boolean>;; // obsolete
use-id-pool <boolean>;; // obsolete
use-ixfr <boolean>;;
version <quoted_string>;;
allow-recursion { <address_match_element>;; … };
allow-v6-synthesis { <address_match_element>;; … };
sortlist { <address_match_element>;; … };
topology { <address_match_element>;; … }; // not implemented
auth-nxdomain <boolean>;; // default changed
minimal-responses <boolean>;;
recursion <boolean>;;
provide-ixfr <boolean>;;
request-ixfr <boolean>;;
fetch-glue <boolean>;; // obsolete
rfc2308-type1 <boolean>;; // not yet implemented
additional-from-auth <boolean>;;
additional-from-cache <boolean>;;
query-source <querysource4>;;
query-source-v6 <querysource6>;;
cleaning-interval <integer>;;
min-roots <integer>;; // not implemented
lame-ttl <integer>;;
max-ncache-ttl <integer>;;
max-cache-ttl <integer>;;
transfer-format ( many-answers | one-answer );
max-cache-size <size_no_default>;;
check-names <string>; <string>;; // not implemented
cache-file <quoted_string>;;
allow-query { <address_match_element>;; … };
allow-transfer { <address_match_element>;; … };
allow-update-forwarding { <address_match_element>;; … };
allow-notify { <address_match_element>;; … };
notify <notifytype>;;
notify-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
notify-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
also-notify [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>;
) [ port <integer>; ]; … };
dialup <dialuptype>;;
forward ( first | only );
forwarders [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>; )
[ port <integer>; ]; … };
maintain-ixfr-base <boolean>;; // obsolete
max-ixfr-log-size <size>;; // obsolete
transfer-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
transfer-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
max-transfer-time-in <integer>;;
max-transfer-time-out <integer>;;
max-transfer-idle-in <integer>;;
max-transfer-idle-out <integer>;;
max-retry-time <integer>;;
min-retry-time <integer>;;
max-refresh-time <integer>;;
min-refresh-time <integer>;;
sig-validity-interval <integer>;;
zone-statistics <boolean>;;
};
obsolete是已经过时的选项,这里不用考虑, not yet implemented是尚未完成的选项,这里也不用考虑,下面详细介绍这里面的有用选项:(注意,前面打”*”的为选项)
*blockhole 定义服务器不对查询进行反应的地址列表,也就是”黑名单”,比如说3721的ip段:218.244.44.0/24,当设置了黑名单后,对于这个段的请求查询,服务器将不会作出反应.
*directory 设置bind的数据文件的存放位置:如 directory “/var/named”.
*dump-file 设置当执行rndc dumpdb命令后的导出文件存放绝对路径,如果没有指定的话,缺省文件为named_dump.db,放在directory指定的目录下面.
*pid-file 设置bind的进程号pid文件.
*interface-interval 设置bind检查网卡变化的周期.
*forward 值有first和only两项, first则首先转发到”forwarders”中的服务器,然后自己查询,only则仅转发到 “转发服务器列表”中的服务器,不再自己查询
*forwarders设置转发服务器地址列表,语法同acl中的语法.
*listen-on 设置bind的绑定ip和端口,如listen-on 53 {192.168.0.1;};
*max-cache-size 设置最大缓存的大小,如max-cache-size 5M
*version 设置客户查询DNS版本好的返回信息,如果不想让客户探测到当前的版本好,就用这个好了,如version mydns1.0;
*auth-nxdomain 是否做为权威服务器回答域不存在(Auth-nxdomain)
如果设置为’yes’,则允许服务器以权威性(authoritatively)的方式返回NXDOMAIN(该域不存在)的回答,否则就不会作权威性的回答,缺省值为”是”.

*notify 在主服务器更新时是否通知辅助服务器(notify)
如果设置为”yes”,则在主服务器区域数据发生变化时,就会向在域的”域名服务器“中列出的服务器和“亦通知”中列出的服务器发送更新通知。这些服务器接受到更新通知后,就会向主服务器发送请求传输的消息,然后区域文件得以更新。

*recursion 是否允许递规查询(recursion)
如果设置为”yes”,则允许服务器采用递归的方式进行查询,也就是当要查询的地址不在服务器的数据库列表中时,服务器将一级一级的查询,直到查到为止。(一般对局域网都打开)
设置为”no”,并不意味着服务器对于请求的递归查询不给予回答,而是对于请求的递归查询,不再向上级服务器请求,也不缓存,如果不对请求的递归查询回答,可以清空缓存,然后设置为“NO”.
*allow-query 允许普通查询的地址列表(allow-query):
设置允许进行普通查询的ip地址列表,在域中的设置将覆盖全局设置,默认情况下是允许所有的地址进行普通查询.

*allow-recursion允许递归查询的地址列表(allow-recursion):
设置允许进行递归查询的ip地址列表,缺省值是允许所有地址进行查询,需要注意的是当设置了不允许递归查询后,如果仍然能够查询部分外部的域名,那是因为dns的缓存在起作用,将缓存清除以后就可以了.

*allow-transfer允许服务器进行区域传输的地址列表(Allow-transfer):
(注意的是视区和域中的设置将覆盖全局设置).

*allow-notify 允许更新通知的地址列表(allow-notify)
当服务器作为辅助服务器的时候,设置这个可以对收到的更新通知进行判断,只是接收该列表的更新通知.默认情况下,只是接收来自主服务器的更新通知。对于其他服务器的更新通知,会忽略掉.

*also-notify 更新时亦通知下列地址(also-notify):
设置发送更新通知的时候,不仅是域名服务器中列出的地址,亦通知此地址列表中的地址。

View(视)是bind9中提出的一个新概念,在这里可以理解为”从不同的眼光来看dns”,在这里”view”这个词可真是取的经典呀,具体而已,就是根据不同的源地址,目的地址,解析请求来判断该给客户提供什么样的解析.其语法如下:
view <string>; <optional_class>; {
match-clients { <address_match_element>;; … };
match-destinations { <address_match_element>;; … };
match-recursive-only <boolean>;;
key <string>; {
algorithm <string>;;
secret <string>;;
};
zone <string>; <optional_class>; {
type ( master | slave | stub | hint | forward );
allow-update { <address_match_element>;; … };
file <quoted_string>;;
ixfr-base <quoted_string>;; // obsolete
ixfr-tmp-file <quoted_string>;; // obsolete
masters [ port <integer>; ] { ( <ipv4_address>; |
<ipv6_address>; ) [ port <integer>; ] [ key <string>; ]; … };
pubkey <integer>; <integer>; <integer>; <quoted_string>;; //
obsolete
update-policy { ( grant | deny ) <string>; ( name |
subdomain | wildcard | self ) <string>; <rrtypelist>;; … };
database <string>;;
check-names <string>;; // not implemented
allow-query { <address_match_element>;; … };
allow-transfer { <address_match_element>;; … };
allow-update-forwarding { <address_match_element>;; … };
allow-notify { <address_match_element>;; … };
notify <notifytype>;;
notify-source ( <ipv4_address>; | * ) [ port ( <integer>; | *
) ];
notify-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>;
| * ) ];
also-notify [ port <integer>; ] { ( <ipv4_address>; |
<ipv6_address>; ) [ port <integer>; ]; … };
dialup <dialuptype>;;
forward ( first | only );
forwarders [ port <integer>; ] { ( <ipv4_address>; |
<ipv6_address>; ) [ port <integer>; ]; … };
maintain-ixfr-base <boolean>;; // obsolete
max-ixfr-log-size <size>;; // obsolete
transfer-source ( <ipv4_address>; | * ) [ port ( <integer>; |
* ) ];
transfer-source-v6 ( <ipv6_address>; | * ) [ port (
<integer>; | * ) ];
max-transfer-time-in <integer>;;
max-transfer-time-out <integer>;;
max-transfer-idle-in <integer>;;
max-transfer-idle-out <integer>;;
max-retry-time <integer>;;
min-retry-time <integer>;;
max-refresh-time <integer>;;
min-refresh-time <integer>;;
sig-validity-interval <integer>;;
zone-statistics <boolean>;;
};
server {
bogus <boolean>;;
provide-ixfr <boolean>;;
request-ixfr <boolean>;;
support-ixfr <boolean>;; // obsolete
transfers <integer>;;
transfer-format ( many-answers | one-answer );
keys <server_key>;;
edns <boolean>;;
};
trusted-keys { <string>; <integer>; <integer>; <integer>;
<quoted_string>;; … };
allow-recursion { <address_match_element>;; … };
allow-v6-synthesis { <address_match_element>;; … };
sortlist { <address_match_element>;; … };
topology { <address_match_element>;; … }; // not implemented
auth-nxdomain <boolean>;; // default changed
minimal-responses <boolean>;;
recursion <boolean>;;
provide-ixfr <boolean>;;
request-ixfr <boolean>;;
fetch-glue <boolean>;; // obsolete
rfc2308-type1 <boolean>;; // not yet implemented
additional-from-auth <boolean>;;
additional-from-cache <boolean>;;
query-source <querysource4>;;
query-source-v6 <querysource6>;;
cleaning-interval <integer>;;
min-roots <integer>;; // not implemented
lame-ttl <integer>;;
max-ncache-ttl <integer>;;
max-cache-ttl <integer>;;
transfer-format ( many-answers | one-answer );
max-cache-size <size_no_default>;;
check-names <string>; <string>;; // not implemented
cache-file <quoted_string>;;
allow-query { <address_match_element>;; … };
allow-transfer { <address_match_element>;; … };
allow-update-forwarding { <address_match_element>;; … };
allow-notify { <address_match_element>;; … };
notify <notifytype>;;
notify-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
notify-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
also-notify [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>;
) [ port <integer>; ]; … };
dialup <dialuptype>;;
forward ( first | only );
forwarders [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>; )
[ port <integer>; ]; … };
maintain-ixfr-base <boolean>;; // obsolete
max-ixfr-log-size <size>;; // obsolete
transfer-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
transfer-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
max-transfer-time-in <integer>;;
max-transfer-time-out <integer>;;
max-transfer-idle-in <integer>;;
max-transfer-idle-out <integer>;;
max-retry-time <integer>;;
min-retry-time <integer>;;
max-refresh-time <integer>;;
min-refresh-time <integer>;;
sig-validity-interval <integer>;;
zone-statistics <boolean>;;
};
其中match-clients,指的是view对应的源地址,match-destinations指的是view对应的目的地址, match-recursive-only指的是view对应是否仅仅是递归请求.
BIND在收到DNS的解析请求后,会首先判断该请求包的源地址和目标地址,然后根据视区里面的“match-clients”和”match- destinations”和” match-recursive-only”,判断是否属于第一个视区,符合的话就用第一个视区来进行解析,否则就判断下一个视区.然后再进行解析.如果 所有的视区都不能对应,则DNS将返回Query refused的消息
这样在防火墙的情况下,就有一个很好的解决办法了,比如一个典型的网络结构下,DMZ区全部在防火墙外网口上做的地址映射(DNAT),当DMZ区要访问 本地网络的时候,单纯用传统的域名解析的话,是无法达到要求的,因为防火墙无法同时又做SNAT和DNAT,比如DMZ地址192.168.0.14映射 到外部地址202.196.160.14,而域名服务器解析WWW.YOURDOMAIN.COM到202.196.160.14,则 192.168.0.0/24的网络将无法访问www.yourdomain.com,但是当用了VIEW后,你可以对来自该网络的解析请求将 WWW.YOURDOMAIN.COM直接解析到192.168.0.14,这样就可以访问了.
View里面可以包含zone,优先级是zone>;view>;options,zone里面的选项好多和options里面一样,不过它只是对本zone一样,同样view里面的选项也只是对本view有效.
Zone是bind的一个重要选项,不过关于zone网上的文章很多,在这里只是补充几点小技巧:
如何将域名直接解析为www服务器的地址,比如像freshmeat.net那样直接解析freshmeat.net为www.freshmeat.net,这里可以在域的数据文件里面增加一个这样的地址记录:
@           IN A 202.196.160.14
这样的主机记录就可以实现了,202.196.160.14为WWW服务器的ip地址.

常见故障释疑
1在用nslookup查询域的时候出现如下错误
*** Can’t find server name for address *.*.*.*: Non-existent domain
这种情况是没有对域名服务器本身做反向地址解析造成的,给域名服务器增加一条反向地址解析就可以了.
2在用nslookup时出现如下错误:
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
这种情况一般是在DNS进行递归查询的时候,超时造成的,可能是由于网络速度问题,也可能是路由等其他问题,或者对方域名服务器没有响应造成的.
3在用nslookup时出现如下错误:
*** dns.cbchen.com can’t find www.ite.com: Non-existent domain
这种情况一般是域中没有该地址记录或没有别名记录.
4 在用nslookup时出现如下错误:
***.server failed
一般是配置问题,请检测配置,或者是辅助域无法从主域中得到数据,再请求辅助域的时候会出现这种故障.

BIND的有用的网站:
http://www.isc.org/products/BIND/
http://www.isc.org/products/BIND/
强烈推荐BIND9解压目录下的/doc/arm管理员手册
其他第三方DNS服务器软件:
MaraDNS,安全的嵌入式DNS. http://www.maradns.org/
Oak DNS 用python写的,和bind的区域文件和cache兼容,地址:
http://www.digitallumber.com/oak
PowerDNS 一个仅支持认证的DNS,http://www.powerdns.org/
MYDNS以mysql作为后台的认证DNS,http://mydns.bboy.net/

DNS与BIND学习笔记-基础知识及配置详解