NS服務器最基本的任務就是響應域名的查詢,返回該域名的地址資料. 在DNS服務器中將一個
域名分成內部與外部做不同的View解析, 可以提升安全性,以及分類應付不同區域的查詢請求.
例如您的單位需要分成內部網和外部網,希望將同一個域名解析為不同的IP地址, 以提高安全
防護的目的, 或者應付不同業務的應用; 又比如您需要將業務按地域來劃分,打算在各個地區
分別設置各自的主機來處理訪問請求(或者單機雙線也適用),以圖解决中国南北網(电信/网通)
互不相通所導致的速度差异之问题,希望將電信用戶解釋到由電信網絡所提供的IP地址上, 而
網通用戶則解釋到由網通網絡所提供的IP地址上;
要實現將來自不同地域(用IP段來標識)的請求, 自動引導到不同區域的主機,可以采用域名的
多解釋方法來簡單實現. 在BIND9中有個新的view指令可以完成達到這個目的, 方法就是設置
多個view段落來響應同一個域名的查詢請求. 只需要在每個view段落的match-clients項目中,
設置所需匹配的客戶端IP段落, 并且在每個段落中都設置該域名的區域資料,但不同的view則
指向不同的區域文件, 然后在各自的區域文件中分別設置相應的區域內容,這樣就可以達到按
請求者的IP段落來分別響應得出不同的查詢結果了.
針對訪問者不同的IP段,來解釋主機域名的相應的IP地址, 也可以輕易實現負載均衡或者化解
地區局限. 舉個例子來說, 目前國內的網絡因為種種原因,同外部網絡的連線經常出現不穩定
的狀況,造成從大陸內部無法訪問外部,而外部也無法訪問內部,尤其是導致電郵收發異常緩慢
甚至丟失反彈,非常令人頭疼. 而且很多時候造成這種不穩定的因素, 還常常是源自于國家級
主干網絡的非技術性故障,這就很難從主機供應商方面尋求解決問題的方案. 如果要徹底解決
這個問題的話, 那么一個可能的方案就是按地域來劃分業務. 例如,分別在不同地區設置一臺
主機(假設在北京設置一臺主機,在廣州設置一臺主機,在香港設置另一臺主機),然后就可設法
將大陸內部北方的客戶引導到北京(網通)的主機, 將南方的客戶引導到廣州(電信)的主機,而
將海外的客戶則引導到香港的主機.
【BIND 9 DNS Views 的配置示例】
操作系统: Debian 4.1;
BIND版本: BIND 9.3.4;
DNS服务器: 192.168.0.8;
内部IP段: 192.168.0.0/24;
外部IP段: 除192.168.0.0/24之外的所有IP;
解釋域名: mytest.com;
希望内部IP和本機IP(192.168.0.8)所解析到www.mytest.com的IP地址为1.1.1.1;
希望外部IP段(192.168.0.7和192.168.0.17)则解析到2.2.2.2;
希望其他IP段(我的測試IP是192.168.0.2)則解釋到3.3.3.3;
vi /etc/bind/named.conf; #
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
include "/etc/bind/named.conf.options";
view "internal" {
match-clients { localhost; 192.168.0.8; };
match-destinations { any; };
recursion yes;
allow-query { localhost; 192.168.0.0/24; };
allow-transfer { 192.168.0.7; };
include "/etc/bind/named.internal.zones";
include "/etc/bind/named.conf.local";
};
view "external" {
match-clients { 192.168.0.7; 192.168.0.17; };
match-destinations { any; };
recursion yes;
allow-query { any; };
allow-transfer { 192.168.0.7; };
include "/etc/bind/named.external.zones";
include "/etc/bind/named.conf.local";
};
view "others" {
match-clients { any; };
match-destinations { any; };
recursion yes;
allow-query { any; };
allow-transfer { 192.168.0.7; };
include "/etc/bind/named.others.zones";
include "/etc/bind/named.conf.local";
};
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
請注意: 各個View指令的應用是按先后順序執行的,即是按首先符合的條件返回結果,例如本地
請求首先符合第一View指令, 則返回結果,不再檢查其他的View; 來自192.168.0.7的請求符合
第二個View指令, 則返回結果, 不再檢查后面的View; 所以,如果要在該View的match-clients
中設置任何條件(即any)的話, 就必須將這個View擺在最后面, 而絕不能放在其他View的前面.
vi /etc/bind/named.internal.zones;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
zone "mytest.com" IN {
type master;
file "/etc/bind/mytest.com.internal";
};
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi /etc/bind/named.external.zones;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
zone "mytest.com" IN {
type master;
file "/etc/bind/mytest.com.external";
};
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi /etc/bind/named.others.zones;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
zone "mytest.com" IN {
type master;
file "/etc/bind/mytest.com.others";
};
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi /etc/bind/mytest.com.internal;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns.mytest.com. root.ns.mytest.com. (
2007101701 ;
3600 ;
1800 ;
36000 ;
3600 ) ;
IN NS ns.mytest.com.
ns IN A 192.168.0.8
www IN A 1.1.1.1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi /etc/bind/mytest.com.external;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns.mytest.com. root.ns.mytest.com. (
2007101701 ;
3600 ;
1800 ;
36000 ;
3600 ) ;
IN NS ns.mytest.com.
ns IN A 192.168.0.8
www IN A 2.2.2.2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vi /etc/bind/mytest.com.others;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns.mytest.com. root.ns.mytest.com. (
2007101701 ;
3600 ;
1800 ;
36000 ;
3600 ) ;
IN NS ns.mytest.com.
ns IN A 192.168.0.8
www IN A 3.3.3.3
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
設置好後重啟BIND服務: /etc/init.d/bind9 restart;
如果一切設置正常的話,現在DNS服務器應該能分別針對不同IP地址的請求,來返回不同的主機
解釋了, 這里測試從192.168.0.2,192.168.0.7和192.168.0.8(本機)查詢結果是:
從192.168.0.2查詢(dig @191.168.0.2 www.mytest.com;)則返回3.3.3.3;
從192.168.0.7查詢(dig @191.168.0.7 www.mytest.com;)則返回2.2.2.2;
從192.168.0.8查詢(dig @191.168.0.8 www.mytest.com;)則返回1.1.1.1;
請注意: view指令是BIND 9的新功能, BIND 8以前的版本無此功能;
假設我的域名現在需要針對來自四個不同區域的DNS查詢,分別返回不同的主機IP地址,我計劃
把DNS的配置文件分為如下四個View段落:
本機內網 internal
中國網通 chinanetcom
中國電信 chinatelecom
其他網絡 others
因為我沒有可用的注冊域名,所以首先要在免費的DNS注冊機構申請一個子域名. 很快就找到了
一個可以提供免費DNS注冊的機構: freedns.afraid.org, 這個網站所提供的注冊服務比較多,
包括了免費的NS記錄(其他大部分免費注冊機構都不提供NS記錄的注冊).
因為我的測試主機是用撥號上網的, IP是動態地址, 所以下面的注冊資料只是臨時測試使用的.
在本次測試中,我先注冊了一個A記錄(ns-hung.mooo.com),并將這個A記錄指向我的撥號上網的
主機IP(210.209.111.254); 然后再注冊一個用來委派子域的NS記錄, 我將這個測試用的子域
命名為hung.mooo.com,顧名思義,注冊子域名的NS記錄,當然需要指定一個NS(名稱服務器)地址,
而且NS地址不能用動態IP地址,所以就用前面剛剛注冊的A記錄作為本子域的NS服務器地址.
注冊資料是立即生效的(效率不錯),看看注冊結果:
dig ns-hung.mooo.com @ns1.afraid.org; #這是A記錄(省略部分內容);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;; QUESTION SECTION:
;ns-hung.mooo.com. IN A
;; ANSWER SECTION:
ns-hung.mooo.com. 3600 IN A 210.209.111.254
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dig hung.mooo.com NS @ns1.afraid.org; #這是NS記錄(省略部分內容);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;; QUESTION SECTION:
;hung.mooo.com. IN NS
;; AUTHORITY SECTION:
hung.mooo.com. 3600 IN NS ns-hung.mooo.com.
;; ADDITIONAL SECTION:
ns-hung.mooo.com. 3600 IN A 210.209.111.254
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【尋找測試IP】
注冊好子域的NS記錄之後,這個子域就被委派到我的撥號上網主機(即ns-hung.mooo.com),我用
免費的Vmware Server開設了一臺Linux機器,安裝的是Debian4.1版本,并且使用了預設的BIND9
來設置DNS服務器.
但是, 在主機上開始設置新子域(hung.mooo.com)之前, 還需要預先準備一些必不可少的資料,
也就是需要先尋找一些可用的IP段落, 用于在DNS的View中設置查詢的匹配條件. 而且當配置
完成之后還需要進行分布式的實驗測試, 但是因為環境條件所限制,我不可能操縱每個地區的
主機來真實地查詢測試一遍, 因此還必須利用DNS服務器的分布式特點來完成測試任務.
眾所周知, DNS服務器能夠完成遞歸查詢任務, 也就是替代客戶完成查詢結果. 事實上, 目前
絕大部分的ISP機構所提供的公用DNS服務器,都是緩存服務器, 也就是它們自己本身沒有區域
資料, 只在客戶提出某個域名的查詢要求的時候,才會即時從該域名的逐級注冊資料中, 獲得
最終擁有這個域名記錄的Master或Slave的主機地址, 然后再將獲得的記錄緩存起來以供客戶
下次查詢.
當使用命令dig和nslookup來查詢域名的時候, 都可以手工指定某個DNS服務器作為查詢對象.
因此, 只要針對IP段落來尋找該段落中公用的DNS服務器,然后再指定用此服務器來進行查詢,
那么就可以得出測試結果了.
如前所述,這臺DNS服務器需要分為四個View段落, 每個段落分別處理不同的IP段落范圍的查詢
要求. 為了方便后面進行測試, 這里先選擇幾個公用的DNS服務器,然后再通過在線工具查找出
這幾個DNS服務器的IP所屬的段落. 我在網絡上搜尋, 分別挑選了幾個DNS服務器, ping出它們
的IP地址, 然后再分別用在線的IP查詢工具找出它們所屬的網段區域和網絡公司. 這些IP及其
所查找到的位置資料如下:
#這是屬于網通網絡的DNS服務器,將會用于DNS的View中的chinanetcom匹配條件:
ns.163.net 202.108.255.201 202.108.0.0/16 網通 北京
ns1.ehttp.com.cn 218.57.8.171 218.56.0.0/14 網通 山東
fjxm.cncnet.net 218.104.128.70 218.104.128.0/20 網通 福建
#這是屬于電信網絡的DNS服務器,將會用于DNS的View中的chinatelecom匹配條件:
dns2.cs.hn.cn 202.103.96.112 202.103.96.0/23 電信 長沙
ns.chinanet.cn.net 202.97.7.6 202.97.0.0/19 電信 四川
dns3.xj163.cn 61.128.99.133 61.128.96.0/19 電信 新疆
#海外網絡的DNS服務器,因為DNS的View中的others匹配any條件,所以這些DNS只需測試時使用:
ns3.netvigator.com 218.102.23.228 218.102.0.0/15 NETVIGATOR 香港
為了更準確定位, 還可以使用了一些網上所提供的在線IP定位工具, 來查找上述IP的地區分布
信息. 但是, 考慮到在線工具的數據庫未必完全準確, 這里所提供的IP地址資料僅能供臨時的
測試用途, 讀者如果需要在實際應用中使用, 建議參考更權威更可靠的資料來源. 如下是我用
來在線查找和定位IP地址的工具:
http://www.ip2location.com/free.asp
http://www.linkwan.com/gb/broadmeter/VisitorInfo/QureyIP.asp
根據上述查找出來的結果, 現在可以定出DNS的各個View段落中所對應的IP范圍了. 另外還要
請留意的是, 這里只為測試目的而列舉部分IP段落,當然在現實環境中實際應用的IP段落遠遠
不止這幾個段落. 這里的測試段落定義如下所示:
本機內網(internal) { localhost; 192.168.0.0/24; };
中國網通(chinanetcom) { 202.108.0.0/16; 218.56.0.0/14; 218.104.128.0/20; };
中國電信(chinatelecom) { 202.103.96.0/23; 202.97.0.0/19; 61.128.96.0/19; };
其他網絡(others) { any; };
定義好IP段落參數後,就可以開始設置BIND的配置文件了,為了簡化配置文檔,我將原文檔中的
默認的根域設置, 全部放置在前面的公共部分, 這樣就無需象以前的例子中那樣,要在每一個,
View段落中放置根域的定義了, 因此這里只要定義一次根域就可以了. 同樣道理,關于BIND的
所有的options段落也放置在公共部分, 例如相關的allow-query和allow-transfer的設置,請
參考之前的范例, 這里不再贅述.
如下是我的named.conf配置文檔的View段落的內容, 請參考:
cat /etc/bind/named.conf; #這是BIND的配置文件(省略了部分內容);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
...
view "internal" {
match-clients { localhost; 192.168.0.0/24; };
zone "hung.mooo.com" IN {
type master;
file "/etc/bind/db.hung.mooo.com.internal";
};
};
view "chinanetcom" {
match-clients { 202.108.0.0/16; 218.56.0.0/14; 218.104.128.0/20; };
zone "hung.mooo.com" IN {
type master;
file "/etc/bind/db.hung.mooo.com.chinanetcom";
};
};
view "chinatelecom" {
match-clients { 202.103.96.0/23; 202.97.0.0/19; 61.128.96.0/19; };
zone "hung.mooo.com" IN {
type master;
file "/etc/bind/db.hung.mooo.com.chinatelecom";
};
};
view "others" {
match-clients { any; };
zone "hung.mooo.com" IN {
type master;
file "/etc/bind/db.hung.mooo.com.others";
};
};
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
設置好DNS的配置文件后,接著就要建立子域的區域文件了. 從配置文件中可以看出, 這個子域
需要分別建立四個區域文件,以提供四種匹配情況. 這里因為測試目的,只在該子域下面添加了
一項A記錄,域名為www.hung.mooo.com. 為了方便觀察測試結果,我假設它匹配的四個View段落
的IP分別如下:
從 本機內網(internal) 查詢返回IP: 1.1.1.1
從 中國網通(chinanetcom) 查詢返回IP: 2.2.2.2
從 中國電信(chinatelecom) 查詢返回IP: 3.3.3.3
從 其他網絡(others) 查詢返回IP: 4.4.4.4
各個區域文件的內容請分別參考如下:
cat /etc/bind/db.hung.mooo.com.internal; #這是用于內網的區域文檔;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns-hung.mooo.com. root.ns-hung.mooo.com. (
2007102001 ;
3600 ;
1800 ;
36000 ;
600 ) ;
IN NS ns-hung.mooo.com.
www.hung.mooo.com. IN A 1.1.1.1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat /etc/bind/db.hung.mooo.com.chinanetcom; #這是用于網通的區域文檔;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns-hung.mooo.com. root.ns-hung.mooo.com. (
2007102001 ;
3600 ;
1800 ;
36000 ;
600 ) ;
IN NS ns-hung.mooo.com.
www.hung.mooo.com. IN A 2.2.2.2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat /etc/bind/db.hung.mooo.com.chinatelecom; #這是用于電信的區域文檔;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns-hung.mooo.com. root.ns-hung.mooo.com. (
2007102001 ;
3600 ;
1800 ;
36000 ;
600 ) ;
IN NS ns-hung.mooo.com.
www.hung.mooo.com. IN A 3.3.3.3
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat /etc/bind/db.hung.mooo.com.others; #這是用于海外的區域文檔;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$TTL 4320 ; 1 hour 12 minutes
@ IN SOA ns-hung.mooo.com. root.ns-hung.mooo.com. (
2007102001 ;
3600 ;
1800 ;
36000 ;
600 ) ;
IN NS ns-hung.mooo.com.
www.hung.mooo.com. IN A 4.4.4.4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
測試結果
設置好後, 請重新啟動BIND9: /etc/init.d/bind9 restart;
然后用dig命令測試結果,這里的dig命令要帶上 @dns-server參數,用于指定從某臺DNS服務器
查詢, 也就是是分別用前面所查找到的DNS服務器來做測試. 下面列出的是我進行測試的部分
結果, 為了簡化版面, 有些測試結果省略了返回信息中的部分內容. 測試結果請參考如下:
dig www.hung.mooo.com @ns-hung.mooo.com; #這是從本地查詢的結果;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; <<>> DiG 9.3.4 <<>> www.hung.mooo.com @ns-hung.mooo.com
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22887
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;www.hung.mooo.com. IN A
;; ANSWER SECTION:
www.hung.mooo.com. 4320 IN A 1.1.1.1
;; AUTHORITY SECTION:
hung.mooo.com. 4320 IN NS ns-hung.mooo.com.
;; Query time: 6 msec
;; SERVER: 59.188.240.117#53(59.188.240.117)
;; WHEN: Mon Oct 22 18:33:00 2007
;; MSG SIZE rcvd: 73
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dig www.hung.mooo.com @202.108.255.201; #這是從網通來查詢的結果(省略部分內容);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
...
;; ANSWER SECTION:
www.hung.mooo.com. 4203 IN A 2.2.2.2
;; AUTHORITY SECTION:
hung.mooo.com. 4203 IN NS ns-hung.mooo.com.
...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dig www.hung.mooo.com @202.97.7.6; #這是從電信網絡來查詢的結果(省略部分內容);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
...
;; ANSWER SECTION:
www.hung.mooo.com. 4090 IN A 3.3.3.3
;; AUTHORITY SECTION:
hung.mooo.com. 4090 IN NS ns-hung.mooo.com.
...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dig www.hung.mooo.com @ns3.netvigator.com; #這是從香港的netvigator的查詢結果;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
...
;; ANSWER SECTION:
www.hung.mooo.com. 481 IN A 4.4.4.4
;; AUTHORITY SECTION:
hung.mooo.com. 546 IN NS ns-hung.mooo.com.
...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -