DNS總結
DNS 名稱解析的查詢模式DNS 名稱解析的查詢模式1、遞歸查詢:當收到客戶端的遞歸查詢請求后,當前DNS 服務器只會向DNS 客戶端返回兩種信息:要么是在該DNS 服務器上查詢到的結果,要么是查詢失
DNS 名稱解析的查詢模式
DNS 名稱解析的查詢模式
1、遞歸查詢:當收到客戶端的遞歸查詢請求后,當前DNS 服務器只會向DNS 客戶端返回兩種信息:要么是在該DNS 服務器上查詢到的結果,要么是查詢失敗,如果當前DNS 服務器中無法解析名稱,它并不會主動告知DNS 客戶端其它可能的DNS 服務器,而是自行向其它DNS 服務器查詢并完成解析。如果其它DNS 服務器解析失敗,則DNS 服務器將向DNS 客戶端返回查詢失敗的消息。遞歸即是有來有往。
2、迭代查詢:迭代查詢通常在一臺DNS 服務器向另一臺DNS 服務器發(fā)出解析請求時使用。如果當前DNS 收到其它DNS 服務器發(fā)來的迭代查詢請求并且未能在本地查詢到所需要的數據,則當前DNS 服務器將告訴發(fā)起查詢的DNS 服務器另一臺DNS 服務器的IP 地址。然后,再由發(fā)起查詢的DNS 服務器自行向另一臺DNS 服務器發(fā)起查詢;依次類推,直到查詢到所需數據為止。如果到最后一臺DNS 服務器仍沒有查到所需數據,則通知最初發(fā)起查詢的DNS 服務器解析失敗。迭代的意思就是若在某地查不到,該地就會告知查詢者其它地方的地址。讓查詢轉到其它地方去查。
說白就是這樣:
1. 遞歸查詢:
一般客戶機和服務器之間屬遞歸查詢,即當客戶機向DNS 服務器發(fā)出請求后, 若DNS 服務器本身不能解析, 則會向另外的DNS 服務器發(fā)出查詢請求,得到結果后轉交給客戶機;
2. 迭代查詢(反復查詢):
一般DNS 服務器之間屬迭代查詢,如:若DNS2不能響應DNS1的請求,則它會將DNS3的IP 給DNS2,以便其再向DNS3發(fā)出請求;
舉例:比如學生問老師一個問題,王老師告訴他答案這之間的叫遞歸查詢。這期間也許王老師也不會,這時王老師問張老師,這之間的查詢叫迭代查詢!
Forwarder
為了提高我們這個DNS 服務器的查詢效率,我們會采取這樣的措施:把非本地域的解析請求轉發(fā)到我們的ISP 提供的DNS 。
這個功能是由forwarder 選項來完成的。所謂的 forwarder ,就是當某一臺 NS 主機遇到非本機負責的 zone ( slave zone 也屬于本機負責的范圍) 查詢請求的時候,將不直接向 root zone 查詢而把請求轉交給指定的 forwarder (一臺或多臺) 主機代為查詢。如果你不了解 DNS 的查詢模式,那么很難理解這個 forwarder 的意義和好處。
我們知道,當DNS 服務器接到客戶端主機的查詢請求時,首先會檢查這個查詢是否屬于本機管轄,否則將轉向 root zone 再逐級的查詢下去,最后再把查詢結果告訴客戶端。在這個過程之中,DNS 服務器還會將查詢到的結果存放到緩
,存中。只要緩存中的 TTL 沒過期,在下次遇到同樣查詢的時候,就可以直接將結果響應給客戶端,而無需再重復上次的查詢流程。
如果DNS 服務器上指定了forwarder ,那這個 DNS 發(fā)現緩存中沒有記錄時,將不向 root 查詢,而是向 forwarder 送出同樣的請求(轉發(fā)),然后等待查詢結果,即把逐級往下查詢這個耗費精力的動作,交給 forwarder 負責。但無論這個結果是自己直接查詢得來的,還是 forwarder 送回來的,DNS 服務器都會保存一份數據在緩存中。這樣,以后的相同查詢就快多了,這對于DNS 所服務的客戶端而言查詢效率會提高很多。
forwarder 機制的好處并非僅是上面所提到的效率提升,對于整個網絡流量(尤其是對外的流量) 也是有幫助的。比方說,你的內部網絡需要 10 臺 DNS 來提供服務,你只需在某一臺能直接與外界溝通的計算機上架設 DNS 服務,然后將其它內部DNS 的 forwarder 指向該服務器就行了。這樣可能本來需要 10 次的 root 查詢,在 forwarders 的機制下,就只需 1 次而已。連同下層的往返查詢來計算的話,總體上所省下的對外查詢就更多了,再加上緩存帶來的好處,forwarder 所降低的 DNS 流量是非常顯著的。
事實上,在本章開始我們就提到如何集中管理內部局域網用戶域名解析問題,解決的方法就是:在本地DNS 的 forwarder 設定為 ISP 的 DNS ,局域網用戶把DNS 都設置成本地DNS 地址,在進行外部域名解析時,我們的DNS 把解析請求轉發(fā)給ISP 的DNS ;又因為 ISP 上的 DNS 也有緩存的關系,所以這樣設置查詢還可以提高速度。
羅嗦了半天,現在看看如何配置。具體的設置很簡單:在named.conf 的options 部分添加這樣一行:
forwarders { 211.136.17.107; 202.102.152.3; };
如此設置完畢,那么所有非本區(qū)域的查詢都會直接轉發(fā)到forwarders 指定的DNS 服務器上去。
§§ 測試DNS
在Linux 上我們可以用ping 、nslookup 、dig 、host 等命令來測試DNS 是否工作正常,這些小工具都很簡單,以host 為例:
[root@rh73 ']# host ns.silly.com
,6.options 語句
options 語句的定義和使用:
options 語句用來設置可以被整個BIND 使用的全局選項。這個語句在每個配置文件中只有一處。如果出現多個options 語句,則第一個options 的配置有效,并且會產生一個警告信息。
如果沒有options 語句,則每個選項使用缺省值。
options {
[ version version_string; ]
[ directory path_name; ]
[ named-xfer path_name; ]
[ tkey-domain domainname; ]
[ tkey-dhkey key_name key_tag; ]
[ dump-file path_name; ]
[ memstatistics-file path_name; ]
[ pid-file path_name; ]
[ statistics-file path_name; ]
[ zone-statistics yes_or_no; ]
[ auth-nxdomain yes_or_no; ]
[ deallocate-on-exit yes_or_no; ]
[ dialup dialup_option; ]
[ fake-iquery yes_or_no; ]
[ fetch-glue yes_or_no; ]
,[ has-old-clients yes_or_no; ]
[ host-statistics yes_or_no; ]
[ minimal-responses yes_or_no; ]
[ multiple-cnames yes_or_no; ]
[ notify yes_or_no | explicit; ]
[ recursion yes_or_no; ]
[ rfc2308-type1 yes_or_no; ]
[ use-id-pool yes_or_no; ]
[ maintain-ixfr-base yes_or_no; ]
[ forward ( only | first ); ]
[ forwarders { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ check-names ( master | slave | response )( warn | fail | ignore ); ]
[ allow-notify { address_match_list }; ]
[ allow-query { address_match_list }; ]
[ allow-transfer { address_match_list }; ]
[ allow-recursion { address_match_list }; ]
[ allow-v6-synthesis { address_match_list }; ]
[ blackhole { address_match_list }; ]
[ listen-on [ port ip_port ] { address_match_list }; ]
[ listen-on-v6 [ port ip_port ] { address_match_list }; ]
[ query-source [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; ]
[ max-transfer-time-in number; ]
,[ max-transfer-time-out number; ]
[ max-transfer-idle-in number; ]
[ max-transfer-idle-out number; ]
[ tcp-clients number; ]
[ recursive-clients number; ]
[ serial-query-rate number; ]
[ serial-queries number; ]
[ transfer-format ( one-answer | many-answers ); ]
[ transfers-in number; ]
[ transfers-out number; ]
[ transfers-per-ns number; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ alsonotify { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ max-ixfr-log-size number; ]
[ coresize size_spec ; ]
[ datasize size_spec ; ]
[ files size_spec ; ]
[ stacksize size_spec ; ]
[ cleaning-interval number; ]
,[ heartbeat-interval number; ]
[ interface-interval number; ]
[ statistics-interval number; ]
[ topology { address_match_list }];
[ sortlist { address_match_list }];
[ rrset-order { order_spec ; [ order_spec ; ... ] } };
[ lame-ttl number; ]
[ max-ncache-ttl number; ]
[ max-cache-ttl number; ]
[ sig-validity-interval number ; ]
[ min-roots number; ]
[ use-ixfr yes_or_no ; ]
[ provide-ixfr yes_or_no; ]
[ request-ixfr yes_or_no; ]
[ treat-cr-as-space yes_or_no ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
[ port ip_port; ]
[ additional-from-auth yes_or_no ; ]
[ additional-from-cache yes_or_no ; ]
,[ random-device path_name ; ]
[ max-cache-size size_spec ; ]
[ match-mapped-addresses yes_or_no; ]
};
version
回答針對服務器版本的請求時的內容。缺省返回的是服務器的真實版本。
directory
服務器的工作目錄。配置文件中所有使用的相對路徑,指的都是在這里配置的目錄下。大多數服務器的輸出文件(如named.run )都缺省生成在這個目錄下。如果沒有設定目錄,工作目錄缺省設置為服務器啟動時的目錄?. ?。指定的目錄應該是一個絕對路徑。
named-xfer
這個選項已經被廢棄了。它在BIND8 中,它用來給named-xfer 程序設定路徑名。在BI ND9中,不需要單獨的named-xfer 程序;它的功能已經內置在域名服務器中。 tkey-domain
這個域名將會附帶在由TKEY 生成的所有共享密匙名字的后面。當用戶請求進行TKEY 交換時,它會為密匙設定或不設定所要求的名稱。如果設置了tkey_domain,共享密匙的名字將會是"client specified part" (用戶設定的部分) "tkey-domain" 。否則,共享密匙的名字將是"random hex digits" (隨機的16 進制數) "tkey-domain" 。在大多數情況下,domainname 應該是服務器的域名。
tkey-dhkey
,針對使用Diffie-Hellman 的TKEY 模式的用戶,服務器用來生成共享密匙的Diffie-Hellm an 密匙。服務器必須可以從工作目錄中調入公共和私人密匙。大多數情況下,密匙的名稱應該是服務器的主機名。
dump-file
當執(zhí)行rndc dumpdb 命令時,服務器存放數據庫文件的路徑名。如果沒有指定,缺省名字是named_dump.db。
memstatistics-file
服務器輸出的內存使用統計文件的路徑名。如果沒有指定,默認值為named.memstats 。 注意:還沒有在BIND9中實現!
pid-file
進程ID 文件的路徑名。如果沒有指定,默認為/var/run/named.pid。pid-file 是給那些需要向運行著的服務器發(fā)送信號的程序使用的。
statistics-file
當使用rndc stats 命令的時候,服務器會將統計信息追加到的文件路徑名。如果沒有指定,默認為named.stats 在服務器程序的當前目錄中。
port
服務器用來接收和發(fā)送DNS 協議數據的UDP/TCP端口號。默認為53。這個選項主要用于服務器的檢測;因為如果不使用53端口的話,服務器將不能與其它的DNS 進行通訊。 random-device
服務器使用的entropy 源:entropy 主要用于DNSSEC 操作,如TKEY 的數據交換和加密域的動態(tài)更新。此選項指定了entropy 將會從哪個設備(或文件)中讀取信息。如果它是一個文件,則當文件耗盡后,需要entropy 的操作將會失敗。如果沒有指定,默認值是/d
,ev/random(或等價的),如果它存在,否則就是沒有。random-device 選項是在服務器啟動時,初始化配置時起作用的,在以后的重啟時則被忽略。
A.Boolean 選項
auth-nxdomain
如果是yes ,那么AA 位將一直設置成NXDOMAIN 響應,甚至在服務器不是授權服務器的情況下都是這樣的。默認值是no ;這與BIND8不同。如果用戶使用的是非常老版本的DN S 軟件,則有必要把它設置成yes 。
deallocate-on-exit
此選項在BIND8中用于檢查出口處內存泄露。BIND9忽略此選項,并始終進行檢查。 dialup
如果是yes ,那么服務器將會像在通過一條按需撥號的鏈路進行域傳送一樣,對待所有的域(按需撥號就是在服務器有流量的時候,鏈路才連通)。根據域類型的不同它有不同的作用,并將集中域的維護操作,這樣所有有關的操作都會集中在一段很短的時間內完成,每個he artbeat-interval 一次,一般是在一次調用之中完成。它也禁止一些正常的域維護的流量。默認值是no 。
dialup 選項也可以定義在view 和zone 語句中,這樣就會代替了全局設置中dialup 的選項。
如果域是一個主域,服務器就會對所有輔域發(fā)送NOTIFY 請求。這將激活輔域名服務器中的對域的序列號的檢驗。這樣當建立一個連接時,輔域名服務器才能確認這個域的傳輸合法性。
,如果這個域是一個輔域或是末梢域(stub zone ),那么服務器將會禁止通常的“zone up to date ”(refresh )請求,為了能發(fā)送NOTIFY 請求,只有在heartbeat-interval 過期之后才執(zhí)行。
通過下列的設置,可以實現更好的控制。
1、notify 只發(fā)送NOTIFY 信息。
2、notify-passive 發(fā)送NOTIFY 信息,并禁止普通的刷新(refresh )請求。
3、refresh 禁止普通的刷新處理,當heartbeat-interval 過期時才發(fā)送刷新請求。
4、passive 只用于關閉普通的刷新處理。
fake-iquery
在BIND8中,此選項用來模擬陳舊的DNS 查詢類型IQUERY 。BIND9不再進行IQUERY 模擬。
fetch-glue
這個選項以后不再使用。
has-old-clients
這個選項在BIND8中執(zhí)行有問題,BIND9則忽略了這個選項。為了達到has-old-clients yes 的預期效果,可以設定兩個獨立選項auth-nxdomain yes 和rfc2308-type1 no 來代替。
host-statistics
在BIND8中,它可以保留每臺和域名服務器交互的主機統計信息。BIND9中不支持。 maintain-ixfr-base
此選項不再使用了。在BIND8用于判定是否保存了增量域傳輸的處理日志。BIND9任何可能的時候都會保存?zhèn)鬏斎罩尽H绻枰沽鞒龅脑隽坑騻鬏?,可以使用provide-ixfr no 。