FreeBSD DNS的體系結構(轉)

gugu99發表於2007-08-11
FreeBSD DNS的體系結構(轉)[@more@]

  通常,一臺計算機只需要配置域名解析就可以了,不需要自己執行名字伺服器守護程式,然而有些時候需要設定自己的名字伺服器,這就需要FreeBSD下配置名字伺服器BIND(Berkeley Internet Name D omain)。BIND也是由伯克利開發的一個著名軟體,它的執行程式為named,執行在Internet上幾乎所有的名字伺服器上,構成Internet的名字系統。

  由於普通的客戶計算機並不需要執行named,因此在其/etc/rc.conf配置檔案中,named_enable 應為NO。當需要執行named以提供DNS服務的時候,就要將這個引數的值改為”YES”。

  • DNS的體系結構

  Internet上的DNS名字服務為一種分散式的體系,由分佈在Internet各地的DNS伺服器上的named 守護程式為整個Internet提供本域內計算機的名字解析服務。DNS域名結構為分級方式,例如 中最後面的cn為頂級域名,由後向前分別劃分為不同級別的域。

  Internet上的頂級域名有兩種,一種象cn這樣的國別程式碼,另一種是如同edu、org、net、com 等分類程式碼。國別頂級域下的次級域名同樣可以按照地域或組織結構來分類劃分。

  那麼要進行名字解析,就需要從域名的後面向前,一級級查詢這個域名。因此Internet上就有一些DNS伺服器為Internet的頂級域提供解析任務,這些DNS伺服器稱為根DNS伺服器。知道了根DNS伺服器的地址,就能按級查詢任何具有DNS域名的主機名字,BIND程式碼中就包括了這些根DNS伺服器的地址。

  名字服務使用zone的概念來表示一個域內的主機,然而zone與域也有所區別,zone只是域的一部分,而不是整個域。因為zone中不包括域下的子域。例如域名的域為example.org.cn ,這是一個獨立的zone。這個域下可由子域組成,例如就屬於其子域sub.example.org.cn,子域也是一個獨立的zone,並不包括在example.org.cn 這個zone之內,作為域的example.org.cn中就包括sub.example.org.cn子域。

  除了從名字查詢主機的IP地址這種正向的查詢方式之外,另外還有從IP地址反查主機域名的解析方式。很多情況下網路中使用這種反向解析來確定主機的身份,因此也很重要。查詢名字的反向解析是從前面的網路地址向後面的節點地址,逐級查詢,因此IP地址zone是IP地址的前面部分。然而由於一個主機的域名可以任意設定,並不一定與IP地址相關,因此正向查詢和反向查詢是兩個不同的查詢過程,需要配置不同的zone。

  • 使用DNS查詢工具

  用來進行DNS查詢的一個非常有用的工具是nslookup,可以使用它來查詢DNS中的各種資料。除了可以在命令列下直接進行基本的DNS查詢之外,直接啟動nslookup將進入一個互動模式,這裡能查詢各種型別的DNS 資料。

  的名字解析資料可以有各種不同的型別,有設定這個zone的引數的SOA型別資料,有設定名字對應的IP地址的A型別資料,有設定從IP地址反向解析DNS名字的PTR資料,有定義服務與這個zone的DNS伺服器的NS資料,以及定義主機別名的CNAME資料。這些不同型別的資料均可以透過nslookup的互動模式來查詢,需要使用 set type命令設定相應的查詢型別。

$ nslookup

Default Server: ns.hazzptt.net.cn

Address: 202.102.224.68

> set type=ns

> yahoo.com

Server: ns.hazzptt.net.cn

Address: 202.102.224.68

Non-authoritative answer:

yahoo.com    nameserver = NS2.DCA.yahoo.com

yahoo.com    nameserver = NS5.DCX.yahoo.com

yahoo.com    nameserver = NS.EUROPE.yahoo.com

yahoo.com    nameserver = NS1.yahoo.com

Authoritative answers can be found from:

NS2.DCA.yahoo.com    internet address = 209.143.200.34

NS5.DCX.yahoo.com    internet address = 216.32.74.10

NS.EUROPE.yahoo.com   internet address = 195.67.49.25

