伺服器架設篇 - RedHat 9

第十七章、簡易 DNS 伺服器設定

關於 domain name server 的設定方法介紹喔!

最近更新時間: 2003/10/08

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
我們知道電腦網路系統只認識所謂的 IP ,但是, 無論任何時刻,主機名稱與 IP 對應的查詢都是很重要的一環!因為人腦對於數字組成的 IP 的記憶實在是.....不怎麼樣,所以,才會發展出可以經由主機名稱(hostname)對應到電腦 IP 的一個模式,這樣我們就可以輕輕鬆鬆的記住主機名稱即可,電腦 IP 那就交給 Domain Name System 去搞定吧!那個 DNS 系統是由柏克萊大學發展的 bind 這個套件(Berkeley Internet Name Domain)所提供的啦!基本上,DNS 最大的工作就是將 Hostname 對應到 IP 這個功能了,不過,要架設一個成功的 DNS 主機的話,還得要對於 DNS 的運作很清楚才行啊!否則架設的不對,還反而會造成大家的問題喔!這個章節當中, 要學會的資料其實還蠻多的,需要瞭解:什麼是正解、什麼是反解、什麼是Zone、客戶端 (Client) 是經由什麼咚咚來查詢得到 IP 的呢?!以及 DNS 的授權問題等等,哇!趕快清一清腦門,要好好的用功囉! ^_^

原理部分

    要設定 DNS 之前,必須要瞭解什麼是 FQDN 呢?什麼是 Hostname 與對應到 IP 的流程呢?還有,為什麼要有 DNS 這個系統呢?以及我們常常會提到的『什麼是正解、反解啊!』這些都是很基礎的咚咚,得要理解得很清楚才行!這個 DNS 可以說是架設網站的第一步啦!因為我們總是希望自己的網站容易讓人家來記憶嘛!那麼總不能叫大家被您的主機所在的 IP 吧!您說是吧!因此,申請一個合法的主機名稱,或者設定一部經過合法授權的 DNS 主機,那可是相當重要的一件事啊!
     

    什麼是 Domain Name System:


     
    DNS 的全名是『 Domain name system 』是也,中文譯名為『領域名稱系統』,這個咚咚的用途是什麼哇!為什麼我們的電腦或者是 Internet 一定需要他 ( 尤其是以 WWW 的方式來上網時 ) ?呵呵!他最大的用途就是『造福懶惰與記憶性薄弱的人類』哈哈!沒錯!為什麼說他是造福人類呢?且聽我娓娓道來:
     
    • /etc/hosts 的歷史:

    • 還記得我們在前幾章當中提過的 網路基礎 裡面吧?目前在 Internet 上面通用的通訊協定為 TCP/IP ,那麼資料傳送是以 TCP 封包來傳送,他還是建置在 IP 協定之上的,而眾所皆知的, IP 是由四組 8 bit 的數字組成的,也就是類似『 xxx.yyy.zzz.www 』這樣的型態,好啦,那麼如果我們要連上某一部電腦,就要在網址列輸入該電腦主機的 IP 才能連接的上,如果是一部或兩部電腦那還無所謂,如果像目前這種 Internet 的主機數目.....嘿!誰記得住這麼多的 IP 呀!?由於 IP 是一堆數字所組成的,實在不容易被懶惰與記憶性薄弱的人類所接受 ( 說的是鳥哥自己 ....) ,那如果將這些數字以『名字』來取代呢?那又如何?也就是說,只要輸入一個『電腦的名字』而我們的系統就會自動的將這個名字轉成電腦瞭解的 IP !嘿嘿!如此一來,我要記得『名字』總是比 IP 容易的多了!早期的人類早就想到這個簡單又偷懶的方式了,那就是 /etc/hosts 這個檔案的由來!例如,只要您輸入『 ping -c 5 localhost 』您的 Linux 馬上可以印出 127.0.0.1 這個 IP , Why ?您去看一下 /etc/hosts 就知道為什麼了!所以囉,只要將您常常上網的『網址對應的 IP 』寫到這個 /etc/hosts 底下,您的 IP 搜尋速度就會快上很多~(註:再次強調,在您的私有網域內部,最好將所有的 IP 都寫入這個檔案中啦!)
       
    • DNS 的歷史:

    • 早期(大約20~30年前)的電腦可是貴重物資,一般人是可望而不可及的,因為電腦數量太少,所以可以使用 /etc/hosts 來記憶這些 IP 與名稱的對應。但是在現代, Internet 上面這麼多主機,並且常常會突然的『噗通』又多出一部主機來服務,那麼我們總不能一個一個的將他輸入在 /etc/hosts 裡面吧!?對呀!真不聰明!所以後來的這個時候就有所謂的『領域名稱解析系統, DNS』出現啦!DNS 利用類似樹狀目錄的型態,將主機名稱的管理分配在不同層級的 DNS 主機當中,經由分層管理,所以每一部主機的記憶的資訊就不會很多,而且異動上面也相當的容易修改!那麼這個 DNS 的功能您知道了嗎?對啦!就是『將電腦主機的名稱轉譯成 IP 』就是了!當然囉,他的額外功能還很多!總之,他的最大功能就是『讓有意義的,人類較容易記憶的主機名稱(英文字母),轉譯成為電腦所熟悉的 IP 位址!』舉個例子來說好了,奇摩雅虎的網站的 IP 是 202.1.237.21 ,所以您可以在您的瀏覽器上面輸入『 http://202.1.237.21 』來連上奇摩雅虎!不過,我想沒有幾個人能夠將這個 IP 背的起來的吧?!反之,我們卻都知道奇摩雅虎的網址為 tw.yahoo.com ,那麼您只要輸入『 http://tw.yahoo.com 』就可以連上 Internet 啦!很容易記憶吧!
       
      /etc/hosts  :直接在檔案內輸入主機名稱對應的 IP 來查詢;
      DNS 系統    :在 Client 端以 resolver 的方式到 DNS 主機上面搜尋 IP 與名稱的對應!
       
    • Fully Qualified Domain Name ( FQDN )

    • 在提到名稱與 IP 的解析之前,我們還必需來討論一下『什麼是 domain name 與 host name ?』也就是,領域名稱與主機名稱。在討論這個主題之前,我們來聊一聊比較生活化的話題,請注意喔!底下的例子不涉及政治!呵呵!先提一下,免得大家敏感:
     
      • 我們曉得全台灣有很多個『李登輝』,這個『李登輝』就代表每一個獨立的個人!但是您怎麼知道這個李登輝跟前總統李登輝是否為同一個人?咦!每個李登輝都來自不同的縣市嘛!對啦,所以我們就以縣市來做為區分,所以有台北的李登輝跟高雄的李登輝,這兩個就可以分辨了!嗄!萬一不幸,台北還有兩個李登輝怎麼辦?那就用鄉鎮來分呀!所以有台北、三芝的李登輝跟台北、仁愛的李登輝,如果我們將他列出來,可以這樣看:
      • 李登輝、三芝、台北
        李登輝、仁愛、台北
        李登輝、高雄
        ....
        是否就可以分辨他的不同點了呢?呵呵!沒錯!就是這樣!
       
      • 另外一個例子可以使用電話號碼來看,假如高雄有個 1234567 而台南也有個 1234567 ,那麼(1)您在高雄直接撥接 1234567 時,他會直接掛入高雄的 1234567 電話中,(2)但如果您要撥到台南去,就得加入(06)這個區碼才行!我們就是使用區碼來做為辨識之用的!
     
      是否還不清楚我要說什麼?呵呵!我們常常會發現主機名稱都是 www 的網站,例如 www.gov.tw, www.seednet.net, www.hinet.net 等等,那麼我們怎麼知道這些 www 名稱的主機在不同的地方呢?就需要給他領域名稱囉!也就是 gov.tw, seednet.net, hinet.net 等等的不同,所以即使您的主機名稱相同,但是只要不是在同一個領域內,那麼就可以被接受囉!基本上,我們知道 DNS 是有層級之分的,那麼每個層級的 Hostname 與 Domain name 可是不一樣的咚咚ㄋㄟ~我們可以使用我們的主機來加以說明,如下圖所示:

圖一、分層次的 DNS 架構 ( Hostname 與 Domain name )
    在上面的例子當中,第二層裡面,那個 .tw 是 domain name ,而 com, edu, gov 則是主機的名稱,而在這個主機的名稱之管理下,還有其他更小網域的主機,所以在第三層的時候,基本上,那個 edu.tw 就變成了 domain name 了!而成大與中山的 ncku, nsysu 則成為了 hostname 囉!呵呵!以此類推,最後得到我們的主機那個 aerosol 是主機名稱,而 domain name 是由 ev.ncku.edu.tw 那個名字所決定的!自然,我們的主機就是讓管理 ev.ncku.edu.tw 這個 domain name 的 DNS 主機所管理的囉!這樣是否瞭解了 domain name 與 hostname 的不同了呢?
     

    DNS 的查詢過程:


     
    接下來我們要談一談,那麼 DNS 的 (1)架構是怎樣? (2)查詢原理是怎樣?總是要先知道架構才能知道如何查詢的吶!所以底下我們先來介紹一下整體的架構。
     
    • DNS 的架構:

圖二、DNS 層階概念示意圖
      上面就是一個簡單的 DNS 階層架構囉,最上方一定是 . 這個 root 的 DNS 主機,他底下管理的就只有 com, edu, gov, mil, org 與以國家為分類的第二層的主機名稱了!例如台灣地區最上層的領域名稱是以 .tw 為開頭,管理這個領域名稱的這部機器的 IP 是在台灣,但是他的記錄則是記錄在 . (root)那部機器裡面的!還有其他的國家的最上層如 .cn 指的是大陸,.de 指的是德國一樣!那麼每個國家之下記錄的主要的下層有哪些領域呢?呵呵!主要就是有這六大類:
       
      名稱
      代表意義
      com
      公司、行號、企業
      org
      組織、機構
      edu
      教育單位
      gov
      政府單位
      net
      網路、通訊
      mil
      軍事單位
       
      其實最早之前在 . (root)之下只有這六大類的 domain name ,但是網路成長的速度太快了,因此後來又多出這些以國碼來分的 domain name ,如此一來,在該國家之內,只要向該國家申請 domain name 即可,不需要再到最上層去申請囉!也因此,在這些國碼之下,還是有這六大類的 domain name 為主的哩!當然啦,在目前,由於網際網路持續的發燒,說實在的 domain name 實在是有點不太夠用,所以又有相當多的領域名稱被設計出來,例如目前台灣 ISP 提供的 .idv.tw 的個人網站啦!
       
      好了,再強調一次, DNS 系統是以所謂的階層式的管理,所以,請注意喔!那個 .tw 只記錄底下那一層的這六個主要的 domain 的主機而已!至於例如 edu.tw 底下還有個 ncku.edu.tw 這部機器,那就直接授權交給 edu.tw 那部機器去管理了!也就是說『每個上一層的 DNS 主機,所記錄的資訊,其實只有其下一層的主機名稱而已!』至於再下一層,則直接『授權』給下層的某部主機來管理囉!呵呵!所以您就應該會知道 DNS 到底是如何管理的吧! ^_^ 會這樣設定的原因不是沒有道理的!這樣設計的好處就是:每部機器管理的只有下一層的 hostname 對應 IP 而已,所以減少了管理上的困擾!而下層 Client 端如果有問題,只要詢問上一層的 DNS server 即可!不需要跨越上層,除錯上面也會比較簡單呢!
       
    • DNS 的搜尋流程:

    • 剛剛說過 DNS 是以類似『樹狀目錄』的型態來進行名稱的管理的!所以每一部 DNS 主機都『僅管理下一層 DNS 主機的名稱轉譯』而已,至於下層的下層,則『授權』給下層的 DNS 主機來管理啦!這樣說好像很繞口,好吧!我們就以下圖來說一說原理囉:

圖三、DNS 主機查詢流程示意圖
      首先,當您在網址列輸入 http://aerosol.ev.ncku.edu.tw 時,您的電腦就會依據 /etc/resolv.conf 所提供的 DNS 的 IP 去進行連線查詢,好了,由於目前最常見的 DNS 主機就屬 Hinet 的 168.95.1.1 這個 DNS 了,所以我們就拿他來做例子吧!嗯!這個時候, hinet 的這部主機會這樣工作:
     
      1. 先查看本身有沒有紀錄:剛剛說過啦,由於 DNS 是層階式的架構,任何一部 DNS 都僅記錄下一層裡面的主機名稱對應的 IP 而已,由於 hinet 並非學術網路裡面的主機,所以自然也就沒有辦法直接提供給 client 端關於 aerosol.ev.ncku.edu.tw 這部機器的 IP 了,所以啦,一般而言,這個時候 168.95.1.1 就會向最頂層,也就是 . (root) 的主機查詢 .tw 這部機器的位址;

      2.  
      3. 向最頂層 ( root )查詢:由於 168.95.1.1 沒有紀錄我們主機的 IP ,這個時候他就會向『最頂層』的 . (root) 這部主機來查詢 . (root) 的下一層,也就是 .tw 這部機器的資料了!這個時候, . (root) 就會告訴 168.95.1.1 說『嘿!您要查 .tw 這個網域的管理者呀!?喝!我這裡有  .tw 這個網域的管理的主機之 IP 資訊,您可以直接去找他!』;

      4.  
      5. 向第二層查詢:168.95.1.1 接著又到 .tw 去查詢,而該部機器管理的又僅有 .edu.tw, .com.tw, gov.tw... 那幾部主機,經過比對後發現我們要的是 .edu.tw 的網域,所以這個時候 .tw 又告訴 168.95.1.1 說:『您要去管理 .edu.tw 這個網域的主機那裡查詢,我有他的 IP !』;

      6.  
      7. 向下層持續查詢:好了,一步一步下來, .edu.tw 可以查到管理 .ncku.edu.tw 的主機 IP ; .ncku.edu.tw 可以查到管理 .ev.ncku.edu.tw 的主機 IP ,而最後我們 aerosol.ev.ncku.edu.tw 就可在管理 .ev.ncku.edu.tw 網域的那部主機的設定紀錄當中查詢到啦!

      8.  
      9. 記錄暫存記憶體:查到了 IP 之後,這部 168.95.1.1 的 DNS 機器總不會在下次有人查詢 aerosol.ev.ncku.edu.tw 的時候再跑一次這樣的流程吧!粉遠粉累的吶!而且也很耗系統的資源與網路的頻寬,所以呢, 168.95.1.1 這個 DNS 很聰明的會先記錄一份 aerosol.ev.ncku.edu.tw 對應 IP 的資訊在自己的暫存記憶體當中,以方便下一次又有人對同一個主機名稱的要求之查詢!最後則將結果回報給 client 端!當然啦,那個記憶在 cache 當中的資料,其實是有時間性的,當過了 DNS 設定記憶的時間(通常可能是 24 小時),那麼該記錄就會被釋放喔!
     
      由這樣的分層負責您發現了什麼?嗯!那就是:
     
      • 當一個『合法』的 DNS 主機裡面的設定修改了之後,來自世界各地任何一個 DNS 的要求,都會正確無誤的顯示正確的主機名稱對應 IP 的資訊,因為他們會一層一層的尋找下來,所以,要找您的主機名稱對應的 IP 就一定得要透過您的上層 DNS 主機的紀錄才行!所以只要您的主機名字是經過上層『合法的 DNS』主機的設定的,那麼就可以在 Internet 上面被查詢到啦!呵呵!很簡單維護吧,機動性也很高。

      •  
      • 在主機的暫存記憶體記錄當中,由於是有時間性的,所以當您的主機名稱在 DNS 當中被修改了之後,但是由於之前的舊資訊還記憶在其他的 DNS 主機的暫存記憶體裡面,所以啦,可能在別人以非您的 DNS 主機來查詢您的主機名稱時,就會得到先前的舊資訊,這個時間差不多可能是 10 分鐘到 2 天左右,這也是為什麼我們常說當您修改了一個 domain name 之後,可能要 2 ~ 3 天後才能全面的啟用的緣故啦!
     
      好啦!哇!既然 DNS 這麼棒,然後我們又需要架站,所以需要一個主機的名稱,因此,那麼我們需要架設 DNS 了嗎?!哈哈!當然不是,為什麼呢?剛剛鳥哥提到了很多次的『合法』的字眼,因為他就牽涉到『授權』的問題了!我們在前面的『申請合法的主機名稱』當中也提到,只要主機名稱合法即可,不見得需要架設 DNS 的啦!
    • DNS 使用的 port number :

    • 好了,既然 DNS 系統使用的是網路的查詢,那麼自然需要有開 Listen 的 port 囉 ( 監聽的埠號 )!沒錯!很合理!那麼 DNS 使用的是那一個 port 呢?那就是 53 這個 port 啦!您可以到您的 Linux 底下的 /etc/services 這個檔案看看!搜尋一下 domain 這個關鍵字,就可以查到 53 這個 port 啦!但是這裡需要跟大家報告的是,通常, DNS 查詢的時候,是以 udp 這個較快速的資料傳輸協定 ( protocol ) 來查詢的,但是萬一沒有辦法查詢到完整的資訊時,就會再次的以 TCP 這個協定來重新查詢的!所以啟動 DNS 的 daemon (就是 named 啦) 時,會同時啟動 TCP 及 udp 的 53 這個 port number 喔!
       

    關於『授權』的意義:


     
    很多朋友都認為『架設 DNS 可以設定主機的名稱,而我要架站需要主機有名字,因此一定需要架設 DNS ,只要有 DNS,我的主機就可以有名字了!』是這樣嗎?當然不是!這是錯誤的觀念!怎麼說呢?從上面的圖示當中,您應該不難發現,當我要搜尋 aerosol.ev.ncku.edu.tw 主機時,就需要向管理 .ev.ncku.edu.tw 這個網域的那部機器查詢才行,而要查詢 .ev.ncku.edu.tw 則需要在 .ncku.edu.tw 上面詢問才可以!這是因為『上層 DNS 主機 .ncku.edu.tw 已經將 .ev.ncku.edu.tw 這個網域的管理權 "授權" 給 green.ev.ncku.edu.tw 這部機器,當有人要查詢 .ev.ncku.edu.tw 這個網域的主機 IP 時, .ncku.edu.tw 將會把查詢的任務直接轉給 green.ev.ncku.edu.tw 去管理了!從此, .ncku.edu.tw 這個網域的管理主機,將不會再接管 ev.ncku.edu.tw 這個網域的名稱管理!』是否很像人類社會的『授權』的概念?也就是說,當您老闆充分的『授權』給您某項工作的時候,從此,要進行該項工作的任何人,從老闆那邊知道您才是真正『有權』的人之後,都必須要向您請示一樣! ^_^!所以囉,如果您要架設 DNS ,而且是可以連上 Internet 上面的 DNS 時,您就必須要透過『上層 DNS 主機的授權』才行!這是很重要的觀念喔!等一下我們在底下會介紹一個如何架設一個『經過合法授權的 DNS 主機』哩!
     
    其實,如果將上面的話改換成:『我要架站,所以我要讓我的主機有一個合法的名字!』那樣就合理了!怎麼說呢?因為我可以請上層 DNS 幫我設定主機名稱對應 IP 就可以啦!如此一來,要找我的 hostname 對應 IP 的人,都可以直接在我的上層 DNS 裡面找到,根本不需要透過我的 Linux 主機吶!例如我們研究室的 aerosol.ev.ncku.edu.tw 就可以在 green.ev.ncku.edu.tw 這部管理 DNS 的 server 上面找到ㄋㄟ~不必親自來我的 aerosol.ev.ncku.edu.tw 上面找!也就是說,藉由 DNS 系統最大的功能『主機名稱轉譯成 IP 』這個動作,那麼您只要向任何一個合法的 DNS 主機申請一個『主機名稱, hostname 』給您的 Linux 主機,讓大家都可以藉由該 DNS 主機來查詢到您的 Linux 之 IP ,就可以使用該主機名稱來架站啦!就是這麼簡單!
     
    好了,那麼您就應該知道了,要讓您的主機名稱對應 IP 且讓 Internet 上面的電腦都可以查詢的到,就需要:
     
    1. 上層 DNS 的授權讓您設定 DNS 主機,或者是;
    2. 直接請上層 DNS 主機來幫您設定!
     
    這兩種模式,那麼哪種模式比較好呢?這沒有一定的答案,底下我們來談一談,您比較適合哪一種模式的設定呢?
     

    網站代管還是自己設定 DNS:


     
    如果您曾經申請過 domain name 的話,例如向 Hinet 或 Seednet 等台灣各大主要 ISP 申請 domain name 的話,應該都會知道有兩種主要的模式,就是剛剛上頭提到的 DNS 授權,或者是直接交給 ISP 來管理。交給 ISP 管理的,就可以稱作是網站代管啦!當然啦,如果您是學校單位的話,或者是企業內部的小單位,那麼就得請您向上層 DNS 主機的負責人要求囉!無論如何,您只能有兩個選擇就是了,要不就是請他幫忙您設定好 hostname 對應 IP ,要嘛就是請他直接將某個 domain name 段授權給您做為 DNS 的主要管理網域。那麼我怎麼知道那個方式對我比較好呢?請注意,由於 DNS 架設之後,會多出一個監聽的 port ,所以理論上,是比較不安全的!因此,能不設當然就不要設定比較好囉!所以,這裡的建議如下:
     
    • 需要架設 DNS 的時機:
      • 您所負責需要連上 Internet 的主機數量龐大:例如您一個人負責整個公司十幾部的網路 Server ,而這些 Server 都是掛載您的公司網域之下的。這個時候想要不架設 DNS 也粉難啦!
      • 您可能需要時常的修改您的 Server 的名字,或者是您的 Server 有隨時增加的可能性與變動性;
       
    • 不需要架設 DNS 的時機:
      • 網路主機數量很少:例如家裡或公司只有需要一部 mail server 時;
      • 您可以直接請上層 DNS 主機管理員幫您設定好 Hostname 的對應時;
      • 您對於 DNS 的認知不足時,如果架設反而容易造成網路壅塞的情況;
      • 架設 DNS 的費用很高時!
       

    正解與反解的 Zone 意義:


     
    講了這許多,還得再提一提關於正解、反解與 Zone 的問題才行啊!
      
    • 什麼是正解與反解?

    • 我們在前頭的開宗明義當中就提到啦, DNS 系統本來最主要的功能就是在轉譯 hostname 與 IP 囉,由於電腦在網路上面其實認識的只是 IP 啦,所以,一般來說,我們稱『由 hostname 去尋找出 IP 的程序稱為 正解 』,至於由 IP 去查詢得到 hostname 那就被稱為反解了!正反解的設定情況是差異性很大的!怎麼說呢?
       
      • 正解:在正解的情況之下,我們可以透過主機分層設定的方式來查詢(例如上面的一些圖示囉!),而因為是 Hostname 對應 IP ,所以即使在不同網段的 IP ,仍然可以寫在同一個 domain 之中!例如我的主機是在學校裡面 ( 140.116.xxx.xxx ),但是我申請的是 vbird.idv.tw 這個 domain 的名稱,而很多朋友則是以 ISP 提供的 IP ( 例如 61.xxx.xxx.xxx ) 來進行 *.idv.tw 的申請的!呵呵!那麼一來,我的 vbird.idv.tw 就與大家的 *.idv.tw 在同一個 domain 的設定當中囉,但是這些主機卻是在不同的網域之中喔(140.116.xxx.xxx 不會跟 61.xxx.xxx.xxx 在同一個網段中吧! ^_^) !所以囉,任何一部 DNS 都可以將您的 IP 寫入他們的正解當中囉!

      •  
      • 反解:但是反之則不行!怎麼說呢?因為當初 IP 規劃分配的時候,就必需要一個區域一個區域的劃分的,所以當然不可能同一個網段的 IP 在不同的地方出現吧!因為這涉及到 TCP/IP 的協定與 router 的架構ㄋㄟ~因此,同一個 IP 網段的反解就真的得要透過上層主機的設定才行了!所以由 IP 反查 hostname 的話,那麼大部分的情況下,就需要向直屬的上層申請了!
       
      舉個例子來說:我想要自己的領域名稱的名字,所以我可以去外面的 ISP 申請註冊一個合法的名字來架設我的 DNS !從此之後,別人就可以經過我的 DNS 正解查詢得到我的主機 IP。但是如果要由 IP 反查回 hostname 的話,我就『一定必需要』請管理我主機所在網域的上層的 DNS 管理員來設定才行ㄋㄟ!這也是目前比較麻煩的地方,因為正解您可以自行設定,但是反解則必需要請上層的管理員設定!如果是向 ISP 申請的 IP ,那就得向 ISP 申請反解名稱改換,這個部分通常很麻煩~
       
    • 什麼是 Zone ?

    • 知道正反解之後,再來要來知道一下,什麼又是 Zone ( 區域 ) 呢?說的簡單一點的話,一個正解或反解的設定就是一個 zone ,例如我要規範 vbird.idv.tw 這個 domain 的設定內容,那麼他就是一個 zone !通常,『一個設定檔就是一個 zone 』!在我的例子中,我的 vbird.idv.tw 這個 domain 的 DNS 設定檔裡面,必需要有:
       
      • hint( root ) 的設定;
      • vbird.idv.tw 這個 domain 的正解設定;
      • localhost 的正解設定;
      • localhost 的反解設定。
       
      那麼我就有四個 zone 了!如果以我們系館的 DNS 主機 green.ev.ncku.edu.tw 來說的話,他至少要有:
       
      • hint(root);
      • ev.ncku.edu.tw 正解;
      • ev.ncku.edu.tw 反解以及 ;
      • localhost 正解;
      • localhost 反解。
       
      等五個 zone 的定義囉!嘿!您會發現,我沒有 vbird.idv.tw 這個 domain 的反解設定~為什麼呢?請參考上面的說明吧!因為反解需要要求 IP 協定的上層來設定才行!並且,需要特別留意的是,『每一個 zone 都有一個設定檔,而規定這些設定檔檔名的,就交給 /etc/named.conf 這個參數檔來設定!』也就是說, DNS server 使用的 bind 這個套件中,他的主要參數檔是 /etc/named.conf ,而這個檔案當中就是記錄了每一個 zone 的設定檔檔名!實際上,在設定正反解的,就是每一個 zone 的設定檔啦!
       
    • 正反解一定要成套嗎?

    • 好了,正反解需不需要成套產生,在這裡不用多說明了吧!? ^_^!請注意喔,在很多的情況下,尤其是目前好多莫名其妙的領域名稱產生出來,所以,常常會只有正解的設定需求而已。不過也不需要太過擔心啦,因為通常在反查的情況中,如果您是使用目前台灣地區最流行的 ADSL 上網的話,那麼 ISP 早就已經幫您設定好反解了!例如:211.74.253.91這個 seednet 的浮動式 IP 反查的結果會得到91.253.74.211.in-addr.arpa 這樣的主機名稱!所以在一般我們自行申請領域名稱的時候,您只要擔心正解的設定即可!不然的話,反正反解的授權根本也不會開放給您,您自己設定得很高興也沒有用呀! ^_^

