Ubuntu下Bind9的配置文件说明

BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现,包括  python

1.域名服务器 (named)   mysql

2.DNS解析库函数   git

3.DNS服务器运行调试所用的工具  sql

是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护的,  按照ISC的调查报告,BIND是世界上使用最多最普遍的域名服务系统。不论你的邮件服务器,WEB服务器或者其余的services如何的安全可靠,DNS的故障会给你带来用户根本没法访问这些服务。  BIND,也是咱们常说的named,因为多数网络应用程序使用其功能,因此在不少BIND的弱点及时被发现。主要分为三个版本:  数据库

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

2.v8就是现在使用最多最广的版本,其详细内容能够参阅 BIND 8+ 域名服务器安全加强 缓存

3.v9最新版本的BIND,所有从新写过,免费(可是由商业公司资助),也添加了许多新的功能(可是安全上也可能有更多的问题)。BIND9在2000年十月份推出,如今稳定版本是9.3.2。 安全

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,否的话提示没有启动,具体可在网上查找.
网络

重配置文件说明: 

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是bind9的最早读取的一个文件,他的配置语句

acl           定义IP地址的访问控制清单   

control       定义ndc使用的控制通道    

include       把其余文件包含到配置文件中   

key           定义受权的安全密钥    

logging       定义日志写什么,写到哪     

opitons       定义全局配置选项和缺省值    

server        定义远程服务器的特征  

trunsted-keys 为服务器定义DNSSEC加密密钥   

zone          定义一个区点
另外还支持:
Lwres
View
其中主要的是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是还没有完成的选项,这里也不用考虑,下面详细介绍这里面的有用选项:(注意,前面打”*”的为选项)

*directory 设置bind的数据文件的存放位置:如 directory “/var/named”.
*dump-file 设置当执行rndc dumpdb命令后的导出文件存放绝对路径,若是没有指定的话,缺省文件为named_dump.db,放在directory指定的目录下面.
*pid-file 设置bind的进程号pid文件.
*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):
设置发送更新通知的时候,不只是域名服务器中列出的地址,亦通知此地址列表中的地址。

*interface-interval 设置bind检查网卡变化的周期.

*blockhole 定义服务器不对查询进行反应的地址列表,也就是”黑名单”,好比说3721的ip段:218.244.44.0/24,当设置了黑名单后,对于这个段的请求查询,服务器将不会做出反应.

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/downloads/bind/
https://wiki.debian.org/Bind9
强烈推荐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/


相关文章
相关标签/搜索