2007年6月6日 星期三

BIND 9 - view

BIND 在第九版以後 , 新增了 view 的功能 .

view 主要是要讓您的 DNS Server 可以 "見人說人話 , 見鬼說鬼話" .




為什麼要 "見人說人話 , 見鬼說鬼話" ???   
這不合我 "正直" 的個性 , 違背我 "誠信" 的原則 ........


其實不是這樣啦 !
不須要騙人或者是騙鬼啊 !
只是人聽到人話就好 , 不用聽到鬼話 ! 相同的 , 鬼也不要出來見人 !
這樣 , 不是單純多了 ?
畢竟 , 人鬼殊途 , 交流太多 , 對大家都不好 , 不是嗎 ?



混版面啊 !?    又沒版費 !  請回歸主題 .
到底什麼狀況下要用到這個 "view" 的功能呢 ?




舉幾個例子 :

一 .  公司網頁 www.test.com.tw
        公司對外 IP 是 1.2.3.4 ,
        公司內部利用 nat 上網 ,
        Web Server 是用內部 IP 192.168.0.10 .
        DNS RR ==>  www.test.com.tw.   IN   A   1.2.3.4


        在公司外連公司網頁沒問題 , 但若有一台公司內 Client 192.168.0.101 要連呢 ?
        若這台 Client 向 DNS Server 查到 www.test.com.tw 的 IP 為 1.2.3.4 ,
        那 Client 會向 1.2.3.4 要求 port 80 連線 ,
        然後 NAT Server 將此封包 DNAT 給 192.168.0.10 .
        而路由發現這個封包來源及目的都在同一網段 ,
        直接連線即可 , 並不須要遶到這個路由 .
        於是發出了一個 Host Gateway Redirect 訊息的 ICMP 封包 .
        Web Server 收到這個連線要求後 , 將回應的封包送直接送到 192.168.0.101,
        結果是 .... 這台發出連線要求的 Client 拒絕來自 192.168.0.10 的回應封包 .
        因為 Client 是向 1.2.3.4 要求連線 , 所以它一直等待 1.2.3.4 的回應 ,
        而 Web Server 192.168.0.10 給他的回應封包 , Client 認為它是非法的 , 所以中止它 .
        而 Client 一直等不到 1.2.3.4 的回應 , 重送幾次封包後 , 就會顯示無法連線 .

        若一開始向 DNS Server 查到的 IP 為 192.168.0.10 , 就不會有這問題 .
        架兩台 DNS Server 分別服務內部外部的用戶端 , 是解決這個問題的方式之一 .





二 .  公司有兩條對外線路 ,
        線路A 的 IP 是 1.2.3.4 , 80 port DNAT 給 Web Server 192.168.0.10 .
        線路B 的 IP 是 5.6.7.8 , 提供 SNAT 做 192.168.0.0/24 的 Default Gateway .
        DNS RR ==>  www.test.com.tw.   IN   A   1.2.3.4


        在公司外連公司網頁沒問題 , 但若有一台公司內 Client 192.168.0.101 要連呢 ?
        若這台 Client 向 DNS Server 查到 www.test.com.tw 的 IP 為 1.2.3.4 ,
        那 Client 會向 1.2.3.4 要求 port 80 連線 ,
        因為這台 Client 的 Default Gateway 是 5.6.7.8 ,
        所以這要求連線的封包會經由線路A 的 IP 5.6.7.8 向外遶過好多 Internet Route ,
        最後經由線路B 來到  IP 1.2.3.4 ................
        明明 Web Server 就放在公司內部 , 卻因為 DNS Server 規劃錯誤 ,
        白白浪費公司對外兩條線路的頻寬 .


        若一開始向 DNS Server 查到的 IP 為 192.168.0.10 , 就不會有這問題 .
        架兩台 DNS Server 分別服務內部外部的用戶端 , 是解決這個問題的方式之一 .





Rack 就已經不夠用了 , DNS 還得分內部用外部用二台電腦 , 相當麻煩 .............
BIND 9 的 view 這個功能就可以解決這個問題 ,
讓不管是內部還是外部來的 Query , 都由同一台 DNS Server 來回覆 .
雖是同一台 DNS 在回覆 , 但不同的網路來源 , 可以設定讓它看到不同的 view .
以上面的例子來說 , 可以設成不同的 view 內 , 都有 test.com.tw. 的 zone ,
但指向記錄的記錄檔不同 ,
外部用的 view 內的 DNS RR ==>  www.test.com.tw.   IN   A   1.2.3.4
內部用的 view 內的 DNS RR ==>  www.test.com.tw.   IN   A   192.168.0.10




下面直接用 named.conf 來說明 view 的設定方式 :