架設 DNS 所需要的套件:

  • 安裝 DNS 套件: BIND

  • 終於廢話都說完了!相信您大概也有點累的吧!?鳥哥是蠻累的啦,因為手臂、肩頸酸痛的毛病頗嚴重....咦!講這個幹嘛!? @_@ 好啦,我們終於要來安裝 DNS 所需要的套件了!還記得前面提過的,我們要使用的 DNS 就是使用柏克萊大學發展出來的 BIND ( Berkeley Internet Name Domain, BIND ) 這個套件啦!那麼怎麼知道您安裝了沒?還記得基礎篇裡面的 RPM 嗎?對啦!就是使用 RPM 來檢驗囉:
     
    [root@test root]# rpm -qa | grep bind
    bind-9.2.1-4mdk         <==這個是用來安裝 Server 的
    bind-utils-9.2.1-4mdk      <==這個是用來做為 Client 端搜尋 domain name 的指令
     
    萬一沒裝怎麼辦?嗄!還問我ㄌㄟ~趕快將您的原版光碟拿出來,然後將他安裝上去先~不會安裝?請自行拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』去觀察一下 RPM 的用法吧!
  • BIND 的預設路徑設定:

  • 基本上, BIND 的主要設定檔為 /etc/named.conf這一支檔案,各種針對主機的設定值都在這個檔案中設定的!但是對於 hostname <--> IP 的對應關係,就需要由 zone 來設定了!但是這個 zone 的檔案名稱是在 /etc/named.conf 裡面規定的!所以,請注意喔,每一個 zone 的名稱都是可變的,但是需要在 /etc/named.conf 裡面命名好!此外,最好將 zone 規定出來的檔案直接放置到 BIND 的預設 zone 擺放的目錄,就是 /var/named 裡面去!比較好管理囉!
  • BIND 的升級:

  • 必須請大家注意的是,這個 DNS 的 53 port 其實也不是個很安全的咚咚,所以呢,非必要,其實是不太建議啟用 DNS 的啦!不過,如果真的要安裝的話,那麼請隨時注意您的 Linux distribution 是否有定時的公告的漏洞修補套件呢?這個真的很重要,因為鳥哥很久很久以前,就是被這個 port 53 給種植了一個蠕蟲,真是討厭的很! @_@

設定部分

    在 DNS 的設定上面,基本上,您必須要已經很清楚 zone 是什麼了,否則很難繼續設定喔!會搞的一塌糊塗的~無論如何,您一定要知道的是, bind 的設定檔,就是 /etc/named.conf 這個檔案,如果他不存在的話,請自行建立吧!另外,針對 DNS server 的類型大致上可以分為三類,分別是:
     
    • Master:這種類型的 DNS 本身含有領域名稱的設定檔(就是有Zone啦!),這個設定檔就是設定正解或者是反解的『Database』囉!所以他本身是具有提供 Internet 查詢所需的資料喔!例如我可以在我的主機上面設定提供 vbird.idv.tw 這個網域,那麼我的主機就是 master 類型的主機啦!
     
    • Slave:這種類型的主機本身不必直接由 DNS 系統管理員手動設定 DNS 的正反解資料庫檔案,而是對應到這部 Slave 所支援的 Master 主機去備份 DNS 的設定檔案資料,也就是說, Slave 會將 Master 上面已經訂定好的正反解對應資料檔案備份一份在自己的系統當中喔!( 註:當然囉,這個 Master 必須要開放 Slave 來更新 Slave 的資料對應檔喔! ) 此外,需要特別留意的是, Slave 主機並不是在 Master 掛點時才會『活起來』的,而是他與 Master 相同,都同時負責 Internet 上面的 domain 查尋!那麼架設這個 Slave 有什麼好處呢?呵呵!最大的好處就是『單點維護』啦!怎麼說呢?假設您有三部 DNS 主機,那麼萬一您所管理的網域之內要加入一部新的主機名稱,試問,您是要手動修改 3 部電腦還是僅修改一部電腦,其他的兩部讓他自動的更新其設定呢?這樣說親愛的朋友們,您應該可以理解了吧! ^_^!由於這個 Slave 並不是在 Master 掛點時才會活起來的一個 DNS 主機,因此,如果您向 ISP 訂定兩部 DNS 主機時,千萬要讓這兩部都活起來喔!因為不論是 Master 或是 Slave ,在 Internet 上面並非循序來查尋 domain name 的,而是先找到先贏的,所以我們不會曉得哪一部主機會先被查詢到!當然啦!因此兩部 Master/Slave 的機器就需要通通可以在 Internet 上面工作啦!
     
    • Cache-only:通常設定在防火牆上面的呢!這種類型的 DNS 主機沒有自己的資料庫,單純僅幫助 Client 端向外部的 DNS 主機要求資料而已~簡單的來說,他可以想成是一個『代理人』的角色而已~
     
    那麼 Master/Slave 的資料更新到底是如何動作的呢?請注意,Slave 是需要更新來自 Master 的 DNS 資料啊!所以當然 Slave 在設定之初就需要存在 Master 才行喔!好了, Master 與 Slave 的資料同步動作可以由底下的圖示來看:
     

    圖四、Master/Slave 的 DNS 主機資料同步過程
     
    • 判斷是否需要更新(1.1):我們可以在 Slave 設定好向 Master DNS 主機要求資料更新的週期時間,則每當到達更新時間時, Slave 會向 Master 索取是否需要更新資料,這個更新資料的判斷則以 Serial number 是否不同來進行更新喔
    • 判斷是否需要更新(1.2):除了由 Slave 向 Master 的查詢之外,Master 如果 DNS 資料經過變更,且想要 Slave 同步更新時,也可以主動的向 Slave 進行更新通知!
    • 資料同步化(2):最後當然就是資料由 Master 傳送到 Slave 來更新 Slave 的 DNS 資料囉!
     
    請注意,如果您想要架設 Master/Slave 的 DNS 架構時,兩部主機 (Master/Slave) 都需要您能夠掌控才行!網路上很多的文件在這個地方都有點『閃失』,請特別的留意啊!
     
    底下我們就來談一談兩個簡單的 DNS 主機,分別是 cache-only ( 單純 forward ) 與較為詳細的 Master 類型的 DNS 主機吧!至於 slave 與 Master 的設定蠻類似的,這裡我們就不多加介紹了!
     

    單純的 forward DNS 主機設定:


     
    什麼是單純的 forward DNS 的主機呢?
    好了,瞭解了 BIND 的預設路徑之後,我們知道了主要設定檔是 /etc/named.conf 這個檔案,但是偏偏我的 /etc 底下就沒有這個檔案!哈哈!因為您要自行建立啦! ^_^!在介紹怎麼設定每一個 zone 之前,我們先來玩一個簡單的 DNS 主機!就是 cache-only DNS server !也稱為 forward DNS 囉!顧名思義,這個 DNS server 只有 cache ( 快取 ) 的功能,也就是說,他本身沒有設定檔,完全是由對外的查詢來提供他的資料來源!因為他沒有設定檔,所以他就必須要連上一部合法的 DNS 才行!整個運作的流程可以看成是這個樣子:

圖五、Cache-Only DNS 主機的運作流程
    由上面的圖示來看,您可以發現,其實,我們 Client 端雖然都是使用 Cache-Only 的 DNS 再搜尋,但是,實際上 Cache-only 的主機都是請一個 ( Forwarders ) DNS 主機來幫忙查詢的,本身並沒有設定檔的啦!所以說,基本上, cache-only 的 DNS 只是一個中間傳遞資料的 DNS 主機罷了!那麼為什麼要架設這樣的一個 DNS 主機呢?閒閒沒事幹?當然不是!這是有原因的啦!底下說給您聽囉!
    什麼時候使用 cache-only DNS?
    在某些公司行號裡頭,為了預防員工利用公司的網路資源作自己的事情,所以都會規定 Internet 的連線上面相當的嚴格,所以說,有的時候,連自己都會被擋住!自然,這個 port 53 也就同樣的,可能被擋住啦!那麼我們知道說,如果沒有 port 53 這個 DNS ,那麼自然就無法解析出 hostname 對應 IP 囉!是的!怎麼辦?這個時候,您可以在『防火牆的那部機器上面,加裝一個 cache-only 的 DNS 服務!』這是什麼意思呢?很簡單啊!就是您自己利用自己的 firewall 與 DNS 去幫您的 Client 端解譯 hostname <--> IP 囉!因為 firewall 可以設定放行自己的 DNS 外出,而 Client 端的 DNS server IP 就設定自己的 firewall ,哈哈!這樣就可以取得轉譯啦!
    簡易的 cache-only DNS 設定:
    設定一個 cache-only 的 DNS 主機其實真的很簡單的啦!因為不需要設定正反解的 Zone ,所以只要設定一個檔案即可!真是快樂得不得了吶!
     
    1. 編輯 /etc/named.conf

    2. 在這個檔案中,主要是定義跟主機有關的事項,以及各個 Zone 的代表含意與檔案,因為 cache-only 沒有 Zone ,所以我們只要設定好跟主機有關的設定即可。設定這個檔案的時候請注意:
       
      • 註解資料是以『 // 』來作設定的!
      • 每個段落之後都需要以『 ; 』來做為結尾!
       
      那麼您可以這樣設定這個檔案啦!
       
      [root@test root]# vi /etc/named.conf
      // This settings is only for forwarding DNS Server
      options {
              pid-file "/var/run/named/named.pid";  //我這裡設定 pid-file !這個時候,
                             //請特別留意該路徑的所有人 ( owner )
                             //一定是要 named 這個人才行!
              forward only;             //只允許 forward!
              forwarders {
                      168.95.1.1;          //我這裡使用 hinet 的 DNS !
                      139.175.10.20;        //這個是 seednet 的 DNS !
              };
      };

      [root@test root]# ls -al /var/run/named
      total 12
      drwxr-xr-x    2 named    named        4096 Dec  5 02:28 ./  <==注意這個 owner 喔!
      drwxr-xr-x   10 root     root         4096 Dec  5 02:01 ../

       
      • options 的內容指的是在主機內的主要設定值,裡頭的設定為:
        • pid-file 指的是每一個 services 的記錄自己的 PID ( Process ID ) 的檔案囉!這個檔案通常用在重新啟動或者是 reload 整個 services 最常被使用到的!因為可以使用 kill -1 PID 來重新啟動啊!嗄!忘記什麼是 PID ?趕快拿出基礎篇複習一下!
        • forwarders (不要忘記那個 s 喔!)就是要設定往前尋找的那個『合法』的 DNS 囉!每一個 forward 的主機之 IP 都需要有『 ; 』來做為結尾!
        • forward only:這個設定可以讓您的 DNS 主機僅進行 forward 而已!是 Cache-Only 主機最常見的設定了!
       
      很簡單吧!這樣就已經設定完成了最簡單的 cache-only 的 DNS 主機了!
       
    3. 啟動 named

    4. 啟動總不會忘記吧!?趕快去啟動一下吧!
       
      [root@test root]# /etc/rc.d/init.d/named start
      Starting named:                                                 [  OK  ]
       
    5. 觀察 port 的變化

    6. 請特別的注意喔!並不是啟動的時候顯示 OK 就會成功的!所以,還要趕快的來看一下您的 port 53 有沒有啟動ㄋㄟ~
       
      [root@test root]# netstat -utln
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State
      tcp        0      0 192.168.1.2:53          0.0.0.0:*               LISTEN
      tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
      udp        0      0 192.168.1.2:53          0.0.0.0:*
      udp        0      0 127.0.0.1:53            0.0.0.0:*
       
      特別需要留意的是,如果沒有指定介面的話,那麼所有的網路介面,包含 lo, eth0, ... 等介面都會被設定為可以接受 domain name 要求的回應介面!此外,還記得我們在前面提到的,每個介面同時都會提供 TCP 與 UDP 封包的服務喔!這樣看起來似乎真的有啟動的樣子,不過,我們還是得瞧一瞧設定方面有沒有什麼大問題呢?
       
    7. 檢查 /var/log/messages 的內容訊息

    8. named 這個服務的記錄檔就直接給他放置在 /var/log/messages 裡面啦,所以來看看裡面的幾行吧!
       
      [root@test root]# tail -n 15 /var/log/messages | grep named
      Dec  5 02:33:33 test named[3010]: starting BIND 9.2.1 -u named
      Dec  5 02:33:33 test named[3010]: using 1 CPU
      Dec  5 02:33:33 test named[3015]: loading configuration from '/etc/named.conf'
      Dec  5 02:33:33 test named[3015]: no IPv6 interfaces found
      Dec  5 02:33:33 test named[3015]: listening on IPv4 interface lo, 127.0.0.1#53
      Dec  5 02:33:33 test named[3015]: listening on IPv4 interface eth0, 192.168.1.2#53
      Dec  5 02:33:33 test named[3015]: running
      Dec  5 02:33:33 test named: named startup succeeded
       
      呵呵!看起來似乎是沒有問題的樣子了!好了!那麼就直接來測試看看吧!
       
    9. 測試( 請觀看 Client 端的測試項目 )
    Forwarders 的好處與問題分析
    關於 forwarder 的好處與壞處,其實有很多種的意見!大致的意見可分為這兩派:
     
    • 利用 Forwarder 的功能來增進效能的理論:這些朋友們認為,當很多的下層 DNS 主機都使用 forwarder 時,那麼那個被設定為 forwarder 的主機,由於會記錄很多的資訊記錄,因此,對於那些下層的 DNS 主機而言,會增快很多,亦即會節省很多的查詢時間!基本上,這些基本的流程可以看成如下圖所示:


    • 圖六、Forwarder 參數的運作說明
       
      所有的 cache-only 都設定 forwarder 為『主 DNS 主機』那一部,則由於主 DNS 主機已經記錄了較多的資訊了(每個人都來要求嘛!)所以,當其他人來要求相同的查詢資料時,則主 DNS 那部機器將會直接由其 cache 當中讀取,因此,查詢效率就變快了!
       
    • 利用 Forwarder 反而會使整體的效能降低:但是另外一派則持相反的見解!這是因為當主 DNS 本身的『業務量』就很繁忙的時候,那麼您的 cache-only 主機還向他要求資料,那麼因為他的資料傳輸量太大,頻寬方面可能負荷不量,而太多的下層 DNS 又向他要求資料,所以他的查詢速度會變慢!因為查詢速度變慢了,而您的 cache-only 主機又是向他提出要求的,所以自然兩邊的查詢速度就會同步下降!
     
    很多種說法啦!鳥哥本人也覺得很有趣哩!只是不知道哪一派較正確就是了 >_<"" ,不過可以知道的是,如果上層的 DNS 速度很快的話,那麼他被設定為 forwarder 時,或許真的可以增加不少效能哩!
     

    DNS 主機的詳細設定:


     
    那麼我們就來架設一部完整的 DNS 主機吧!如同前面說的,我們必須要設定的檔案有幾個呢?
     
    1. /etc/named.conf
    2. /var/named/named.root
    3. /var/named/named.localhost
    4. /var/named/named.127.0.0
    5. /var/named/named.正解檔案
    6. /var/named/named.反解檔案
     
    大概就是這幾個!要注意的是,除了第一個 /etc/named.conf 的檔名是預設的之外,其他的檔名都是在 /etc/named.conf 裡面設定的!那麼底下我們就以鳥哥家裡的連線狀態來說明一下俺是如何設定我的 domain name 囉!要注意的是,這裡的 DNS 設定是『私有網域的設定』狀態,如果您剛剛看過了『授權』的概念,那麼將會知道,底下我所設定的皆是屬於『不合法的 DNS 主機』,這意味著我的 DNS 主機只能夠向外查詢,但是別人是查不到我的 DNS 主機裡面的設定內容的!除非他使用我的 DNS 主機的 IP 囉!不過,嘿嘿!我使用的是私有 IP ,想要使用我的 DNS !哈哈!門都沒有~
     
    1. 手動規劃 hostname 與 IP 的對應表:

    2. 在作任何事之前,先動手設計一下是好事吶!我假設我的 domain name 是 vbird.org 而網域為 192.168.1.0/24,而主機的名稱配合 domain name 來設計的共有三部電腦,分別為:
       
      電腦系統 電腦 IP  電腦名稱 說明
      Mandrake 9.0  192.168.1.2 mdk90.vbird.org
      phorum.mdk90.vbird.org
      www.mdk90.vbird.org
      ftp.mdk90.vbird.org
      1. 這是主要的 DNS 設定主機;
      2. 我的主要名稱為 mdk90.vbird.org
      3. 總共有三個『別名』在這部主機上!
      Windows 2000 192.168.1.100 win2k.vbird.org 記錄在 mdk90.vbird.org 裡面的紀錄資料。
      Windows XP 192.168.1.200 winxp.vbird.org 記錄在 mdk90.vbird.org 裡面的紀錄資料。
       
      要注意的是,在 mdk90 那部機器中,因為我的用途相當的多,所以我希望我的一部主機有多個名稱!那麼我目前又只有一個正解的領域,所以就僅設定了這個 domain 裡面的三個別名了!總共有四個名字吶!
       
    3. 設定簡易的 /etc/named.conf 檔案:

    4. 還記得上面提過的,這個檔案才是主要的設定檔,而其他的 hostname <--> IP 則是在各個 zone 的設定檔中!那麼這個檔案主要的設定首先在於針對主機的設定,這一點剛剛 forwarder DNS 主機已經說過了!那另一個則是在定義每一個 zone 的檔案名稱與該設定 domain 的 『 Type (類型)』,目前有三種類型,分別為master ( 主要設定檔 ) 、 hint ( 就是 root 啦 ) 以及 slave ( 針對 master 來進行資料同步化的設定檔 ) 。好了,那麼如果以我們剛剛上面規劃的設定來看,那麼應該有的 /etc/named.conf 設定就會變成底下的模樣了:
       
      [root@test root]# vi /etc/named.conf
      // 設定整體的主機規劃!重點在 directory 的意義!
      options {
              directory "/var/named";    //這個是在規定『我的正反解檔案放置的目錄』
              forwarders {
                      168.95.1.1;       //不管怎麼說,俺就是喜歡 forwarder 的設定
              };
              pid-file "/var/run/named/named.pid"; //每個 distribution 可能都不同!
              allow-query { any; };     //是否允許他人查詢?當然啦!
              allow-transfer { any; };    //是否允許 slave 的同步!當然啦!
      };                   //上面這兩個設不設定都無所謂啦!預設值!

      // 首先定義出 . (root) 這個 hint type 的檔案內容!
      zone "." {               //看到了沒!?這個就是所謂的 zone 啦!
              type hint;           //選擇的 type 為 hint (root . 專用)
              file "named.root";       //設定檔案的檔名!很多時候預設為 named.root
      };

      // 再來則是定義出 localhost 的正反解了!很簡單啦!就是 127.0.0.1 而已
      zone "localhost" {           //這個 zone 表示設定檔的預設 domain name 為
                          //localhost 的意思喔!這裡請『特別』搞清楚!
              type master;          //主要的在本機的設定檔!
              file "named.localhost";    //檔名!可以隨自己高興隨便取!
      };
      zone "0.0.127.in-addr.arpa" {     //反解的 IP 網段!那個 in-addr.arpa 是
                          //固定的 IP 段寫法!
              type master;
              file "named.127.0.0";
      };

      // 定義出我自己的這一組正反解設定!
      zone "vbird.org" {          //我的 zone 的 domain name 為 vbird.org
              type master;
              file "named.vbird.org";
      };
      zone "1.168.192.in-addr.arpa" {
              type master;
              file "named.192.168.1";
      };

       
      要特別留意的是:
      • options
        • 裡面多定義了一個 directory 的咚咚,這個就是設定檔放置的目錄了!以底下的檔案為例,如果是 localhost 的正解檔,亦即是 named.localhost 時,那麼這個檔案的放置位置就是在 /var/named/named.localhost 啦!這樣可以瞭解嗎?未來您可以自己改變自己檔案放置的地方,就可以分的比較清楚!
        • pid-file 指的是每一個 services 的記錄自己的 PID ( Process ID ) 的檔案囉!這個檔案通常用在重新啟動或者是 reload 整個 services 最常被使用到的!因為可以使用 kill -1 PID 來重新啟動啊!嗄!忘記什麼是 PID ?趕快拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』複習一下!
        • forwarders (不要忘記那個 s 喔!)就是要設定往前尋找的那個『合法』的 DNS 囉!每一個 forward 的主機之 IP 都需要有『 ; 』來做為結尾!
      • 關於 . (root) 的內容:root 最重要的就是那個 hint 的 type 啦!記得寫對喔!
      • 關於 localhost 的正反解:正反解的名稱都可以隨意設定,不過,要特別留意的就是那個 zone 後面接的其實就是『 domain name 』!這個 domain name 未來在設定檔當中會使用得很頻繁喔!
      • 關於其他 domain 的正反解:其實與 localhost 沒有什麼不同的,就只是不同的 domain name 就是了!
      • 反解的寫法:反解的 Zone 的寫法較為特殊,他必須要將 IP 反過來寫的,例如 127.0.0.1/24 這個 C class 的網域,要寫的話,則必須要反過來寫成 0.0.127 這樣的形式!其中需要注意的是,最後面務必要加上『in-addr.arpa』的咚咚!不要忘記了喔!
       
    5. 設定 . ( root ) 的內容:

    6. 一般而言,反正本機查不到,又沒有設定 forwarder 的時候,那麼通常就是直接到 . ( root ) 去查詢囉!但是我們怎麼知道 root 在哪裡呢?總還是需要有 IP 吧!沒錯囉!如果是舊的 Red Hat 或是 Mandrake 都會提供這個 hint type 的檔案,但是 Open Linux 裡面卻沒有提供!並且,有的時候,這些主機的 IP 還是可能會變動的啦!因此呢,我們可以連接上管理國際 domain name 的機器,那就是 rs.internic.net 這部機器去下載囉!您可以這樣做:
       
      [root@test root]# ftp rs.internic.net
      Connected to rs.internic.net.
      Name (rs.internic.net:root): anonymous
      331 Guest login ok, send your complete e-mail address as password.
      Password: <==your password
      230 User ftp logged in.  Access restrictions apply.
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp> cd domain
      ftp> get named.root
      ftp> bye
       
      完成之後,我們來看一下 named.root 這個檔案吧!
       
      [root@test root]# vi named.root
      ;       This file holds the information on root name servers needed to
      ;       initialize cache of Internet domain name servers
      ;       (e.g. reference this file in the "cache  .  <file>"
      ;       configuration file of BIND domain name servers).
      ;
      ;      This file is made available by InterNIC
      ;       under anonymous FTP as
      ;           file                /domain/named.root
      ;           on server           FTP.INTERNIC.NET
      ;
      ;       last update:    Nov 5, 2002
      ;       related version of root zone:   2002110501
      ;
      ;
      ; formerly NS.INTERNIC.NET
      ;
      .                        3600000  IN  NS    A.ROOT-SERVERS.NET.
      A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
      ;
      ; formerly NS1.ISI.EDU
      ;
      .                        3600000      NS    B.ROOT-SERVERS.NET.
      B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
      ;
      ; formerly C.PSI.NET
      ;
      .                        3600000      NS    C.ROOT-SERVERS.NET.
      C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
      ;
      ; formerly TERP.UMD.EDU
      ;
      .                        3600000      NS    D.ROOT-SERVERS.NET.
      D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
      ;
      ; formerly NS.NASA.GOV
      以下省略
       
      共有若干個的主機,注意喔!那個『 ; 』是設定檔的註解,與 /etc/named.conf 又不一樣!特別留意,不要搞錯了!然後您會發現每個『 . 』都有個 NS 與 A 的對應,注意看到粗體字的那兩行,第一行意思是 . 的 name server (NS) 為 『A.ROOT-SERVERS.NET. 』最後面有沒有加上 . 是不一樣的!特別留意!而這個 nameserver 的 IP ( 用A對應 ) 為 198.41.0.4 !!其他的用途我們在下一個檔案再來談!總而言之,這個檔案不要去改他!因為這個是國際上通用的資料,不能修改啦!改了反而會找不到 . 哩!
       
    7. 設定本機端 ( localhost ) 的正解檔案:

    8. 每一部機器都有 localhost 嘛!所以呢,我們就先來針對 localhost 這個網域的電腦對應來設定一下囉!而由於 localhost 通常其對應的 IP 就是 127.0.0.1 ,所以就直接給他正解有這兩個就行啦!但是要特別留意的是,『我的正解要找哪一個 nameserver !?』因此,在底下的設定檔當中,最重要的其實就是要使用 NS 這個 nameserver 的『主機名稱』標誌啦!
       
      [root@test root]# cd /var/named
      [root@test named]# vi named.localhost
      $TTL    600         ; 這個跟清除 cache 的時間有關係!單位是秒!
      @       IN      SOA     localhost.      root.localhost. (
                      2002120601   ; Serial  與 master 及 slave 是否同步有關!
                     ; 一般而言,如果這個數值變大了, slave 才會同步更新!
                      28800        ; Refresh 定義出 slave 多久會主動的檢查 serial 的值,
                     ; 以便主動的更新資料庫!
                      14400        ; Retry   定義出,如果 slave 沒有連上 master DNS 主機
                     ; 則多久之後會重新再次的主動檢查!
                      720000      ; Expire  如果一直沒有連接上 mater ,那麼到了這個時候
                     ; slave 就會放棄檢查的動作了,不再更新!
                      86400 )      ; Minimum 這個其實就是 TTL 啦!如果您沒有定義 TTL ,
                     ; 那麼 TTL 的值就以這個來設定!
      ; 開始設定正解的資訊內容:
      @               IN      NS      localhost. ; 特別留意最後面有個 . 喔!
      localhost.      IN      A       127.0.0.1   ; A 是正解裡面 hostname 對應 IP 的標誌
       
      上面有很多的怪怪的字眼,我們得要先說明一下,否則後面您會『霧煞煞』的!
       
      符號 說明
      $TTL
      1. 這個東西主要在:『定義出向外查詢的資料可以記錄在 DNS 的 cache 當中多久』的意思;
      2. 後面接的數字單位為秒;
      3. 通常這個數字如果定義太大的話,例如一天(86400)時,那麼當別人更改了他的 DNS 訊息時,由於您的 cache 更新時間為一天,所以得要一天之後 cache 當中的資料才會被取代,因此,在一天之內,您查詢到的資訊『都會是舊的!』
      4. 但是這個數字如果定的太小的話,例如五分鐘(300)那麼這部 DNS 將會不斷的向外要求資料,則負荷會變的較大啦!
      5. 其實,除非是在測試階段,不然的話,通常都會建議定義一天的 cache 時間囉!
      6. 注意:某些套件上面並不能定義這個咚咚!
      @
      這個就是 zone 定義出的那個咚咚啦!以這個檔案內容為例,因為我們在 /etc/named.conf 當中就是定義出 localhost 這個 domain name 為一個 zone 的,因此,呵呵!在這裡,這個符號就代表 localhost 啦!
      SOA
      1. 這個是 Start of Authority 開始設定的內容的意思啦!也就是接在後面的設定要開始了!請注意,這個咚咚在每個『zone 的設定檔』當中都會存在!所以,每個 zone 的設定都一樣即可!
      2. 在 SOA 後面會接兩個咚咚,第一個為主機名稱( localhost. ),請特別留意那個 localhost 後面有個小數點 (.) 這個東西很重要!他代表『一個完整的 hostname +  domain name 了』!如果沒有加上 (.) 的話,那麼就表示該文字『僅為 hostname ,還需要加上 domain name 』!這裡是新手最容易出現的錯誤喔!第二個為管理員的 e-mail !因為不能使用 @ (已經是特殊符號了),所以這裡也同樣的以 (.) 來取代!例如上面我以 root@localhost 來做為我的 e-mail ,所以就寫成了 root.localhost. ,同樣的,最後面有個 (.) 喔!
      3. 在最後,會有小刮號 ( ) 括起了五個數字,這五個數字除了最後一個與 TTL 有關之外,其他的都跟 slave 與 master 的資料同步運作有關!
        • Serial :這個數字僅是用來做為 master 與 slave 之間的 update 的參考數值也就是說,當 Slave 的 serial 小於 Master 時,那麼 update 才會動作!由於擔心設定者的設定技巧問題,因此通常我們以時間來做為 Serial 的訂定依據,例如 2002 年 12 月 6 日第一次設定,可以寫成『2002120601』請注意,這個數字不可超過 10 個數字。
        • Refresh :命令 slave 多久進行主動更新的時間;
        • Retry :如果到了 Refresh 的時間,但是 slave 卻無法連接到 master 時,那麼在多久之後,slave 會再次的主動嘗試與主機連線;
        • Expire :如果 slave 一直無法與 master 連接上,那麼經過多久的時間之後,則命令 slave 不要再連接 master 了!
        • Minimun :這個就有點像是 TTL 啦!
      NS
      • 表示 name server 的意思,後面接的都是『hostname 或 FQDN』這個表示前面的 domain 是由後面的這個主機所管理的啦!
      • @ IN NS localhost. 』這一行的意思是說,@ ( zone ,亦即是 localhost 這個 domain ) 的管理的 Name Server 為 localhost 這部主機,請注意,那個 localhost 後面一定要接 (.) 才行!為什麼呢?因為如果沒有加上 (.) 的話,那麼主機名稱將會變成 localhost.localhost ! Why ?這是因為 BIND 預設情況中,沒有寫 . 的話,那麼則表示該名稱為 Hostname 而已,需要再加上 domain name 才行!
      • 由於 Name Server 為主機的名稱,所以後續還要加上這個 name server 的正解的 IP 對應(就是底下要談的 A )才行!
      A
      這是正解的符號啦!也就是說,前面的 localhost. (還是得要注意那個 . )所對應的 IP 為 127.0.0.1 的意思啦!
      .
      呵呵!再次的給他強調下,在 BIND 的設定檔當中,關於主機名稱的話,最後面有沒有加上 . 是差很多的!加上了 . 表示這個『完整的主機名稱,亦即是 hostname + domain name 』了,如果沒有加上 . 的話,表示該名稱僅為『 hostname 』而已!切記切記!
       
      這樣可以瞭解上面的意思了嗎?呵呵!這個是最基礎的幾個項目喔!千萬要記得!不要忘記了~好了,知道了正解之後,我們要來談一談那個反解的東西啦!
       
    9. 設定本機端 ( localhost ) 的反解檔案:

    10. 反解跟正解一樣,還都需要 SOA 的標號,也需要 NS 這個咚咚,唯一不同的大概就是由 IP 對應成為 hostname 的不同了吧!
       
      [root@test root]# cd /var/named
      [root@test named]# vi named.127.0.0  <==這個檔案名稱是在 /etc/named.conf 裡面設定
      $TTL    600
      ; This is about DNS server's settings
      @       IN      SOA     localhost.      root.localhost. (
                      2002120601      ; Serial
                      28800           ; Refresh
                      14400           ; Retry
                      720000          ; Expire
                      86400 )         ; Minimum
      ; The server's infomations
      @               IN      NS      localhost.
      1               IN      PTR     localhost.
       
      上面前幾行跟前面一樣,就不提了!只有最後一行不一樣,那個是什麼呢?
       
      符號 說明
      PTR
      • 這是反解的符號啦!主要還是在於 IP 對應主機名稱的咚咚!要注意的是,由於這個檔案的 zone 為 127.0.0 ,所以我們只要加一個數字(最後一個數字)就可以啦!而那個 1 表示的就成為了 127.0.0.1 囉!
      • 那麼萬一今天我們規劃的是 B Class 的 zone 呢?例如 127.0 這樣的 zone 呢?很簡單啦!就填兩個數字即可!也就是 0.1 囉!
      • 最重要的東西就是:在規劃 zone 的時候,是很重要的,而反解的 zone 的名稱最後需要接上 in-addr.arpa,這點也請千萬不要忘記了!
       
      因為這個 domain (localhost) 就只有一部機器,所以我們很簡單的就可以將他設定完成了!底下,我們將要設定我們自行假設定三部主機喔!
       
    11. 設定 domain name 的正解:

    12. 再來設定的就是剛剛我們先前提到的三部主機了,您可以這樣設定:
       
      [root@test root]# cd /var/named
      [root@test named]# vi named.vbird.org  <==這個檔案名稱是在 /etc/named.conf 裡面設定
      $TTL    600
      ; 跟上面提到的一樣,設定主機的一些基本資訊,包含 master 與 slave !
      @       IN      SOA     mdk90.vbird.org.        root.mdk90.vbird.org.   (
                              2002120601      ; Serial
                              28800           ; Refresh
                              14400           ; Retry
                              720000          ; Expire
                              86400   )       ; minimum
      ; 主機的設定參數部分
      @               IN      NS      mdk90.vbird.org. ; 這個 zone (vbird.org) 的主機
      @               IN      MX 10   mdk90.vbird.org. ; 郵件轉遞的主要郵件主機!
      mdk90           IN      A       192.168.1.2
      mdk90           IN      TXT     "The testing DNS server" ; 僅是說明文件
      phorum.mdk90    IN      CNAME   mdk90      ;注意這行與下一行的寫法!
      www.mdk90       IN      CNAME   mdk90.vbird.org.
      ; 其他主機的設定資訊上面
      win2k           IN      A       192.168.1.100
      win2k           IN      HINFO   "AMD-K6-III""Windows 2000"
      winxp           IN      A       192.168.1.200
       
      除了先前的 master 與 slave 相關的時間參數之外,還有那個重要的 NS 以及 A 這些參數之外,裡面的參數主要有底下幾個新鮮玩意兒:
       
      符號 說明
      SOA
      • 特別注意到 SOA 那一行的設定喔!因為我們要設定的已經是 vbird.org 這個 Zone 了,所以請修改一下您的主機名稱,還有 DNS 主機的管理員郵件位址喔!
      • 另外,還是再次的提醒那個 . 是什麼東西!
      MX
      • 這個東西就是 Mail eXchanger (MX) 的簡寫,他的用途在使用於郵件主機時,需要的信件轉遞站!用於一般主機是沒有多大的影響,但是對於 mail server 則有相當重要的影響哩!
      • 如果不知道如何使用這個玩意兒,沒有關係,您可以直接將您的主機名稱(FQDN)寫入!以我上面的例子來說,我就將郵件主機寫成我自己的主機,注意,最好是 FQDN 喔!
      • 如果您的郵件主機沒有 MX 這個設定其實也沒有關係啦,信件還是可以傳送到達的,但是,有時後就是會比較慢一些些收到對方寄來的信件就是了!
      • 請注意 MX 後面要接上一個數值喔!您可以設定多個郵件主機,但是請特別留意的是,被設定的郵件主機必須要能夠支援您的郵件之 relay 才行,否則設定會變成無效的!
      TXT
      • 這個東西在進行『說明』而已!亦即是前面那部主機的一些資訊。
      • 特別注意的是,沒事的話,『資訊不要寫得太詳細,有的時候甚至應該要寫些錯誤的訊息!』為什麼呢?如果寫得太詳細的話,那麼那些個 cracker 不就很簡單的就可以將您的網站資訊取得,並進而入侵了嗎? @_@
      CNAME
      這個東西就是設定主機別名的咚咚啦!因為我們的主機有很多個名字,沒有必要為每個名字都建立一個 A 的標號,這個時候,我們就可以使用 CNAME 來設定另外一個別名!以上面為例,我設定了兩個別名在我的主機上面,特別留意的是兩個 CNAME 的寫法都指向同一部機器,上面關於 CNAME 的那兩行最大差異性在於寫的是否為 FQDN 與後面有沒有加上 . 這個標誌啦! ^_^
      HINFO
      這個東西後面接兩個咚咚,第一個接的是硬體的等級,第二個接的則是作業系統,這兩個咚咚最好不要用在公開的 DNS 主機上面,跟 TXT 一樣的問題啦!如果要設定的話,最好使用雙引號分隔開來喔!
       
      這樣應該就設定妥當囉!請額外注意喔!在 DNS 的正解部分,他的重要資訊特別的多,比較難設定的意思就對了~所以,您需要特別留意每個設定值是否為正確喔!一般而言,我們會建議大家,設定完成之後,並且執行完啟動的 script ,千萬要記得去 /var/log/messages 裡頭看一看有沒有錯誤訊息喔!
       
    13. 設定 domain name 的反解:

    14. 設定反解要簡單的多了~只要找到對應的 hostname 即可:
       
      [root@test root]# cd /var/named
      [root@test named]# vi named.192.168.1  <==這個檔案名稱是在 /etc/named.conf 裡面設定
      $TTL    600
      @       IN      SOA     mdk90.vbird.org.        root.mdk90.vbird.org.   (
                              2002120601      ; Serial
                              28800           ; Refresh
                              14400           ; Retry
                              720000          ; Expire
                              86400   )       ; minimum
      ; 其他主機的資訊!
      @       IN      NS      mdk90.vbird.org.
      2       IN      PTR     mdk90.vbird.org.
      ; The following is about other hosts
      100     IN      PTR     win2k.vbird.org.
      200     IN      PTR     winxp.vbird.org.
       
      很簡單吧!就是 IP 的對應即可!
       
    15. 啟動 named 與 port 及訊息確認:

    16. 又到了啟動的時刻了!加油!
       
      1. 開始啟動!
      [root@test root]# /etc/rc.d/init.d/named start
      Starting named:                  [  OK  ]

      2. 關於 port 觀察:
      [root@test root]# netstat -tuln | grep 53
      tcp        0      0 192.168.1.2:53          0.0.0.0:*               LISTEN
      tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
      udp        0      0 192.168.1.2:53          0.0.0.0:*
      udp        0      0 127.0.0.1:53            0.0.0.0:*

      3. 關於訊息的內容!
      Dec  8 23:27:39 test named[8106]: starting BIND 9.2.1 -u named
      Dec  8 23:27:39 test named[8106]: using 1 CPU
      Dec  8 23:27:39 test named: named startup succeeded
      Dec  8 23:27:40 test named[8111]: loading configuration from '/etc/named.conf'
      Dec  8 23:27:40 test named[8111]: no IPv6 interfaces found
      Dec  8 23:27:40 test named[8111]: listening on IPv4 interface lo, 127.0.0.1#53
      Dec  8 23:27:40 test named[8111]: listening on IPv4 interface eth0, 192.168.1.2#53
      Dec  8 23:27:40 test named[8111]: couldn't add command channel 127.0.0.1#953: not found
      Dec  8 23:27:40 test named[8111]: zone 0.0.127.in-addr.arpa/IN: loaded serial 2002080601
      Dec  8 23:27:40 test named[8111]: zone 1.168.192.in-addr.arpa/IN: loaded serial 2002120601
      Dec  8 23:27:40 test named[8111]: zone localhost/IN: loaded serial 2002080601
      Dec  8 23:27:40 test named[8111]: zone vbird.org/IN: loaded serial 2002120601
      Dec  8 23:27:40 test named[8111]: running

       
    17. 可能的設定錯誤問題:

    18. 基本上,DNS 算是很難設定的一個 Server 了,所以在除錯方面請務必小心!他的設定錯誤通常有兩種情況:
      • 語法設定錯誤:這個問題比較好解決,因為在 /var/log/messages 裡面都已經說的很清楚了!按照內容去修訂即可;
      • 邏輯設定錯誤:這個就比較困擾了!為什麼呢?因為他主要發生在您設定 DNS 主機的時候,考慮不週所產生的問題!例如忘記加上 (.) ,系統不會顯示錯誤訊息,但是卻會造成查詢的誤判,而 MX 設定的主機名稱錯誤,也不會出現有問題的訊息,但是 mail server 就是會收不到信等等~這些錯誤都需要很詳細的 DNS client 的測試才能知道問題的所在。
      我們這裡先就語法設定錯誤方面進行介紹,至於邏輯設定的問題,那個就需要多多的進行測試才能知道了~
       
      Dec 10 11:34:21 test named[31185]: loading configuration from '/etc/named.conf'
      Dec 10 11:34:21 test named[31185]: /etc/named.conf:18: missing ';' before '}'
      Dec 10 11:34:21 test named[31185]: loading configuration: failure
      Dec 10 11:34:21 test named[31185]: exiting (due to fatal error)
      這樣的錯誤就是發生在 /etc/named.conf 的地 18 行,忘記加上 ; 符號了!去修正即可!

      Dec 10 11:37:20 test named[31236]: dns_rdata_fromtext: named.localhost:9: near eol: unexpected end of input
      Dec 10 11:37:20 test named[31236]: zone localhost/IN: loading master file named.localhost: unexpected end of input
      這樣的錯誤通常就是發生在 named.localhost 的第 9 行處,去修正看看,通常在前面幾行很有可能是 SOA 後面接的五個數字沒有寫全的原因!

      Dec 10 11:42:28 test named[31338]: dns_master_load: named.localhost:14: unexpected end of line
      Dec 10 11:42:28 test named[31338]: dns_master_load: named.localhost:13: unexpected end of input
      Dec 10 11:42:28 test named[31338]: zone localhost/IN: loading master file named.localhost: unexpected end of input
      同樣的,告訴您在該檔案 named.localhost 有問題!請查證!

       
      通常最大的原因真的就是打錯字啦!總之,趕緊去看看 /var/log/messages 的內容,一定可以讓您更瞭解錯誤的問題喔!
       
    19. 測試:這樣就設定完成了!請前往 Client 端觀察吧!

Client 端的設定:

  • 檔案設定:
既然已經完成了 DNS 主機的設定,接下來自然要進行 Client 端的連線測試啦!要怎麼測試呢?底下有幾個檔案請特別留意喔:
  • /etc/hosts :剛剛上面就提過了,這個是最早的 hostname 對應 IP 的檔案;
  • /etc/resolv.conf :這個就是設定您 Client 端連上 DNS 主機的 IP 設定檔;
  • /etc/nsswitch.conf:這個檔案則是在『決定』先要使用 /etc/hosts 還是 /etc/resolv.conf 的設定!
一般而言, Linux 的預設 hostname 搜尋都是先 /etc/hosts 來的,為什麼呢?您可以查看一下 /etc/nsswitch.conf ,並找到 hosts 的項目:
 
[root@test root]# vi /etc/nsswitch.conf
hosts:      files nisplus nis dns
 
上面那個 files 就是使用 /etc/hosts 而最後的 dns 則是使用 /etc/resolv.conf 的 DNS 主機 IP 搜尋啦!因此,您可以先以 /etc/hosts 來設定 IP 對應ㄋㄟ!當然啦,您也可以將他調換過來,不過,總是 /etc/hosts 比較簡單,所以將他擺在前面比較好啦!
好啦,既然我們是要進行 DNS 測試的,那麼 /etc/resolv.conf 的內容,自然就要填寫我們自己的 IP 囉!所以您應該這樣寫:
 
[root@test root]# vi /etc/resolv.conf
nameserver 192.168.1.2
nameserver 163.28.112.1
nameserver 163.28.113.1
 
nameserver 可以設定多個,但是由於 nameserver 是一個一個的追查下來的,所以,您的 DNS 主機的 IP 要寫在最上面喔!然後就可以開始測試了!
  • 測試 DNS 設定:
測試 DNS 的程式有很多,我們先來使用最簡單的 host 吧!然後還有 nslookup 及 dig 哩!
 
host
語法: 
[root @test root]# host [-a] [FQDN]
[root @test root]# host -l [domain]
參數說明:
-a :所有的資訊都列出來;
-l :將後面接的 domain 內的所有的 host 都列出來!
範例:
[root @test root]# host mdk90.vbird.org
mdk90.vbird.org has address 192.168.1.2
很單純的只列出來 hostname 對應 IP 而已!其他的資訊則一概不印出!

[root @test root]# host -a mdk90.vbird.org
Trying "mdk90.vbird.org"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51741
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mdk90.vbird.org.               IN      ANY

;; ANSWER SECTION:
mdk90.vbird.org.        600     IN      A       192.168.1.2
mdk90.vbird.org.        600     IN      TXT     "The testing DNS server"

;; AUTHORITY SECTION:
vbird.org.              600     IN      NS      mdk90.vbird.org.

Received 98 bytes from 192.168.1.2#53 in 9 ms
注意看上面的說明,上面的 600 就是我們訂定的 TTL 的數值, A, TXT, NS 則是在 master file ,也就是 named.vbird.org 裡面設定的資訊!了不了ㄋㄟ?

[root @test root]# host -l vbird.org
vbird.org SOA mdk90.vbird.org. root.mdk90.vbird.org. 2002120601 28800 14400 720000 86400
vbird.org name server mdk90.vbird.org.
vbird.org mail is handled by 10 mdk90.vbird.org.
mdk90.vbird.org has address 192.168.1.2
mdk90.vbird.org text "The testing DNS server"
phorum.mdk90.vbird.org is an alias for mdk90.vbird.org.
www.mdk90.vbird.org is an alias for mdk90.vbird.org.
win2k.vbird.org has address 192.168.1.100
win2k.vbird.org host information "AMD-K6-III" "Windows 2000"
winxp.vbird.org has address 192.168.1.200
vbird.org SOA mdk90.vbird.org. root.mdk90.vbird.org. 2002120601 28800 14400 720000 86400
上面的資訊有沒有很熟悉呢?對啦!那就是我們在設定 named.vbird.org 裡面的所有的設定資訊!

 
基本上,如果沒有特殊的需求,那麼 host 這個程式就實在是很好用了!而且還粉方便ㄋㄟ!
 
nslookup
語法: 
[root @test root]# nslookup [FQDN]
[root @test root]# nslookup
參數說明:
set type=any :列出所有的資訊『正解方面設定檔』
set type=mx  :列出與 mx 相關的資訊!
範例:
[root @test root]# nslookup win2k.vbird.org
Server:         192.168.1.2
Address:        192.168.1.2#53

Name:   win2k.vbird.org
Address: 192.168.1.100
亦是單純的將 hostname 對應的 IP 列出來而已!蠻方便的啦!而且前面亦會顯示出是哪一部 DNS 主機去查詢的!

[root @test root]# nslookup
> 192.168.1.2       <==檢查反解!
Server:         192.168.1.2
Address:        192.168.1.2#53

2.1.168.192.in-addr.arpa        name = mdk90.vbird.org.
> www.mdk90.vbird.org  <==檢查正解!
Server:         192.168.1.2
Address:        192.168.1.2#53

www.mdk90.vbird.org     canonical name = mdk90.vbird.org.
Name:   mdk90.vbird.org
Address: 192.168.1.2
> tw.yahoo.com     <==檢查非本機端的正解!
Server:         192.168.1.2
Address:        192.168.1.2#53

Non-authoritative answer:  <==這一行在說明,這個資訊得自『非認證!』亦即由 cache 取得的!
Name:   tw.yahoo.com
Address: 202.1.237.21
> set type=any     <==顯示所有的資訊!僅針對正解而言!
> mdk90.vbird.org
Server:         192.168.1.2
Address:        192.168.1.2#53

Name:   mdk90.vbird.org
Address: 192.168.1.2
mdk90.vbird.org text = "The testing DNS server"
> exit

 
nslookup 也是一個很不錯用的資訊喔!不過,底下的 dig 又更厲害了!
 
dig
語法: 
[root @test root]# dig [-t type] [FQDN]
參數說明:
-t type :查詢某種 type ,主要有 any 及 mx 等!
範例:
[root @test root]# dig mdk90.vbird.org

; <<>> DiG 9.2.1 <<>> mdk90.vbird.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41014
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mdk90.vbird.org.               IN      A

;; ANSWER SECTION:
mdk90.vbird.org.        600     IN      A       192.168.1.2

;; AUTHORITY SECTION:
vbird.org.              600     IN      NS      mdk90.vbird.org.

;; Query time: 10 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Tue Dec 10 13:50:38 2002
;; MSG SIZE  rcvd: 63
由上面的資訊我們可以得到 A 的正解及 NS 的主機名稱喔!

[root @test root]# dig -t mx mkd90.vbird.org

; <<>> DiG 9.2.1 <<>> -t mx mkd90.vbird.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39261
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mkd90.vbird.org.               IN      MX

;; AUTHORITY SECTION:
vbird.org.              600     IN      SOA     mdk90.vbird.org. root.mdk90.vbird.org. 2002120601 28800 14400 720000 86400

;; Query time: 9 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Tue Dec 10 13:53:10 2002
;; MSG SIZE  rcvd: 80
主要是取得 MX 的相關資訊啦!

 
這樣的查詢方式是不是也很方便呢!?趕快去試看看您的設定對不對吧!
 
whois
語法: 
[root @test root]# whois hostname
參數說明:
範例:
[root @test root]# whois redhat.com

   Domain Name: REDHAT.COM
   Registrar: NETWORK SOLUTIONS, INC.
   Whois Server: whois.networksolutions.com
   Referral URL: http://www.networksolutions.com
   Name Server: NS2.REDHAT.COM
   Name Server: NS3.REDHAT.COM
   Name Server: NS1.REDHAT.COM
   Status: ACTIVE
   Updated Date: 09-jan-2003
   Creation Date: 26-may-1994
   Expiration Date: 25-may-2006

Registrant:
Red Hat, Inc. (REDHAT-DOM)
   P.O. Box 13588
   Research Triangle Park, NC 27709
   US

   Domain Name: REDHAT.COM

   Administrative Contact, Technical Contact:
      Network Operations Center  (NOC144-ORG)           noc@REDHAT.COM
      Red Hat, Inc.
      P.O. Box 13588
      Research Triangle Park, NC 27709
      US
      919-547-0012Fax- 919-547-0024
      Fax- - 919-547-0024

   Record expires on 27-May-2006.
   Record created on 26-May-1994.
   Database last updated on 9-Mar-2003 11:44:55 EST.

   Domain servers in listed order:

   NS3.REDHAT.COM               66.187.229.10
   NS1.REDHAT.COM               66.187.233.210
   NS2.REDHAT.COM               66.187.224.210
 

 
whois 可以用來查詢某一部主機或某個 domain 主要是經過那個人的註冊?那個人的設定內容與哪部機器呢!這個指令也很是好用,例如上面的範例當中,我們可以知道 redhat.com 這部機器的 IP 與註冊的狀態喔!很不錯用吧! ^_^

進階設定

    還有一些比較進階的內容可以提供給大家做為參考喔!例如子網域的授權問題與架設一個合法的 hostname 機器喔!~
     

    子網域授權問題:


     
    好了,那麼萬一我的網路很大,我只負責上層的 DNS 而已,下層希望直接交給各單位的負責人來負責,要怎麼設定呢?舉個例子來說,以成大為例,成大計中僅管理各個系所的的主機 IP 而已,由於各個系所的主機數量可能很大,如果每個人都要請計中來設定,那麼管理員可能會瘋掉,而且在實際設計上也不太人性化。所以囉,計中就將各個 subdomain 的管理權交給各個系所的主機管理員去管理,如此一來,各系所的設定上面會比較靈活,且上層 DNS 主機也不用太麻煩吶!