NS1.yahoo.com  internet address = 204.71.200.33

>

  這個例子就使用nslookup來查詢yahoo.com這個zone的名字伺服器,需要將型別設定為ns來執行查詢。用來幫助獲得DNS資料的工具還有很多,如dig能迅速返回整個zone的名字解析資料,dnswalk可以用來幫助查詢名字伺服器的設定。這些工具都可以用來幫助查詢DNS的設定問題。

配置緩衝或轉發方式的named

  在Internet中主要使用名字進行連線,因此網路中的DNS查詢會十分頻繁。很多情況下,會有大量且重複的DNS查詢。尤其在使用撥號連線的條件下,由於名字伺服器位於ISP端,即使是曾經查詢過的名字,其資訊仍然儲存線上路的另一端的名字伺服器的緩衝區內,重複的DNS查詢將佔據寶貴的線路頻寬。並且DNS查詢還往往使得網路連線軟體不能正確獲得超時資訊,不能適時斷開連線以節省電話連線時間。

  因此,最好的辦法是將查詢結果儲存在本地計算機上,以避免重複查詢造成的無謂的網路流量。雖然很多TCP/IP 客戶機能夠在本機內儲存一個名字解析緩衝區,但這個緩衝區相對來講太小了,起不到很有效的作用,然而如果要將這個緩衝區設定的較大,又不能及時重新整理名字解析資料。要想很好的緩衝DNS資料,最好的緩衝區還是DNS伺服器本身,因為DNS 的實現方式就是一種經常重新整理的緩衝方式,並且named可以根據不同zone的不同設定,來實現資料重新整理。

  因此,最簡單的辦法就是設定一個具備緩衝能力的名字伺服器,它將能夠用做名字解析的緩衝,這就要需要設定名字伺服器的過程。

  • 在/etc/resolv.conf中,將127.0.0.1作為第一個可選伺服器,其他DNS伺服器作為備份,使得名字查詢透過本地的名字伺服器進行,以利用它的緩衝機制;
  • 在/etc/rc.conf中,將named_enable設定為”YES”,允許啟動named,rc.conf中有關named的其他選項不需改變;
  • 改變到/etc/namedb目錄下,執行make-localhost程式,這將產生針對本計算機的解析資料localhost.rev檔案;
  • 修改/etc/namedb/named.conf檔案,使其符合一個轉發系統的要求。
  • 啟動名字伺服器,可以使用root身份直接執行named守護程式,並在rc.conf中更改named_enable的設定值。

  • 設定named.conf

  要成功配置named,最重要的一步就是改變配置檔案named.conf,一個用於轉發的設定檔案應為:

  options {

    directory "/var/namedb";

    datasize 20M;

    forward only;

    forwarders {

      202.102.224.68

    };

};

zone "." {

    type hint;

    file "named.root";

};

zone "0.0.127.in-addr.arpa" {

    type master;

    file "localhost.rev";

};

  這個設定檔案中去除了任何註釋項,named中使用與C++相同的註釋方式,即用兩個斜線來表示一行註釋,而設定語句也類似C的語法。

  第一個語句options用於設定named的引數,directory指明named的工作目錄為/etc /namedb,datasize用於設定緩衝區的大小,forward only和forwarders用於指明這個伺服器只是一個轉發伺服器,並設定轉發的名字伺服器的地址。這兩個轉發選項不是必須設定的,不進行設定時named 就能很好的適應解析和緩衝任務。這樣名字伺服器初始時就從根名字伺服器中獲得資訊,這些資訊將儲存在named的緩衝區內,此後就可以查詢緩衝區內的相關伺服器來獲得進一步的名字解析。

  第二個語句用於設定根zone,這用於設定Internet上的根名字伺服器,一切本地無法解析的資料將傳送給那些根名字伺服器進行解析,設定了工作目錄下的named.root檔案中記錄了這些根名字伺服器的地址,記錄根名字伺服器的檔名字也可能為root.hints。第三句定義了對127.0.0.0的反向查詢的資料,0.0.12 7.in-addr.arpa為一個反向解析zone,其IP地址也是反序排列的,並且使用in-addr.arpa 字尾,而對應的反向解析資料在localhost.rev檔案中定義。

  BIND的當前版本為8,之前的版本為4.9.x,它們使用named.boot作為named的配置檔案。大多數Unix版本,包括大多數商業Unix在內,還沒有更新他們的名字伺服器到當前的BIND 8,仍然執行老版本的named。但必須注意named.boot檔案的格式與named.conf不同,不能混用。BIND 8提供了很多優秀的特性,因此最好立即升級到新版本。

  named.root檔案給出了Internet上的多個根名字伺服器,用於初始化named的緩衝區。藉助這些名字伺服器的幫助,一臺名字伺服器能對整個Internet進行查詢。一般不需要改變這些檔案的內容,但是如果要建設一個內部網,不與Internet連線,就不需要named.root中的這些根名字伺服器的地址,而要更改為自己網路內的根名字伺服器的地址。事實上,沒有任何內部網路能和Internet相比擬,需要使用多臺根名字伺服器來維護其域名解析系統,直接設定一臺或幾臺名字伺服器,並指定客戶計算機使用這些名字伺服器就滿足要求了。

  • zone資料檔案的格式

  @  IN  SOA  freebsd.example.org.cn. root.freebsd.example.org.cn. (

        1998012314  ; Serial

        3600  ; Refresh

        900  ; Retry

        3600000  ; Expire

        3600 )  ; Minimum

  IN  NS  freebsd.example.org.cn.

1  IN  PTR  localhost.

  這是根據計算機的名字和域名產生的localhost.rev檔案,這個檔案定義了對127.0.0.0這個反向zone的反向名字解析資料,可以用於從IP地址查詢主機的名字。

  第一個設定定義了一個SOA記錄,這個型別的記錄定義了包含一個zone的開始,並用於設定zone中資料重新整理時間等引數。在這個記錄中,@代表一個zone,由於這個設定檔案中沒有設定它的值,那麼它就是named.con f中的定義語句中zone的值,這裡就為0.0.127.in-addr.arpa。空白字元分隔之後為IN,這是用於表示定義的關鍵字,SOA表示這一行的型別為SOA記錄,接下來的freebsd.example.org.cn. 為這臺主機的全名,注意,這裡以 ”.” 結尾,如果在名字解析配置檔案中不以點結尾,named將自動附加上當前 zone的值;此後給出了一個聯絡用的email地址,這裡為root@freebsd.expampleorg.or g.cn,但是由於@在設定檔案中有特殊含義,因此使用點代替;

  再後面就是SOA記錄的引數,這些引數使用了括號,並分在幾行分別設定,這主要是為了使得設定更為清楚,將它們放在同一行內也可以。SOA記錄的引數有序列號,用於標識SOA記錄資料 ── 其他名字伺服器使用這個資料與自己緩衝區內的資料對比,來判斷這個zone的資料是否更新,否則就沒有必要傳輸全部zone的資料。因此可以使用日期來表示不同的序列號,以使得更改過SOA記錄之後,其他名字伺服器能即使重新整理資料;重新整理時間 ── 用於告訴其他名字伺服器何時來檢查zone中的資料是否更新,這裡配置為1小時(3600秒),這個時間間隔對於不經常改變的伺服器來講太小了,應該配置為一天或更大;第三個引數為連線的嘗試次數;然後是過期時間,表示一旦某個zone的正式名字伺服器不能提供其服務,其他名字伺服器在其緩衝區中儲存多久該zone的緩衝資料;最後一個引數指出其他名字伺服器緩衝這個檔案內容的最小時間間隔,在這個間隔內不應該重新整理該zone的名字解析資料。

  當括號結束之後,這個SOA設定項就結束了。而第二項設定定義了一個名字伺服器記錄,這個設定直接用空格和IN 開頭,表示這一項仍然使用上一項中的設定,這裡就是@。NS代表這一項定義是名字伺服器型別,最後給出了名字伺服器的名字freebsd.example.org.cn.,表示這個zone的名字解析資料位於這個名字伺服器中。

  第三項定義了一個反向查詢指標記錄PTR,第一列為1,由於沒有使用點結尾,因此其全形式應為127.0.0.1 ,第三列PTR表示這個記錄為PTR記錄,是給定IP地址返回名字的查詢形式,最後一列即是127.0.0.1的名字localhost。