[root@fc6 ~]# cat /var/named/chroot/etc/named.conf
// Red Hat BIND Configuration Tool
//
// Name server configuration
//                                                                
"//"  以後的文字為說明文字
options {                                                 //  參數區段 , options 參數為 global(全域) , 
                                                                 //  也就是以下任何區段(view,zone)內若沒有相同參數 ,
                                                                 //  則以 options 為主 .

                                                                 //  若以下任何區段內有相同參數 ,
                                                                 //  以該區段內參數為主 .

        directory "/var/named";         //  RR(Resource Records) 檔案 
                                                            //  放在 /var/named 資料夾內 .
        query-source address * port 53;   //  當這台 dns server 要向另一台 dns server
                                                                     //  查詢時 , UDP 封包來源 port 為 53 .
                                                                     //  (穿越防火牆時可用)
        allow-transfer { none; };               //  設定哪些位置可以做 transfer 要求 ,
                                                                 //  預設為 "none" .
                                                                 //  若有 slave zone 在另一台 dns server 上 ,
                                                                 //  才把那台 dns server 的 IP 填上 ,
                                                                 //  否則請設定為 "zone" .
};

view "wan" {                                  //  view 為 bind 9 以後才有的功能 ,
                                                        //  主要是讓這台 DNS Server 可以
                                                        //  "見人說人話 , 見鬼說鬼話" .
                                                        //  以前 DNS Server 要分二台 ,
                                                        //  一台對外(public IP) , 一台對內(private IP) ,
                                                        //  現在不用了 , 用 "view" 即可切開不同來源的 Client .

                                                        //  也就是說 , 用 "view" 的功能 ,
                                                        //  就可以依據不同網路來的 DNS 查詢 ,
                                                        //  回覆不同的對應資訊 .
                                                        //  這個例子中的 "wan" 是隨意設定這個 "view" 的名稱 .


        match-clients {              //  設定這個 "view" 是給誰看的 .
            ! 192.168.0.0/24;       //  除了(!) 192.168.0.0/24 這個網路 ,
            any;                              //  any 為任意網路位置 .
                                                 //  就是除了內網以外的任何網路位置 , 都用這個 "view" .
        };

        recursion no;               //  關閉 "遞歸查詢" .
                                               //  如果 Client 查詢的資訊不在這台 DNS 的 zone 內 ,
                                               //  將不嘗試替 Client 查詢 .


        zone "test.com.tw." IN {       //  "zone" 這個區段就是設定我們申請來的 Domain Name
            type master;                      //  這是 Master zone .
            file "test.com.tw.wan";     //  RR(Resource Records) 檔案的檔名 ,
                                                        //  (不要忘記路徑在上面有宣告 : directory "/var/named";)
            allow-update { none; };   //  指定誰可以用更新指令(nsupdate)來更新這個 "zone" ,
                                                        //  這裡設為 none .
        };
};



view "lan" {                                  //  另一個 "view" , 這裡給他個名稱叫 "lan" .

            match-clients {              //  設定這個 "view" 是給哪個網路來查的 .
            192.168.0.0/24;
        };

        recursion yes;                  //  開啟 "遞歸查詢" .
                                                   //  如果 Client 查詢的資訊不在這台 DNS 的 zone 內 ,
                                                   //  則這台 Server 將會向 "根"(.) 伺服器開始做遞歸查詢 .


        forwarders {                     //  設定這台 Server 不要自己做遞歸查詢 ,
                                                   //  而是把這個 query 轉給(forward) 別台 DNS Server .
                                                   //  也就是說 , 這台 DNS Server 把自己當成一台 Client ,
                                                   //  把自己 Client 送來的 query ,
                                                   //  當成自己的 query 向指定的 DNS Server 查詢 ,
                                                   //  等待指定的 Server 的回覆 , 再把這回覆回給自己的 Client .
            168.95.1.1;
            168.95.1.2;                   //  這三台是 Hinet 提供的 DNS Server .
            168.95.192.1;
        };

        zone "test.com.tw." IN {       //  "zone" 這個區段就是設定我們申請來的 Domain Name
            type master;
            file "test.com.tw.lan";       //  這裡的檔名當然要跟上面 wan 這個 view 內
                                                        //  的 zone "test.com.tw" 的記錄檔檔名要有所不同 .
            allow-update { none; };
        };
};

include "/etc/rndc.key";             //  利用 rndc 來 ctrl 這台 DNS Server 時 , 所用的 key .
                                                     //  若要給不同的 "view" 用不同的 key ,
                                                     //  可以分別在 "view" 的段落中 , include 不同的 key .
                                         
[root@fc6 ~]# 







**************************************************************************







上面這 named.conf 範例少了
zone "."   (root hint)
zone "localhost"
zone "0.0.127.in-addr.arpa"
...
..
.


那是因為 Fedora Linux Core 6 內建的 DNS 套件 ,
把這些放進 DNS Cache Server 內了 .
見 /var/named/chroot/etc/named.caching-nameserver.conf 檔案內只有一個 view ,
而 view 內 include 了 /etc/named.rfc1912.zones 這個檔案 ,
再看 named.rfc1912.zones 這個檔案內容 , 即存放了上面說的幾個 zone .


上面的這個 named.conf 範例 , 經測試是可用的 .


但若使用的 Linux 包裝不是 FC6 , 而是別的版本 ,
應注意上面這個幾個 zone 的部份 .


P.S.
    bind-9.3.2-41 內附的 named.conf 範例檔(....../doc/bind-9.3.2/sample/etc/named.conf)
    內有說到 , 每個 view 內都應放入 zone "." (root hint)   ,
    而 zone "localhost" 等 本機迴路的 zone , 應只放在內部迴路的 view 內 .


  















參考文件 :
BIND 9 Administrator Reference Manual


























沒有留言: