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/


相關文章
相關標籤/搜索