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
沒有留言:
張貼留言