好了,那麼如何開放子網域授權呢?我這裡僅說明正解的部分,因為在 ISP 方面通常已經幫我們搞定反解了,所以先不理他!而目前我們去註冊的資訊上面,通常僅取得的是正解的設定權,例如我的 vbird.idv.tw 就是一個例子!好了,現在假設在我的 mdk90.vbird.org 上面,要將 win2k.vbird.org 這個子網域切割出去給 win2k.vbird.org 管理,那麼該怎麼辦呢?
    主機 mdk90.vbird.org 的設定部分:
    主機 mdk90.vbird.org 的設定其實很簡單啦!只要將子網域開放出來給別人使用就對了!怎麼設定呢?您可以直接修改 /var/named/named.vbird.org ,使他變成:
     
    [root@test root]# cd /var/named
    [root@test named]# vi named.vbird.org  <==這個檔案名稱是在 /etc/named.conf 裡面設定
    $TTL    600
    @       IN      SOA     mdk90.vbird.org.        root.mdk90.vbird.org.   (
                            2002120601      ; Serial
                            28800           ; Refresh
                            14400           ; Retry
                            720000          ; Expire
                            86400   )       ; minimum
    ; 主機的設定參數部分
    @               IN      NS      mdk90.vbird.org. 
    @               IN      MX 10   mdk90.vbird.org.
    mdk90           IN      A       192.168.1.2
    mdk90           IN      TXT     "The testing DNS server" 
    phorum.mdk90    IN      CNAME   mdk90  
    www.mdk90       IN      CNAME   mdk90.vbird.org.
    ; 子網域分割出去給其他主機管理的例子!
    win2k.vbird.org.   IN   NS  win2k.vbird.org.
    win2k           IN      A       192.168.1.100
    ; 本機上面其他主機的設定資訊方面
    winxp           IN      A       192.168.1.200
     
    上面的粗體字就是最重要的地方啦!我將 win2k.vbird.org. 這個網域的 NS 權限(name server)轉給 win2k.vbird.org 這部主機來管理,而底下列出來 win2k.vbird.org 這部主機的正解資訊!那麼未來當有人要查詢類似 www.win2k.vbird.org 時,則先會到 mdk90.vbird.org 來查詢,而查到 win2k.vbird.org 的網域,因此就會向下游的 DNS 亦即是 win2k.vbird.org 這部機器查詢了!
    下游主機 win2k.vbird.org 的設定:
    這個設定就簡單啦!直接參考一下我們上面寫的資料,跟著設定,但是您的 domain name 變成 win2k.vbird.org 就是了!簡單的很吶!
     

    架設一個合法授權的 DNS 主機:


     
    好啦!現在您應該知道什麼是『經上游授權的合法 DNS 主機』了吧?!沒錯!就是上游的 DNS 主機將子網域的查核權開放給您來設定就對啦!嗯!雖然知道原理,但是那麼我要如何來架設一個合法的 DNS 主機呢?好讓我自己管理自己的 domain !例如我的 vbird.idv.tw 就是 VBird 自己管理的ㄋㄟ~底下我們就來談一談怎麼設定吧!
     
    1. 申請一個合法的 domain name :

    2. 既然是要建立一個合法的 domain name server ,自然就要向合法的 DNS 主機申請授權囉!目前您可以到底下的地方去申請喔!
          
      其實台灣地區的一些 domain 已經不再於 TWNIC 受理了,所以您連上上述的網站之後,可以點選裡頭相關的連結到各大 ISP 去註冊!例如我就註冊了 vbird.idv.tw 這個網域!現在以 Hinet 的註冊做為說明吧!
       
      • 進入主畫面:直接連結到底下的網頁去:http://nweb.hinet.net/
      • 選擇需要的網域名稱,並查詢該網域是否以存在:因為網域必需是獨一無二的,所以您必需使用該網頁當中提供的查詢功能,去查詢一下您想要的網域是否已經被註冊了呢?一定要沒有被註冊的網域才可以喔!
      • 逐步進行註冊:然後以該網站提供的功能一步一步的往下去進行,例如以我的『個人網址』之註冊為例,按下個人網址之後,會出現流程步驟為:
      • 選擇網站代管或架設 DNS 模式:還記得前面提到的資訊吧?對啦!我們可以直接請 ISP 幫我們設定好 host 對應 IP 就好(最多三部),當然也可以自行設定一下我們所需要的 DNS 主機啦!因為未來您可能會架設 mail server ,所以還是自行設定 DNS 主機好了!選擇上面圖示的第五項『DNS指定/異動』項目,會出現下面圖示。記得選擇『DNS』及填寫您的 hostname 與正確的 IP 即可喔!注意:要填選這個項目,最好您的 IP 是固定制的,浮動制的 IP 不建議用這個選項!
      • 註冊完畢!
       
    3. DNS 主機的詳細設定 之設定內容來設定您的主機,請注意,這個情況之下,您只要設定您的註冊的網域的正解即可!反解部分則先不要理會,當然,如果您有辦法的話,最好還是請上層的 ISP 幫您設定囉!

    4.  
    5. 測試!
    如此一來,您的 DNS 主機上面設定的任何資訊,都可以透過 Internet 上面的任何一部主機來查詢到喔!夠棒吧!心動了嗎?趕快去試看看吧! ^_^
     

    LAME Server 的問題


     
    如果您是架設 DNS 主機的新手,那麼『一定』會在 /var/log/messages 這個登錄檔案裡面發現到類似這樣的訊息:
     
    [root@test root]# more /var/log/messages
    Oct  5 05:02:30 test named[432]: lame server resolving '68.206.244.205.in-addr.arpa' (in '206.244.205.in-addr.arpa'?): 205.244.200.3#53
    Oct  5 05:02:31 test named[432]: lame server resolving '68.206.244.205.in-addr.arpa' (in '206.244.205.in-addr.arpa'?): 206.105.201.35#53
    Oct  5 05:02:41 test named[432]: lame server resolving '68.206.244.205.in-addr.arpa' (in '206.244.205.in-addr.arpa'?): 205.244.112.20#53
     
    這是什麼東西吶?!根據官方提供的文件資料來看 ( 在您的 Red Hat 9 的系統下,請察看這個檔案『/usr/share/doc/bind-9.2.1/armBv9ARM.ch06.html』 ),當我們的 DNS 主機在向外面的 DNS 系統查詢某些正反解時,可能由於對方 DNS 主機的設定錯誤,導致無法解析到預期的正反解結果,這個時候就會發生所謂的 lame server 的錯誤!
     
    那麼這個錯誤會讓我們的 DNS 主機發生什麼嚴重的後果嗎?當然不會啦!因為錯誤的是對方的 DNS 設定,只是我們的 DNS 主機在查詢時,會發生無法正確解析的警告信息而已,這個訊息雖然不會對我們的 Linux 主機發生什麼困擾,不過,對於系統管理員來說,要天天查詢的 /var/log/messages 檔案竟然有這麼多的登錄資訊,這是很討厭的一件事!
     
    好了,我們知道 lame server 是對方主機的問題,對我們主機沒有影響,但是卻又不想要讓該訊息出現在我們的登錄檔 /var/log/messages 當中,怎麼達到這樣的功能呢?呵呵!就直接利用 BIND 這個套件所提供的登錄檔參數啊!動作很簡單,在您的 /etc/named.conf 檔案當中的最底下,加入這個參數即可:
     
    1. 修改 /etc/named.conf 
    [root@test root]# vi /etc/named.conf
    // 加入底下這個參數:
    logging {
            category lame-servers { null; };
    };
    // 注意一下,那個 logging 是主要的參數,至於 category 則是定義出什麼資訊,
    // 因為我們不要 lame server ,所以選擇 lame-servers 這個參數,並定義
    // 參數值為 null (空的的意思),這樣就修改完成了!
     
    2. 重新啟動 bind 
    [root@test root]# /etc/rc.d/init.d/named restart
     
    記得重新啟動 named 之後,還是要察看一下 /var/log/messages 喔!以確定 named 的正確啟動與否!然後,嘿嘿,以後就不會看到 lame server 咯!

重點回顧

  • 在 Internet 當中,任何一部合法的主機都具有獨一無二的主機名稱,這個主機名稱包含了 hostname 與 domain name ,並稱為 Fully Qualified Domain Name (FQDN);
  • 為了克服人類對於 IP 不易記憶的困擾,而有名稱解析器的產生,首先是 /etc/hosts ,而後則是 DNS 系統的產生;
  • DNS 伺服器的類型主要分為 master, slave 以及只進行快取記錄的 cache-only 的 DNS 主機;
  • Internet 上面的主機預設先向 master DNS 查詢資料,而 slave 的主要功能在於『備份 master 的設定資料庫』檔案!並且在 master 掛點時,可做為備援的系統;
  • 目前 Unix Like 的機器當中,都是以 BIND 這個柏克萊大學發展的 DNS 套件;
  • 在 DNS 系統中,正解為由 hostname 找 IP ,而反解則是由 IP 找 hostname ,至於 zone 則是一個或者是部分網域的設定值;
  • bind 的設定檔為 /etc/named.conf ,而 named.conf 可以規範出正反解 zone 的檔案所在;
  • 正解的紀錄(record)主要有:SOA, A, MX, NS, CNAME, TXT 及 HINFO 等;
  • 反解的紀錄主要有: SOA, PTR 等;
  • 在 client 端設定 DNS 查詢順序與相關功能的幾個重要檔案為: /etc/nsswitch.conf, /etc/hosts, /etc/resolv.conf 等;
  • DNS 查詢的指令主要有: host, nslookup, dig, whois 等等;
  • 在載入了 named 這個 daemon 之後,請務必前往 /var/log/messages 察看此 daemon 的成功與否。

本章與 LPI 的關係

在 LPI 網站 http://www.lpi.org 裡面提到的,關於 NFS 的考試題庫的地方,只有在 LPI level 1 的 102 ,裡面的 topic 113 Networking Services ,第五點當中,簡易的 DNS 設定。強調的是『應試者需瞭解何謂正、反解、Zone 與 cache-only 的 DNS 主機』至於會考的檔案與指令可能有這些:
  • /etc/hosts
  • /etc/nsswitch.conf
  • /etc/resolv.conf
  • /etc/named.boot(V4)及 /etc/named.conf(V8)
  • named (這個 daemon )

參考資源:


本章習題練習

  • 為何要有 DNS 系統:
  • 那麼請教 Unix Like 系統當中,主要使用那個套件做為 DNS 主機的架設,同時,他又是使用那個 daemon 來啟動 DNS 系統?
  • 最早的 Internet 其實是為了政府人員可以連上網路以進行資源的分享,另外,則是電子郵件的使用。而在早期使用的重要檔案只有 /etc/hosts 這個,請教這個 hosts 檔案的內容含有什麼項目?
  • 請說明 DNS 的三種類型與相關的內容:
  • 正解檔案(forward)反解檔案(reverse)與內部迴圈使用的檔案(loopback)主要的紀錄功能為:
  • 在主要的 DNS 設定檔 /etc/named.conf 當中,有一個較為特殊的檔案,他的類型為 hint ,請問這個檔案的功能為何?
  • 在 client 端搜尋 HOSTNAME 對應到 IP 的查詢時,最重要的檔案,以及該檔案的主要用途為何?
  • 一般來說,在 Client 端使用的查詢 HOSTNAME 的指令大多使用什麼?
  • 請問 named 重要的資訊登錄在在那個檔案中?

  • 前往參考解答
修改歷史:
2002/12/10:首次完成
2003/03/10:修改部分內容,並且新增 LPI 相關性與重點整理部分!
2003/09/10:修改了部分的版面,並將 slave DNS 的錯誤修訂完畢!
2003/10/08:新增了 lame server 的說明,與解決之道!
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計