定義自己的名字服務

  緩衝形式的名字服務只能用於名字查詢,但沒有定義任何名字資料。如果要想讓自己的網路有一個域名,併為其他計算機都提供服務,就必須使用完整配置的名字伺服器。

  • 正向解析zone

  第一步要為自己的子域在/etc/namedb/named.conf檔案中定義zone,並修改設定檔案 named.conf。在named.conf檔案中,首先要刪除forward的相關設定,使伺服器不僅用於轉發請求,也能擁有自己的名字解析資料庫。然後再增加一項新zone的定義:

  zone "bsdgroup.example.org.cn" {

    type master;

    file "db.bsdgroup";

};

  這一項描述了bsdgroup.example.org.cn的zone對應的配置檔案為db.bsdgroup。其中 type master表示這臺DNS伺服器為這個zone的主伺服器,對於一個zone來講,可以由多個DNS 伺服器提供服務,以提供一定的備份能力。當為一個zone使用多個DNS伺服器的時候,通常可以設定一個主伺服器,而其他伺服器為輔伺服器,輔伺服器將從主伺服器上獲得zone的解析資料,而本地檔案只是用於萬一主伺服器出現故障的情況。

  更改過named.conf中的zone設定項,就能建立zone的解析資料檔案db.bsdgroup,用於儲存zone內的解析資料。

  @      IN  SOA ns.bsdgroup.example.org.cn. admin.example.org.cn. (

             1999010801 ; Serial (date, 2 digits version of day)

             86400  ; refresh (1 day)

             7200  ; retry (2 hours)

             8640000 ; expire (100 days)

             86400 ) ; minimum (1 day)

      IN  NS  ns.bsdgroup.example.org.cn.

      IN  NS  ns1.bsdgroup.example.org.cn.

      IN  MX  10 ns

      IN  MX  20 ns1

ns     IN  A  192.168.4.21

ns1     IN  A  192.168.4.22

www     IN  CNAME freebsd.example.org.cn.

  這個設定檔案中首先為這個zone定義了SOA記錄,接下來定義了服務於這個zone的兩個名字伺服器。當為一個zone定義名字伺服器時,有的管理員以為將名字伺服器設定的越多越能提供備份,其實並不是這樣。如果定義的一臺名字伺服器,其named.conf(或named.boot)設定檔案中並沒有設定它為這個zone服務,那麼該名字伺服器上就沒有這個zone的解析資料,這就導致一些客戶從這個名字伺服器中查詢這個zone的資料失敗。這個配置錯誤就是Internet中經常發生的Lame Server錯誤,一些老版本的named不能檢測並糾正這個錯誤,就會導致網路上部分客戶計算機不能解析這個zone。同樣,多個名字伺服器之間還應該保持zone資料一致,正確劃分好主/輔伺服器可以很好的解決這個問題。

  然後又針對這個zone定義了兩個MX記錄,表示對應於這個zone的郵件伺服器為ns和ns1,這樣在電子郵件中的地址中,就不需要使用具體的計算機名字ns.bsdgroup.example.org.cn,而可以直接使用bsdgroup.example.org.cn。其中ns的引數為10,ns1的引數為20,用於標識不同郵件伺服器的優先順序,一個郵件總是首先向低優先順序的郵件伺服器傳送,只有當這個伺服器出現故障時,才會嘗試其他的郵件伺服器。

  這個檔案中還定義了幾個A記錄,這個記錄具體定義ns和ns1的IP地址,然後定義了一個 www的計算機,但這只是freebsd.example.org.cn的一個別名。

  這個zone是對該zone中的計算機進行正向名字查詢,從名字返回相應的IP地址,進一步可以配置反向查詢zone,輸入要查詢的IP地址,返回正確的主機名字。

  • 反向解析zone

  前面提到的localhost.rev就是一個反向查詢zone檔案。因此要定義其他反向解析zone,就與它相似。首先在named.conf中增加一個設定語句:

  zone "4.168.192.in-addr.arpa" {

    type master;

    file "bsdgroup.rev";

};

  網路地址以反方向的方式寫出,並使用in-addr.arpa字尾,表示一個反向查詢zone為192.168.4。然後建立反向解析資料bsdgroup.rev: @  IN  SOA  ns.bsdgroup.example.org.cn. admin.example.org.cn. (

        1998012314  ; Serial

        3600  ; Refresh

        900  ; Retry

        3600000  ; Expire

        3600 )  ; Minimum

  IN  NS  ns.bsdgroup.example.org.cn.

21  IN  PTR  ns.bsdgroup.example.org.cn.

22  IN  PTR  ns1.bsdgroup.example.org.cn.

  注意,這裡正向解析和反向解析位於同一臺伺服器上,這只是一種較簡單的情況,但對 Internet上更廣泛的複雜情況,並不總是如此。

  • 維護名字伺服器

  當完成了這一步之後,就可以把本網路上所有計算機的解析資料,使用A記錄增加到 db.bsdgroup中,使用PTR記錄增加到bsdgroup.rev檔案中去,並重新啟動named守護程式,或者向named傳送SIGHUP訊號(使用kill或killall),使其重新讀取設定檔案。那麼所有使用這臺計算機作名字伺服器的計算機將能正確查詢相應的名字和IP。

  但是,外部的計算機並不知道有這個名字伺服器的存在,因此外部計算機還無法查詢到正確的結果。因此就需要將這個名字伺服器,及其提供伺服器的域,登記到Internet上的正式名字伺服器上,以便這個名字伺服器上的zone資料透過正式伺服器釋出到整個Internet。最方便的做法是將這個名字伺服器登記到其上一級名字伺服器上,如在example.org.cn的名字伺服器中可以指定bsdgroup.example.org.cn子域的zone設定及名字伺服器。

  bsdgroup.example.org.cn.  IN  NS  192.168.4.21

  此後,外部計算機才能查詢bsdgroup這個域的內容。

  這個例子中使用了兩個名字伺服器ns和ns1,為了保持兩個伺服器中的資料一致,兩個伺服器一個需要作為主伺服器,另一個必須作為輔伺服器。主伺服器ns在配置檔案named.conf中使用 type master來說明,而輔伺服器ns1使用type slave來說明:

  zone "bsdgroup.example.org.cn" {

    type slave;

    file "db.bsdgroup";

};

  這使得ns1首先嚐試從ns(192.168.4.21)中獲得zone的配置資料,如果不能成功再從本機配置檔案中獲得。這樣既能起到備份作用,又能保持解析資料儘量一致。

  named在啟動和執行的過程中將不斷向控制檯列印資訊,這些資訊也被寫入/var/log/messages 檔案中。檢視這些檔案可以判斷是否有錯誤發生。

  Feb 15 01:26:17 roke named[6091]: starting. named 8.1.1 Sat Feb 14

    00:18:20 MET 1998 ^Iwb@example.org.cn:/var/tmp/bind-8.1.1/src/bin/named

Feb 15 01:26:17 roke named[6091]: cache zone "" (IN) loaded (serial 0)

Feb 15 01:26:17 roke named[6091]: master zone "0.0.127.in-addr.arpa"

    (IN) loaded (serial 1)

Feb 15 01:26:17 roke named[6091]: listening [127.0.0.1].53 (lo)

Feb 15 01:26:17 roke named[6091]: listening [129.240.230.92].53 (ppp0)

Feb 15 01:26:17 roke named[6091]: Forwarding source address is [0.0.0.0].1040

Feb 15 01:26:17 roke named[6092]: Ready to answer queries.

  此外,隨著Internet的發展,根DNS伺服器也會不斷更新,因此保持自己的DNS伺服器中 root.hints(或named.root)檔案與Internet上的真實根檔案伺服器同步也是非常重要。通常可以使用dig來從一個根檔案伺服器上取得這個檔案:

  # cd /etc/namedb

# dig @rs.internic.net . ns >root.hints.new

  如果一切正常,就可以將root.hints.new複製為named.root,並重新啟動named。此外還有一些常用的工具程式有nslookup,dig,dnswalk,named-xfer等,能用來分析DNS設定,幫助解決設定問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章