鳥哥的 Linux 私房菜
為取得較佳瀏覽結果,請愛用 firefox 瀏覽本網頁
| 繁體主站 | 簡體主站 | 基礎篇 | 伺服器 | 企業應用 | 桌面應用 | 安全管理 | 討論板 | 酷學園 | 書籍戡誤 | 鳥哥我 | 崑山資傳 |
     
 
最近更新日期:2004/10/31
我們知道電腦網路系統只認識所謂的 IP ,但是,您可能記得住網路上面所有主機的 IP 嗎? 就鳥哥來說,連自己的主機的 IP 都記不起來了,怎麼可能連其他的主機 IP 都記的住! 因為,人腦對於數字組成的 IP 的記憶實在是......不怎麼樣。 但是,相對來說,人們對於由文字所組成的主機名稱那可以容易記憶的多了∼ 所以,才會發展出可以經由主機名稱( hostname )對應到電腦 IP 的一個模式,這樣我們就可以輕輕鬆鬆的記住主機名稱即可,電腦 IP 那就交給 Domain Name System ( DNS )去搞定吧!

那個 DNS 系統是由柏克萊大學發展的 bind 這個套件( Berkeley Internet Name Domain )所提供的啦!基本上,DNS 最主要的工作就是將 Hostname 對應到 IP 這個功能了,不過,要架設一個成功的 DNS 主機的話,還得要對於 DNS 的運作很清楚才行啊!否則架設的不對,還反而會造成大家的問題喔!這個章節當中, 要學會的資料其實還蠻多的,需要瞭解:什麼是正解、什麼是反解、什麼是 Zone、客戶端 ( Client ) 是經由什麼咚咚來查詢得到 IP 的呢?!以及 DNS 的授權問題等等。 哇!趕快清一清腦門,要好好的用功囉! ^_^

原理部分
  什麼是 Domain Name System
  DNS 的查詢過程
  關於『授權』的意義
  網站代管還是自己設定 DNS
  正解與反解的 Zone 意義
安裝部分
  架設 DNS 所需要的套件
設定部分
  設定一:單純的 forward DNS 主機設定
  設定二:DNS 主機的詳細設定
  設定三:Master/Slave 架構的詳細設定
Client 端的設定
  /etc/nsswitch.conf
  /etc/hosts
  /etc/resolv.conf
  查詢指令:host, nslookup, dig, whois
進階設定
  子網域授權問題
  架設一個合法授權的 DNS 主機
  LAME Server 的問題
  解決 rndc key 的問題
  架設動態 DNS 主機
重點回顧
本章與 LPI 的關係
參考資源
本章習題練習

大標題的圖示原理部分
目前人類的電腦網路裡面,使用最普及的是所謂的 IP ( IPv4 )協定,透過這個協定, 我們可以將資料傳送到任何一個可以連上 Internet 的地方。 不過,這個 IP 協定所設定的 IP 是由 32 個位元,而轉成十進位的話,是由 4 組數字所集合而成的, 例如 123.234.56.78 這樣的格式。當我們利用 Internet 傳送資料的時候, 就需要這個 IP ,否則資料怎麼知道要被送到哪裡去?( 當然啦, 傳送資料的方法有很多,不見得全部都是透過 IPv4 這個協定,例如 NetBIOS 就是一例。 不過,在這裡,我們不討論其他的傳輸方法,專門探討 IPv4 這個協定喔! )

然而人腦對於 IP 這種數字的玩意兒,記憶力實在是不怎麼樣。但是如上所說, 當我們需要資料傳輸時,又很需要對方的 IP ,怎麼辦?為了應付這個問題, 早期的朋友想到一個方法,那就是利用某些特定的檔案將主機名稱與 IP 作一個對應, 讓主機名稱與 IP 有關連性,如此一來,我們就可以透過主機名稱來取得該主機的 IP 了! 真是個好主意,因為人類對於名字的記憶力可就好多了! ^_^y。

可惜的是,該方法還是有缺憾的,那就是主機名稱與 IP 的對應無法自動於所有的電腦內更新。 也就是說,我們必須要手動去所有的電腦裡面更新該資訊∼天吶!哪有這麼多時間∼∼ 而為了填補這個缺憾,柏克萊大學發展出另外一套階層式管理主機名稱對應 IP 的系統, 我們稱他為 Berkeley Internet Name Domain, BIND ,這個系統可就優秀的多了∼ 透過階層式管理,可以輕鬆的進行維護的工作∼太棒了! 這也是目前全世界使用最廣泛的領域名稱系統(Domain Name System, DNS)哩∼ 透過他,我們不需要知道主機的 IP ,只要知道該主機的名稱,就能夠輕易的連上該主機了! (在底下的說明當中,我們有時會提到 DNS 有時會提到 BIND ,這有什麼不同? 由上面的說明裡面,您可以瞭解到, DNS 是一種網際網路的協定名稱, 至於 Bind 則是提供這個 DNS 服務的套件∼這樣您瞭解了嗎?!)

那麼要立刻來架設 DNS 主機嗎?當然不是∼如同上面說的,網際網路上面, 資料的傳輸最重要的就是得要知道對方的 IP,如此才能達成連線。因此, 架設 DNS 就必須要瞭解整體網際網路的領域名稱架構,否則,一旦 DNS 架設錯誤, 可能會造成您所管轄的主機無法正確的在 Internet 上頭傳輸資料的問題!

所以,要設定 DNS 之前,您必須要就領域名稱系統裡面慣用的 FQDN、Hostname 與 IP 的查詢流程, 正解與反解、合法授權的 DNS 主機之意義,以及 Zone 等等的知識作一個認識才行! 這可是很重要的,不要輕忽他了!


小標題的圖示 什麼是 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 :直接在 Client 端的檔案內輸入主機名稱對應的 IP 來查詢;
    DNS 系統   :利用額外的DNS服務,讓Client端可以透過名稱解析來取得目的地主機的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 時,您的電腦就會依據相關設定( 在 Linux 底下就是利用 /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. 向最頂層 ( root )查詢
      由於 168.95.1.1 沒有紀錄我們主機的 IP ,這個時候他就會向『最頂層』的 . (root) 這部主機來查詢 . (root) 的下一層,也就是 .tw 這部機器的資料了!這個時候, . (root) 就會告訴 168.95.1.1 說『嘿!您要查 .tw 這個網域的管理者呀!?喝!我這裡有  .tw 這個網域的管理的主機之 IP 資訊,您可以直接去找他!』;

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

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

    5. 記錄暫存記憶體
      查到了 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 這個例子來說,配合上面的 圖三 來說明, 那鳥哥的 vbird.idv.tw 那部主機裡面至少需要知道 . (root) 以及鳥哥自身的設定, 所以,這個 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 這個參數檔來設定!』 ( 在新版的 Linux distribution 當中, 也有將這個檔案放置在 /var/named/chroot 當中喔!需要特別注意!)也就是說, DNS server 使用的 bind 這個套件中,他的主要參數檔是 /etc/named.conf ,而這個檔案當中就是記錄了每一個 zone 的設定檔檔名!實際上,主機名稱與 IP 的對應就是記錄在各個 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 ( 在新版的 BIND 當中, 這個檔案似乎已經被搬移到 /var/named/chroot 當中了!您必須自行尋找∼ ) 這個檔案,如果他不存在的話,請自行建立吧!另外,針對 DNS server 的類型大致上可以分為三類,分別是:
  • Master:
    這種類型的 DNS 本身含有領域名稱的設定檔( 就是有Zone啦! ),這個設定檔就是設定正解或者是反解的『Database』囉!所以他本身是具有提供 Internet 查詢所需的資料喔!例如我可以在我的主機上面設定提供 vbird.idv.tw 這個網域,那麼我的主機就是 master 類型的主機啦!

  • Slave:
    既然想要架設 DNS 主機,自然就是希望自己的主機名稱能夠在 Internet 上面被查詢的到。 而您也曉得,電腦主機這東西什麼時候會掛點?網路環境這玩意兒,什麼時候會死掉? 是誰也不敢說的∼而,您總不希望自己的主機名稱無法被查詢到吧? 所以,一般來說, DNS 系統通常會建議您至少要有兩部主機提供 DNS 的服務∼

    不過,如果您有四部 DNS 主機提供這樣的名稱解析服務, 而且這四部是互相為備援的,也就是說,這四部主機的內容其實是一模一樣的, 那麼如果您要更動一個 IP 與名稱的對應時,就必須要手動去修訂四部主機的內容, 這樣會不會很麻煩啊?!

    這個時候就有 slave 類型的 DNS 主機出現了!不過,slave主機必須要與 master 主機相互搭配喔! 以上面的案例來說明,如果我必須要有四部主機提供 DNS 服務,且四部內容相同, 那麼我只要指定一部主機為 Master ,其他三部為該 Master 的 Slave 主機, 那麼當要修改一部名稱對應時,我只要手動更改 master 那部機器的設定檔,然後, 重新啟動 BIND 這個服務後,呵呵!其他三部 slave 就會自動的被通知更新了! 這樣一來,在維護上面可就輕鬆寫意的多了∼

    由於目前網際網路並不安全,同樣的 BIND 服務也不是很安全的∼ 因此,如果您設定 Master/Slave 架構時,您的 Master 主機必須要限制 只有某些特定 IP 的主機能夠取得您 DNS 主機的正反解資料庫才好! 所以,上面才會提到 Master/Slave 必須要互相搭配才行!

    另外,既然我的所有 DNS 主機是需要同時提供 internet 上面的領域名稱解析的服務, 所以不論是 Master 還是 Slave 主機,他都必須要可以同時提供 DNS 的服務才好! 因為在 DNS 系統當中,領域名稱的查詢是『先搶先贏』的狀態,所以, 我們不會曉得哪一部主機的資料會先被查詢到的! 為了提供良好的 DNS 服務,每部 DNS 主機都要能正常工作才好啊!

  • 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 主機設定來作為結尾∼


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

圖五、Cache-Only DNS 主機的運作流程

由上面的圖示來看,您可以發現,其實,我們 Client 端雖然都是使用 Cache-Only 的 DNS 在搜尋,但是,實際上 Cache-only 的主機都是請一個 ( Forwarders ) DNS 主機來幫忙查詢的,本身並沒有 zone 的設定檔啦!所以說,基本上, cache-only 的 DNS 只是一個中間傳遞資料的 DNS 主機罷了!那麼為什麼要架設這樣的一個 DNS 主機呢?閒閒沒事幹?當然不是!這是有原因的啦!底下說給您聽囉!

什麼時候使用 cache-only DNS?
在某些公司行號裡頭,為了預防員工利用公司的網路資源作自己的事情,所以, 都會針對 Internet 的連線作比較嚴格的限制。當然啦,連 port 53 這個 DNS 會用到的 port 也可能會被擋在防火牆之外的∼這個時候, 您可以在『防火牆的那部機器上面,加裝一個 cache-only 的 DNS 服務!』這是什麼意思呢?很簡單啊!就是您自己利用自己的 防火牆主機上的 DNS 服務去幫您的 Client 端解譯 hostname <--> IP 囉!因為防火牆主機 可以設定放行自己的 DNS 功能,而 Client 端就設定該防火牆 IP 為 DNS 主機的 IP 即可! 哈哈!這樣就可以取得主機名稱與 IP 的轉譯啦!

簡易的 cache-only DNS 設定:
設定一個 cache-only 的 DNS 主機其實真的很簡單的啦!因為不需要設定正反解的 Zone ,所以只要設定一個檔案(就是 named.conf)即可!真是快樂得不得了吶!


  1. 編輯 /etc/named.conf
    在這個檔案中,主要是定義跟主機有關的事項,以及各個 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"; 
            forward only;            //只允許 forward!
            forwarders {
                    168.95.1.1;      //我這裡使用 hinet 的 DNS !
                    139.175.10.20;   //這個是 seednet 的 DNS !
            };
    }; 
    // 我這裡有設定 pid-file ,所以得要特別注意了!因為 pid-file 
    // 所在的目錄下,也就是那個 /var/run/named 目錄,我的 bind 
    // 執行檔程序的擁有人( 正常應該是 name 這個使用者 )必須要
    // 能夠寫入!也就是說, /var/run/named 的 owner 必須
    // 是 named 這個 user 才行喔! 
    
    [root@test root]# ls -al /var/run/named
    total 12
    drwxr-xr-x    2 named    named        4096 Dec  5 02:28 ./  
    drwxr-xr-x   10 root     root         4096 Dec  5 02:01 ../
    # 注意上面那個 ./ 目錄的擁有者!
    
    我們僅動用到 option 這個參數而已,裡面的設定值意義為:

    • 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 主機了!


  2. 啟動 named
    啟動總不會忘記吧!?趕快去啟動一下吧!
    [root@test root]# /etc/rc.d/init.d/named start
    Starting named:                                        [  OK  ]


  3. 觀察 port 的變化
    請特別的注意喔!並不是啟動的時候顯示 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 封包的服務喔! 這樣看起來似乎真的有啟動的樣子,不過,我們還是得瞧一瞧設定方面有沒有什麼大問題呢?


  4. 檢查 /var/log/messages 的內容訊息
    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
    呵呵!看起來似乎是沒有問題的樣子了!好了!那麼就直接來測試看看吧!


  5. 測試:
    這部分請參考: 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 裡面設定的!那麼底下我們就以鳥哥家裡的 DNS 主機設定來說明一下俺是如何設定我的 domain name 囉!要注意的是,這裡的 DNS 設定是『私有網域的設定』狀態, 如果您剛剛看過了『授權』的概念,那麼將會知道, 底下我所設定的皆是屬於『不合法的 DNS 主機』,這意味著我的 DNS 主機只能夠向外查詢,但是別人是查不到我的 DNS 主機裡面的設定內容的!除非他使用我的 DNS 主機的 IP 囉!不過,嘿嘿!我使用的是私有 IP ,想要使用我的 DNS !哈哈!門都沒有∼


  1. 手動規劃 hostname 與 IP 的對應表:
    在作任何事之前,先動手設計一下是好事吶!我假設我的 domain name 是 vbird.tw 而網域為 192.168.1.0/24,主機的名稱配合 domain name 來設計的共有三部電腦,分別為:

    電腦系統電腦 IP電腦名稱說明
    MDK 10.0 192.168.1.2 mdk.vbird.tw
    forum.vbird.tw
    www.vbird.tw
    ftp.vbird.tw
    這部電腦是主要的 DNS 主機,我的主要名稱是 mdk.vbird.tw ,其他三個則是『主機別名!』
    Win2K192.168.1.100win2k.vbird.tw這部主機名稱是記錄在 mdk.vbird.tw 裡面的紀錄資料。
    WinXP192.168.1.200winxp.vbird.tw這部主機名稱是記錄在 mdk.vbird.tw 裡面的喔!

    要注意的是,在 mdk.vbird.tw 那部機器中,因為該電腦的用途相當的多, 所以我希望那一部主機有多個名稱!那麼因為目前又只有一個正解的領域,所以就僅設定了這個 domain 裡面的三個別名了!所以那部主機總共有四個名字吶!


  2. 設定簡易的 /etc/named.conf 檔案:
    還記得上面提過的,這個檔案才是主要的設定檔,而其他的 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"; //每個版本可能都不同!
            allow-query { any; };    //是否允許他人查詢?當然啦!
            allow-transfer { none; };
    };    //上面這個設定項目,主要針對 Master/Slave 的架構,
          //亦即是否允許來自 slave 端的要求而提供整個 zone 的傳送!
          //近年來由於一些安全性的問題,所以,這裡我們建議將他設定為 none 
    
    // 首先定義出 . (root) 這個 hint type 的檔案內容!
    zone "." {                   //看到了沒!?這個就是所謂的 zone 啦!
            type hint;           //選擇的 type 為 hint (root . 專用)
            file "named.root";   //設定檔案的檔名!預設為 named.root
    };                           //有的時候也可能是 named.ca 喔!
    
    // 再來則是定義出 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.tw" {            //我的 zone 的 domain name 為 vbird.tw
            type master;
            file "named.vbird.tw";
    };
    zone "1.168.192.in-addr.arpa" {
            type master;
            file "named.192.168.1";
    };
    

    要特別留意的是:
    • options
      • directory:這個設定值就是在規範每一個 zone 的檔案放置的目錄。 舉例來說,如果是 localhost 的正解檔,亦即是 named.localhost 時, 那麼這個檔案的放置位置就是在 /var/named/named.localhost 啦!這樣可以瞭解嗎? 未來您可以自己改變自己檔案放置的地方,就可以分的比較清楚!不過,習慣上還是放置在 /var/named 裡面!
      • 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 未來在 zone 的設定檔當中會使用得很頻繁喔!
    • 關於其他 domain 的正反解
      其實與 localhost 沒有什麼不同的,就只是不同的 domain name 就是了!
    • 反解的寫法
      反解的 Zone 的寫法較為特殊,他必須要將 IP 反過來寫的,例如 127.0.0.0/24 這個 C class 的網域,要寫的話,則必須要反過來寫成 0.0.127 這樣的形式!其中需要注意的是,最後面務必要加上『 in-addr.arpa』的咚咚!不要忘記了喔!


  3. 設定 . ( root ) 的內容:
    一般來說,如同圖三的流程解說一般,如果在本機上查詢不到某部主機的 IP, 而我們的 DNS 主機又沒有設定 forwarders 時,那麼 DNS 主機通常就是直接到 . ( root ) 去查詢囉!但是我們怎麼知道 root 在哪裡呢?總還是需要有 IP 吧!沒錯囉! 這時候就需要 hint 這個 type 來支援啦!一般來說,在 BIND 這個套件釋出時,都會附上 . 也就是 named.root (或 named.ca )這個檔案的,如果沒有的話,沒有關係,我們可以連接上管理國際 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
    ; 抱歉,版權宣告部分先省略∼
    ;
    ; 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
    ;
    ; 以下省略
    
    共有若干個的主機,注意喔!那個『 ; 』是設定檔的註解,與 /etc/named.conf 又不一樣!特別留意,不要搞錯了!然後您會發現每個『 . 』都有個 NS 與 A 的對應, 注意看到粗體字的那兩行,第一行意思是 . 的 name server (NS) 為 『A.ROOT-SERVERS.NET. 』最後面有沒有加上 . 是不一樣的!特別留意!而這個 nameserver 的 IP ( 用A對應 ) 為 198.41.0.4 !!其他的用途我們在下一個檔案再來談!總而言之, 這個檔案不要去改他 !因為這個是國際上通用的資料,不能修改啦!改了反而會找不到 . 哩!


  4. 設定本機端 ( localhost ) 的正解檔案:
    每一部機器都有 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 啦!
      另外,各個值是有大小限制的,他們的限制是:
      • Serial <= 2^32
      • Refresh >= Retry * 2
      • Refresh + Retry < Expire
      • Expire >= Retry * 10
      • Expire >= 7Days
    NS
    1. 表示 name server 的意思,後面接的都是『hostname 或 FQDN』這個表示前面的 domain 是由後面的這個主機所管理的啦!
    2. 『 @ IN NS localhost. 』這一行的意思是說,@ ( zone ,亦即是 localhost 這個 domain ) 的管理的 Name Server 為 localhost 這部主機,請注意,那個 localhost 後面一定要接 (.) 才行!為什麼呢?因為如果沒有加上 (.) 的話,那麼主機名稱將會變成 localhost.localhost ! Why ? 這是因為 BIND 預設情況中,沒有寫 . 的話,那麼則表示該名稱為 Hostname 而已,需要再加上 domain name 才行!
    3. 由於 Name Server 為主機的名稱,所以後續還要加上這個 name server 的正解的 IP 對應(就是底下要談的 A )才行!
    A 這是正解的符號啦!也就是說,前面的 localhost. (還是得要注意那個 . )所對應的 IP 為 127.0.0.1 的意思啦!
    . 呵呵!再次的給他強調下,在 BIND 的設定檔當中,關於主機名稱的話,最後面有沒有加上 . 是差很多的!加上了 . 表示這個『完整的主機名稱,亦即是 hostname + domain name 』了, 如果沒有加上 . 的話,表示該名稱僅為『 hostname 』而已!切記切記!
    這樣可以瞭解上面的意思了嗎?呵呵!這個是最基礎的幾個項目喔!千萬要記得!不要忘記了∼ 好了,知道了正解之後,我們要來談一談那個反解的東西啦!


  5. 設定本機端 ( localhost ) 的反解檔案:
    反解跟正解一樣,還都需要 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
    1. 這是反解的符號啦!主要還是在於 IP 對應主機名稱的咚咚!要注意的是,由於這個檔案的 zone 為 127.0.0 ,所以我們只要加一個數字(最後一個數字)就可以啦!而那個 1 表示的就成為了 127.0.0.1 囉!
    2. 那麼萬一今天我們規劃的是 B Class 的 zone 呢?例如 127.0 這樣的 zone 呢?很簡單啦! 就填兩個數字即可!也就是 0.1 囉!
    3. 最重要的東西就是:在規劃 zone 的時候,是很重要的,而反解的 zone 的名稱最後需要接上 in-addr.arpa,這點也請千萬不要忘記了!
    因為這個 domain (localhost) 就只有一部機器,所以我們很簡單的就可以將他設定完成了! 底下,我們將要設定我們自行假設定三部主機喔!


  6. 設定 domain name 的正解:
    再來設定的就是剛剛我們先前提到的三部主機了,您可以這樣設定:
    [root@test root]# cd /var/named
    [root@test named]# vi named.vbird.tw
    # 這個檔案名稱是在 /etc/named.conf 裡面設定
    $TTL    600
    ; 跟上面提到的一樣,設定主機的一些基本資訊!
    @       IN      SOA     mdk.vbird.tw.        root.mdk.vbird.tw.   (
                            2004102901      ; Serial
                            28800           ; Refresh
                            14400           ; Retry
                            720000          ; Expire
                            86400   )       ; minimum
    ; 主機的設定參數部分
    @               IN      NS      mdk.vbird.tw. 
    ; 這個 zone (vbird.tw) 的主機
    @               IN      MX 10   mdk.vbird.tw. 
    ; 郵件轉遞的主要郵件主機!
    mdk             IN      A       192.168.1.2
    mdk             IN      TXT     "The testing DNS server" 
    ; 僅是說明文件
    phorum          IN      CNAME   mdk      
    ;注意這行與下一行的寫法!
    www             IN      CNAME   mdk.vbird.tw.
    ; 其他主機的設定資訊上面
    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.tw 這個 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 裡頭看一看有沒有錯誤訊息喔!


  7. 設定 domain name 的反解:
    設定反解要簡單的多了∼只要找到對應的 hostname 即可:
    [root@test root]# cd /var/named
    [root@test named]# vi named.192.168.1
    # 這個檔案名稱是在 /etc/named.conf 裡面設定
    $TTL    600
    @       IN      SOA     mdk.vbird.tw.        root.mdk.vbird.tw.   (
                            2004102901      ; Serial
                            28800           ; Refresh
                            14400           ; Retry
                            720000          ; Expire
                            86400   )       ; minimum
    ; 其他主機的資訊!
    @       IN      NS      mdk.vbird.tw.
    2       IN      PTR     mdk.vbird.tw.
    ; The following is about other hosts
    100     IN      PTR     win2k.vbird.tw.
    200     IN      PTR     winxp.vbird.tw.
    
    很簡單吧!就是 IP 的對應即可!


  8. 啟動 named 與 port 及訊息確認:
    又到了啟動的時刻了!加油!
    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. 關於訊息的內容!
    [root@test root]# tail -n 15 /var/log/messages
    Oct 29 17:30:33 test named[27159]: using 1 CPU
    Oct 29 17:30:33 test named[27159]: loading configuration from 
    '/etc/named.conf'
    Oct 29 17:30:33 test named[27159]: listening on IPv4 interface 
    lo, 127.0.0.1#53
    Oct 29 17:30:33 test named[27159]: listening on IPv4 interface 
    eth0, 192.168.1.2#53
    Oct 29 17:30:33 test named[27159]: zone 0.0.127.in-addr.arpa/IN: 
    loaded serial 2002120601
    Oct 29 17:30:33 test named[27159]: zone 1.168.192.in-addr.arpa/IN: 
    loaded serial 2004102901
    Oct 29 17:30:33 test named[27159]: zone localhost/IN: loaded serial 
    2002120601
    Oct 29 17:30:33 test named[27159]: zone vbird.tw/IN: loaded serial 
    2004102901
    Oct 29 17:30:33 test named[27159]: running
    Oct 29 17:30:33 test named[27159]: zone vbird.tw/IN: sending notifies 
    (serial 2004102901)
    Oct 29 17:30:33 test named: named start succeeded
    

  9. 可能的設定錯誤問題:
    基本上,DNS 算是很難設定的一個 Server 了,所以在除錯方面請務必小心! 他的設定錯誤通常有兩種情況:

    • 語法設定錯誤:
      這個問題比較好解決,因為在 /var/log/messages 裡面都已經說的很清楚了!按照內容去修訂即可;

    • 邏輯設定錯誤:
      這個就比較困擾了!為什麼呢?因為他主要發生在您設定 DNS 主機的時候,考慮不週所產生的問題!例如忘記加上 (.) , 系統不會顯示錯誤訊息,但是卻會造成查詢的誤判,而 MX 設定的主機名稱錯誤,也不會出現有問題的訊息,但是 mail server 就是會收不到信等等∼這些錯誤都需要很詳細的 DNS client 的測試才能知道問題的所在。

    我們這裡先就語法設定錯誤方面進行介紹,至於邏輯設定的問題,那個就需要多多的進行測試才能知道了∼
    底下的錯誤訊息都會記錄在 /var/log/messages 裡面喔!
    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 的內容,一定可以讓您更瞭解錯誤的問題喔!


  10. 測試:
    這樣就設定完成了!接下來,請查閱 在 Client 端的測試 吧!

小標題的圖示Master/Slave 架構的詳細設定:
如同我們在前面提到的,如果您有多部 DNS 主機管理同一個領域名稱的話, 那麼為了節省維護成本,以 Master/Slave 架構來規劃主機的配置實在是不錯的一個方式! 因為,如果需要修改 zone 的主機名稱與 IP 的對應資料,則只要更改 Master 那部主機即可!

在 Master/Slave 的架構下,Master 的設定與前一小節的設定是相同的, 只不過需要設定預定被傳送的 zone 的 allow-transfer 項目值而已! 至於 slave 部分,他不需要預定要傳送的 zone 的檔案,因為該檔案會自動產生∼ 底下我們就來設定一下吧!


  1. 草案規劃
    同樣的以上一小節的案例來說明,我的 Master 管理的是 vbird.tw 這個領域名稱, 他所需要設定的檔案有六個,分別是設定檔 /etc/named.conf,以及 zone 的資料表, 在 /var/named 裡面的 named.root, named.localhost, named.127.0.0, named.vbird.tw named.192.168.1 等等。

    至於 slave 方面,同樣需要設定 /etc/named.conf ,不過,在 zone file 方面,他僅需要 named.root, named.localhost, named.127.0.0 而已,另外兩個檔案會自動建立!


  2. Master 的設定
    Master 的設定與上一小節幾乎完全相同,只是要變一個設定值,請修改 /etc/named.conf 成為這樣:
    ....(略)....
    zone "vbird.tw" {
            type master;
            file "named.vbird.tw";
            allow-transfer { 192.168.1.21; };
    };
    zone "1.168.192.in-addr.arpa" {
            type master;
            file "named.192.168.1";
            allow-transfer { 192.168.1.21; };
    };
    ....(略)....
    
    亦即我僅允許 192.186.1.21 取得我的 zone file 的所有內容之傳送啊!其他的幾個檔案都與前一小節相同。


  3. Slave 的設定
    至於 Slave 的設定方面,在 /var/named 裡面的 named.root, named.localhost, named.127.0.0 都可以直接由 Master 複製過來,而 /etc/named.conf 也可以直接複製過來, 只要修改成底下這樣即可:
    [root@test2 root]# vi /etc/named.conf
    ....(略)....
    zone "vbird.tw" {
            type slave;
            file "named.vbird.tw";
            masters { 192.168.1.2; };
    };
    zone "1.168.192.in-addr.arpa" {
            type slave;
            file "named.192.168.1";
            masters { 192.168.1.2; };
    };
    ....(略)....
    
    看到了嗎?在 Master 的部分允許來自 192.168.1.21 這個 slave 的要求,而 slave 就是向 192.168.1.2 這個 master 要求 zone file 的傳送!在這樣的設定完畢之後, 兩邊均同時啟動 named ,在 Slave 就會自動的建立兩個 zone file 囉!

    未來,您要增加其他的主機名稱與 IP 對應的資料,只要在 Master 那部主機上設定好, 並重新啟動 named ,那麼 Master 會依據 serial number 來判斷是否通知 slave 前來更新, 此外, Slave 也會依據設定的時間值,自動的來 Master 讀取資料喔! 如此一來,管理上面是否真的比較容易呢! ^_^y

大標題的圖示Client 端的設定:
說完了在 DNS Server 端的設定,接下來,我們再來聊一聊關於 Client 端的設定與測試! 從前面的說明裡面,我們曉得主機名稱對應到 IP 有兩種方法,早期的方法是直接寫在檔案裡面來對應, 後來比較新的方法則是透過 DNS 架構!那麼這兩種方法目前的使用狀態是怎樣的呢?
  • 檔案設定:
    既然已經完成了 DNS 主機的設定,接下來自然要進行 Client 端的連線測試啦!要怎麼測試呢?底下有幾個檔案請特別留意喔:

    • /etc/hosts :剛剛上面就提過了,這個是最早的 hostname 對應 IP 的檔案;
    • /etc/resolv.conf :這個重要!就是 DNS 主機的 IP,您的 Client 就是利用這裡面設定的 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 168.95.1.1
    nameserver 139.175.10.20
    
    DNS 主機的 IP 可以設定多個,這可以讓您的個人電腦有備援的功能!舉例來說, 我上面共設定了三部主機作為我的 DNS 查詢,當 192.168.1.2 那部主機掛點時, 我的 Client 電腦會立刻以第二部主機作為 DNS 查詢的主要主機。所以, 通常我們都會建議人家在這個檔案內可以設定三個左右的 DNS 主機名稱!以保不時之需啊∼

    另外,上面三個 DNS 的 IP 那個會先被使用?當然是照順序來的∼ 所以會先以 192.168.1.2 那部主機來查詢,若 192.168.1.2 掛了,才會使用 168.95.1.1 那部來查詢。

    有個觀念得要提醒一下,我們常常建議人家,在自家設的, 沒有經過合法授權的 DNS 最好不要以 Internet 上面已經存在的領域名稱來練習架設! 舉例來說,假設今天我以我的 192.168.1.2 那部機器來架設 *.yahoo.com 的領域, 也就是說,在 192.168.1.2 那部機器是有提供 yahoo.com 的 zone 的資料的(註:那是虛擬的∼) 但是因為我將 192.168.1.2 放置在第一位,導致每次的查詢其實 yahoo.com 這個領域的資料都是直接由 192.168.1.2 所提供,這很不好∼因為可能會造成您的用戶端的不便∼

    好了,我們要測試我們的 DNS 主機設定是否正確囉!

  • 測試 DNS 設定:
    測試 DNS 的程式有很多,我們先來使用最簡單的 host 吧!然後還有 nslookup 及 dig 哩!

    host
    語法:
    [root@test root]# host [-a] [FQDN] [server]
    [root@test root]# host -l [domain] [server]
    參數說明:
    -a :所有的資訊都列出來,列出的資訊包含有 TTL
         DNS 主機的IP,所欲尋找的主機的 IP 等等,資料豐富啊!
    -l :將後面接的 domain 內的所有的 host 都列出來!不過,這個項目要能夠
         被利用,就必須要有 allow-transfer 的項目在 /etc/named.conf 裡面被啟動!
    server:這個參數可有可無,當想要利用非 /etc/resolv.conf 內的 DNS 主機
            來查詢主機名稱與 IP 的對應時,就可以利用這個參數了!
    範例:
    
    # 強制以我的 192.168.1.2 這部 DNS 主機來查詢
    [root@test root]$ host mdk.vbird.tw 192.168.1.2 
    Using domain server:     <==如果加上最後的 192.168.1.2 這個 server 的參數
    Name: 192.168.1.2        <==那就會出現這三行字眼,表示用的 DNS 主機不是
    Address: 192.168.1.2#53  <==/etc/resolv.conf 所欲設的 DNS 主機!
    
    mdk.vbird.tw has address 192.168.1.2
    # 很簡單吧!立刻找到 IP 囉!
    
    [root@test root]$ host -a mdk.vbird.tw 192.168.1.2
    Trying "mdk.vbird.tw"
    Using domain server:
    Name: 192.168.1.2
    Address: 192.168.1.2#53
    Aliases:
    
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41087
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, 
    ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;mdk.vbird.tw.                  IN      ANY
    
    ;; ANSWER SECTION:
    mdk.vbird.tw.           600     IN      A   192.168.1.2
    mdk.vbird.tw.           600     IN      TXT "The testing DNS"
    
    ;; AUTHORITY SECTION:
    vbird.tw.               600     IN      NS  mdk.vbird.tw.
    
    Received 95 bytes from 192.168.1.2#53 in 6 ms
    # 在這個範例當中,我們可以看到整個顯示出的訊息包括有幾個部分:
    # HEADER(標題)部分==>顯示查詢的內容有哪些,包括一個 query, 兩個 answer
    #                    及一個驗證部分。
    # QUESTION(問題)====>顯示所要查詢的內容,因為我們是查詢 mdk.vbird.tw
    #                    所以這裡自然就是顯示這個訊息。
    # ANSWER(回應)======>依據剛剛的 QUESTION 去查詢所得到的結果,因為在我們的
    #                    設定當中僅有設定了 A 與 TXT 的標籤,所以這裡自然就....
    # AUTHORITY(驗證)===>由這裡我們可以查閱 vbird.tw 這個領域是由 mdk.vbird.tw 
    #                    來設定的∼
    # 裡面那個 600 是什麼呢?很簡單,他就是我們所設定的 ttl 那個數值啦!
    
    [root@test root]$ host -l vbird.tw 192.168.1.2
    Using domain server:
    Name: 192.168.1.2
    Address: 192.168.1.2#53
    Aliases:
    
    vbird.tw name server mdk.vbird.tw.
    mdk.vbird.tw has address 192.168.1.2
    win2k.vbird.tw has address 192.168.1.100
    winxp.vbird.tw has address 192.168.1.200
    # 上面的資訊可就熟悉多了吧?!沒錯!那就是我們在 
    # /var/named/named.vbird.tw 裡面的設定值啊!
    # 不過,並不是所有的 domain 都可以作這樣的事情∼舉例來說,如果我們下達:
    # host -l tw.yahoo.com 則將會得到:
    # Host tw.yahoo.com not found: 5(REFUSED)
    # ; Transfer failed.
    # 這樣的回應,這是因為在 /etc/named.conf 裡面並沒有設定 allow-transfer 
    # 那個設定選項的原因啊!
    
    事實上,使用 host 幾乎就可以達到我們的要求了∼也不需要什麼其他的指令∼ 不過,其實還是得要知道其他的查詢指令啦∼

    nslookup
    語法: 
    [root @test root]# nslookup [FQDN]
    [root @test root]# nslookup
    參數說明:
    如果在 nslookup 後面沒有加上任何主機名稱或 IP ,那將進入 nslookup 的查詢功能
    在 nslookup 的查詢功能當中,可以輸入兩個參數來進行特殊查詢:
    set type=any :列出所有的資訊『正解方面設定檔』
    set type=mx  :列出與 mx 相關的資訊!
    範例: 
    
    [root@test named]# nslookup win2k.vbird.tw 192.168.1.2
    Server:         192.168.1.2
    Address:        192.168.1.2#53
    
    Name:   win2k.vbird.tw
    Address: 192.168.1.100
    # 單純的將 hostname 與 IP 對應列出而已,不過,
    # 還是會將查詢的 DNS 主機的 IP 列出來的!
    
    [root@test named]# nslookup  <==進入 nslookup 查詢畫面
    > 192.168.1.2<==執行反解的查詢
    Server:         192.168.1.2
    Address:        192.168.1.2#53
    
    2.1.168.192.in-addr.arpa        name = mdk.vbird.tw.
    
    > www.vbird.tw   <==執行正解的查詢
    Server:         192.168.1.2
    Address:        192.168.1.2#53
    
    www.vbird.tw    canonical name = mdk.vbird.tw.
    Name:   mdk.vbird.tw
    Address: 192.168.1.2
    > tw.yahoo.com   <==執行非本機上的查詢
    Server:         192.168.1.2
    Address:        192.168.1.2#53
    
    Non-authoritative answer:
    tw.yahoo.com    canonical name = vip1.tw.tpe.yahoo.com.
    Name:   vip1.tw.tpe.yahoo.com
    Address: 202.43.195.52
    > set type=any   <==顯示所有查詢的資訊
    > mdk.vbird.tw
    Server:         192.168.1.2
    Address:        192.168.1.2#53
    
    Name:   mdk.vbird.tw
    Address: 192.168.1.2
    mdk.vbird.tw    text = "The testing DNS server"
    > exit
    
    在上面的案例當中,請注意,如果您在 nslookup 的查詢畫面當中,輸入 set type=any 或其他參數, 那麼就無法再進行反解的查詢了!這是因為 any 或者是 mx 等等的標誌都是記錄在正解 zone 當中的緣故!

    dig
    語法: 
    [root @test root]# dig [@server] [-t type] [FQDN]
    參數說明:
    -t type :查詢某主機的某個標籤,例如 MX/NS 等等,以及所有標籤 any 等
    @server :如果不想以 /etc/resolv.conf 來作為 DNS 主機,則可在此填入
              其他的 DNS IP!
    範例: 
    
    [root@test root]$ dig @192.168.1.2 mdk.vbird.tw
    ; <<>> DiG 9.2.3 <<>> @192.168.1.2 mdk.vbird.tw
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40211
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;mdk.vbird.tw.                  IN      A
    
    ;; ANSWER SECTION:
    mdk.vbird.tw.           600     IN      A       192.168.1.2
    
    ;; AUTHORITY SECTION:
    vbird.tw.               600     IN      NS      mdk.vbird.tw.
    
    ;; Query time: 4 msec
    ;; SERVER: 192.168.1.2#53(192.168.1.2)
    ;; WHEN: Sun Oct 31 12:24:00 2004
    ;; MSG SIZE  rcvd: 60
    # 我用我的 DNS 主機 192.168.1.2 去查詢 mdk.vbird.tw 這個主機,
    # 可以得到 A 與 NS 的結果!與 host -a mdk.vbird.tw 是否很類似啊!
    
    [root@test root]$ dig @192.168.1.2 -t mx mdk.vbird.tw
    ; <<>> DiG 9.2.3 <<>> @192.168.1.2 -t mx mdk.vbird.tw
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15056
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;mdk.vbird.tw.                  IN      MX
    
    ;; AUTHORITY SECTION:
    vbird.tw.               600     IN      SOA     mdk.vbird.tw. 
    root.mdk.vbird.tw. 2004102901 28800 14400 720000 86400
    
    ;; Query time: 4 msec
    ;; SERVER: 192.168.1.2#53(192.168.1.2)
    ;; WHEN: Sun Oct 31 15:51:29 2004
    ;; MSG SIZE  rcvd: 71
    # 在這個查詢方面,則主要在查詢正解 zone 的 MX 標誌。
    
    事實上, host 與 dig 的查詢輸出結果挺類似的,而且 dig 的輸出資訊更多, 如果您的 DNS 發生不明原因的設定錯誤問題,可以利用 dig 的相關功能來查詢喔!

    whois
    語法: 
    [root@test root]# whois domainname
    範例: 
    
    [root@test root]# whois redhat.com
    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  (22271962I)          noc@REDHAT.COM
          Network Operations Center
          Red Hat, Inc.
          1801 Varsity Drive
          Raleigh, NC 27606
          US
          919-754-4177 fax: 919-754-3704
    
       Record expires on 25-May-2006.
       Record created on 26-May-1994.
       Database last updated on 31-Oct-2004 02:57:02 EST.
    
       Domain servers in listed order:
    
       NS3.REDHAT.COM               66.187.229.10
       NS2.REDHAT.COM               66.187.224.210
       NS1.REDHAT.COM               66.187.233.210
    這個指令可以檢視註冊這個 domain name 的帳號資料,
    例如上面的例子當中,就是以紅帽公司的領域名稱來查詢註冊者的資料的啊!
    
    whois 這個指令可以查詢到當初註冊這個 domain 的使用者的相關資訊。不過, 由於近年來很多網路資訊安全的問題,這個 whois 所提供的資訊真的是太詳細了, 為了保護使用者的隱私權,所以,目前這個 whois 所查詢到的資訊已經不見得是完全正確的了∼ 而且,在顯示出 whois 的資訊之前,還會有一段宣告事項的告知呢∼ ^_^y
無論如何,我們都可以透過 nslookup, host, dig 等等的指令來查詢主機名稱與 IP 的對應, 這些指令的用法可以請您以 man command 來查詢更多的用法喔!

大標題的圖示進階設定:
其實, DNS 主機的運作原理與架設方式的變化,真的很高深莫測的!在這裡, 我們額外的提出一些比較進階的內容給大家參考參考,例如子網域的授權問題, 以及架設一個合法授權的 DNS 主機。


小標題的圖示子網域授權問題
好了,那麼萬一我的網路很大,我只負責上層的 DNS 而已, 下層希望直接交給各單位的負責人來負責,要怎麼設定呢? 舉個例子來說,以成大為例,成大計中僅管理各個系所的的主機 IP 而已,由於各個系所的主機數量可能很大,如果每個人都要請計中來設定, 那麼管理員可能會瘋掉,而且在實際設計上也不太人性化。所以囉,計中就將各個 subdomain (子網域) 的管理權交給各個系所的主機管理員去管理,如此一來, 各系所的設定上面會比較靈活,且上層 DNS 主機也不用太麻煩吶!

好了,那麼如何開放子網域授權呢?我這裡僅說明正解的部分,因為在 ISP 方面通常已經幫我們搞定反解了,所以先不理他!而目前我們去註冊的資訊上面, 通常僅取得的是正解的設定權,例如鳥哥的個人網域 vbird.idv.tw 就是一個例子!好了, 現在假設在我的 mdk.vbird.tw 上面,要將 win2k.vbird.tw 這個子網域切割出去給 win2k.vbird.tw 管理,那麼該怎麼辦呢?
  1. 主機端 mdk.vbird.tw 的設定:
    主機 mdk.vbird.tw 的設定其實很簡單啦!只要將子網域開放出來給別人使用就對了! 怎麼設定呢?您可以直接修改 /var/named/named.vbird.tw ,使他變成如下所示:
    [root@test root]# cd /var/named
    [root@test named]# vi named.vbird.tw
    # 再次提醒,這個檔案名稱是在 /etc/named.conf 裡面設定
    $TTL    600
    @       IN      SOA     mdk.vbird.tw.        root.mdk.vbird.tw.   (
                            2004100601      ; Serial
                            28800           ; Refresh
                            14400           ; Retry
                            720000          ; Expire
                            86400   )       ; minimum
    ; 主機的設定參數部分
    @                  IN      NS      mdk.vbird.tw.
    @                  IN      MX 10   mdk.vbird.tw.
    mdk                IN      A       192.168.1.2
    mdk                IN      TXT     "The testing DNS server"
    phorum             IN      CNAME   mdk
    www                IN      CNAME   mdk.vbird.tw.
    ; 子網域分割出去給其他主機管理的例子!
    win2k.vbird.tw.    IN      NS      win2k.vbird.tw.
    win2k              IN      A       192.168.1.100
    ; 本機上面其他主機的設定資訊方面
    winxp              IN      A       192.168.1.200
    
    上面的特殊字體就是最重要的地方啦!我將 win2k.vbird.tw. 這個網域的 NS 權限(name server)轉給 win2k.vbird.tw 這部主機來管理,而底下列出來 win2k.vbird.tw 這部主機的正解資訊! 那麼未來當有人要查詢類似 www.win2k.vbird.tw 時,則先會到 mdk.vbird.tw 來查詢, 而查到 win2k.vbird.tw 的網域,因此就會向下游的 DNS 亦即是 win2k.vbird.tw 這部機器查詢了!

  2. 下游主機 win2k.vbird.tw 的設定:
    這個設定就簡單啦!直接參考一下我們上面寫的資料,跟著設定,但是您的 domain name 變成 win2k.vbird.tw 就是了!簡單的很吶!所以我就不再多說了∼

小標題的圖示架設一個合法的授權的 DNS 主機:
好啦!現在您應該知道什麼是『經上游授權的合法 DNS 主機』了吧?! 沒錯!就是上游的 DNS 主機將子網域的查核權開放給您來設定就對啦!嗯!雖然知道原理, 但是那麼我要如何來架設一個合法的 DNS 主機呢?好讓我自己管理自己的 domain !舉例來說,鳥哥的 vbird.idv.tw 就是 VBird 自己管理的哩∼底下我們就來談一談,如何向 ISP 申請一個合法授權的 DNS 主機,或者是合法的主機名稱啊!
  1. 申請一個合法的 domain name
    既然是要建立一個合法的 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 不建議用這個選項!
    • 註冊完畢!

  2. DNS 主機的詳細設定 之設定內容來設定您的主機:
    如果您已經以 DNS 主機的方式申請了一個 domain name ,那麼您就必須要設定您的 DNS 主機了! 請注意,這個情況之下,您只要設定您的註冊的網域的正解即可! 反解部分則先不要理會,當然,如果您有辦法的話,最好還是請上層的 ISP 幫您設定囉!

  3. 測試:
    如此一來,您的 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 咯!


小標題的圖示解決 rndc key 的問題:
由於 BIND 提供了比較安全的 BIND 管理機制,因此,比較新的 BIND 9 以後的版本, 都需要提供所謂的 rndc key ,才能正常無誤的啟動 Bind 喔!

那麼如何提供 BIND 這個 Key 呢?很簡單,只要執行 rndc-confgen 就行了!
[root@test root]# rndc-confgen
# Start of rndc.conf
key "rndc-key" {
        algorithm hmac-md5;
        secret "l6zE+CnSFuteQHxYwIGQqq==";
};

options {
        default-key "rndc-key";
        default-server 127.0.0.1;
        default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
#       algorithm hmac-md5;
#       secret "l6zE+CnSFuteQHxYwIGQqq==";
# };
#
# controls {
#       inet 127.0.0.1 port 953
#               allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
接下來,只要將上表複製到 /etc/rndc.conf ,並且將
key "rndc-key" {
      algorithm hmac-md5;
      secret "l6zE+CnSFuteQHxYwIGQqq==";
};
controls {
      inet 127.0.0.1 port 953
              allow { 127.0.0.1; } keys { "rndc-key"; };
};
複製到 /etc/named.conf 就可以了!什麼時候需要提供這個 Key 呢? 如果妳啟動 DNS 的時候,老是在 /var/log/messages 裡面發現這一行:

couldn't add command channel 127.0.0.1#953: not found

這就表示您的 DNS 系統必須要提供這個 key 啦!請按表操課吧!

小標題的圖示架設動態 DNS 主機:
談完了上面這麼多的設定之後,接下來,我們談一個比較有趣的咚咚∼ 那就是 動態 DNS 主機 的設定∼

什麼是動態 DNS 主機呢?還記得我們在 合法的 DNS 主機 裡面提到的,如果我們本身是以撥接制的 ADSL 連上 Internet 的時候,基本上, 我們的 IP 是 ISP 隨意提供的,因此每次上網的 IP 都不固定,所以, 我們沒有辦法以上面的 DNS 設定來給予這種連上 Internet 的方法一個適當的主機名稱。 也因此,如果我們想要利用這種沒有固定 IP 的連線方法架設網站時,就得要有特殊的管道了∼ 其中之一的方法就是利用 Internet 上面已經提供的免費動態 IP 對應主機名稱的服務! 例如之前提到的 http://www.adsldns.org (但是在 2004/10 月份中旬,這個網站掛點好久好久...) 或者是 http://www.no-ip.org 等等。

提供這樣的服務利用的是什麼原理呢?基本上, DNS 主機還是得要提供 Internet 相關的 zone 的主機名稱與 IP 的對應資料才行,所以,動態 DNS 主機 (Dynamic DNS, 底下我們稱為 DDNS 主機) 就必須要提供一個機制,讓用戶端可以透過這個機制來修改他們在 DDNS 主機上面的名稱與 IP 對應資料才行。

我們的 BIND 9 也有提供類似的機制喔!那就是利用 update-policy 這個選項,配合認證用的 key 來進行資料檔案的更新。簡單的說, 1) 我們的 DDNS 主機先提供 Client 一把 Key (就是認證用的資料, 你可以將他想成是帳號與密碼的概念), 2) Client 端利用這把 Key ,並配合 BIND 9 的 nsupdate 指令, 就可以連上 DDNS 主機,並且修改主機上面的 Zone file 內的對應表了。感覺上很像很簡單喔! 沒錯啊!架設上真的很簡單的∼底下我們就來嘗試設定一下喔:


  1. DDNS Server 端的設定:
    如同上面說的,我們必須要提供 client 一把認證用的 key ,那麼這把 key 怎麼產生呢? 又,如何設定 DDNS 主機呢?這裡提供一個案例。

    假設我有一部機器,主要是用來作為 WWW 主機用的, 但是沒有固定 IP,而我已經有 mdk.vbird.tw 這個 DNS 主機了。假設我的這部 WWW 主機想要的主機名稱是 web.vbird.tw 這個主機名稱,那該如何設定呢?

    產生認證用的 key
    我要產生一把 key 給 web 這個主機使用 (領域名稱為 vbird.tw),可以這樣做:
    [root@test root]# mkdir -p /var/named/keys; cd /var/named/keys
    [root@test keys]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST web
    # -a [密碼演算方法]:這個參數後面可以接幾種不同的密碼演算方式,
    #                    包括 RSAMD5, RSA, DSA, DH 與 HMAC-MD5 ,
    #                    在這裡,我直接使用比較常用的 HMAC-MD5 這個演算法∼
    # -b [加密位元組]  :加密的密碼長度也是可以控制的!我只用 128 位元而已。
    # -n [擁有類型]    :這把 Key 是給 Client 用來作為 HOST 更新或者是整個 
    #                    ZONE 的更新?一般來說,我們僅允許用戶端更新他自己
    #                    的主機對應,所以只要給予 HOST 的權限就好了!
    # name             :最後給予這把 Key 一個名稱,我這裡將這把 Key 
    #                    名稱訂為 web
    Kweb.+157+29323
    [root@test keys]# ls -l
    total 8
    -rw-------  1 root root 47 Oct 31 20:09 Kweb.+157+29323.key
    -rw-------  1 root root 81 Oct 31 20:09 Kweb.+157+29323.private
    # 最後會產生兩個檔案,分別是 Kxxx.key 及 Kxxx.private,
    # 其中, .key 是主要用來作為 DDNS 主機端設定的公鑰,這把 Key 的內容
    # 會被複製到 /etc/named.conf 裡面進行設定喔!
    [root@test keys]# more Kweb.+157+29323.key
    web. IN KEY 512 3 157 gxHUFoGGRE91YyAVuMBh+Q==
    # 特別注意,上面輸出的特殊字體中,就是 Key 的內容!
    # 這些資料是經過加密的,最後會被複製到 /etc/named.conf 裡面喔!
    
    如此一來,這把 Key 就被設定好了!其中,那個 *.key 的檔案內容關於密碼的部分, 會被設定於 /etc/named.conf 裡面喔!

    設定 DDNS 主機上的 named.conf 檔案
    在設定上面也是挺簡單的,只要將 Key 的資料登錄進去,再將要開放寫入的 zone 設定好 policy (規則) 就好了!
    [root@test keys]# vi /etc/named.conf
    ....(略)....
    key "web" {
    	algorithm hmac-md5;
    	secret "gxHUFoGGRE91YyAVuMBh+Q==";
    };
    zone "vbird.tw" {
            type master;
            file "named.vbird.tw";
            update-policy {
                    grant web name web.vbird.tw. A;
            };
    };
    ....(略)....
    # 注意到上頭的 gran web name web.vbird.tw. A; 那一行,
    # gran 後面接的就是 key 的名稱,也就是說,我這把 web 的 key 
    # 在這個 zone (vbird.tw) 裡面可以修改主機名稱 web.vbird.tw 
    # 的 A 的標誌,亦即是修改主機的 IP 對應啦!語法也就是:
    # gran [key_name] name [hostname] 標籤
    # 也就是說,我的一把 key 其實可以給予多種權限喔!看您如何規範了。
    
    設定好之後,給他重新啟動,然後觀察一下 /var/log/messages 裡面有沒有錯誤即可! 如此一來,DDNS 主機端就設定妥當囉!


  2. Client 端的更新:
    接下來則是 DDNS Client 端的更新了。首先,您必須要由 Server 端取得剛剛建立的那兩個檔案, 請將剛剛建立的 Kweb.+157+29323.key 及 Kweb.+157+29323.private 利用 SSH 的 sftp 傳送過來, 我將他放置到 /usr/local/ddns 裡面去,然後測試看看:
    [root@test keys]# mkdir /usr/local/ddns; cd /usr/local/ddns
    # 假設此時您已經將兩個檔案給他複製到此目錄下了!
    [root@test keys]# nsupdate -k Kweb.+157+29323.key
    > server 192.168.1.2
    > update delete web.vbird.tw
    > update add web.vbird.tw 0 A 192.168.1.222
    > send  最後在此按下 [ctrl]+D 即可
    # 請注意到 update add web.vbird.tw 0 A 192.168.1.222 這行,
    # 他的意義說的是,新增一筆資料, ttl 是 0 ,給予 A 的標籤,
    # 對應到 192.168.1.222 的意思∼
    # 至於 nsupdate -k 後面加的則是我們在 Server 端產生的那個 key 檔案!
    
    然後您就會發現到 /var/named 裡面多出一個暫存檔,那就是 /var/named/named.vbird.tw.jnl 當然,/var/named/named.vbird.tw 就會隨著 client 端的要求而更新資料喔!

    由於手動更新好像挺麻煩的,我們就讓 Client 自動更新吧!利用底下這個 script 即可!
    [root@test root]# vi /usr/local/ddns/ddns_update.sh
    #!/bin/bash
    #
    # Update your Dynamic IP by using BIND 9 's tools
    #
    ###############################################
    # History
    # 2004/10/27    VBird   First time release
    #
    ##############################################
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    export PATH
    
    # 0. keyin your parameters
    basedir="/usr/local/ddns"                # working directory
    keyfile="$basedir"/"Kweb.+157+29323.key" # your ddns' key (filename)
    ttl=600                                  # the ttl time ( 10 min. )
    outif="ppp0"                             # Your interface (to internet)
    hostname="web.vbird.tw"                  # Your hostname
    servername="192.168.1.2"                 # The primary DNS server
    
    # Get your new IP
    newip=`ifconfig "$outif" | grep 'inet addr' | \
            awk '{print $2}' | sed -e "s/addr\://"`
    checkip=`echo $newip | grep "^[0-9]"`
    if [ "$checkip" == "" ]; then
            echo "$0: The interface can't connect internet...."
            exit 1
    fi
    
    # create the temporal file
    tmpfile=$basedir/tmp.txt
    cd $basedir
    echo "server $servername"                       >  $tmpfile
    echo "update delete $hostname A "               >> $tmpfile
    echo "update add    $hostname $ttl A $newip"    >> $tmpfile
    echo "send"                                     >> $tmpfile
    
    # send your IP to server
    nsupdate -k $keyfile -v $tmpfile
    
    您只要將上述的程式裡面,特殊字體的部分給他修改一下,就能夠以 /etc/crontab 的方式在您的系統內自動執行了!
利用 BIND 9 所提供的這個服務,我們只要具有一組固定的 IP ,並向 ISP 申請一個合法授權的 domain name, 就可以提供不論是固定或者是非固定的 IP 使用者,一個合法的主機名稱了! 並且,使用者也可以自行透過 nsupdate 來修改自己的 IP 對應!以讓自己的主機 IP 永遠與主機名稱保持正確的對應!這對只有撥接制上網的用戶來說,真是方便啊!

大標題的圖示重點回顧:
  • 在 Internet 當中,任何一部合法的主機都具有獨一無二的主機名稱,這個主機名稱包含了 hostname 與 domain name ,並稱為 Fully Qualified Domain Name (FQDN);
  • 為了克服人類對於 IP 不易記憶的困擾,而有名稱解析器的產生,首先是 /etc/hosts ,而後則是 DNS 系統的產生;
  • DNS 伺服器的類型主要分為 master, slave 以及只進行快取記錄的 cache-only 的 DNS 主機;
  • Master/Slave 架構下的 DNS 主機系統,不論是 Master/Slave 主機均需要能夠正確的提供 hostname 與 IP 的對應才行。
  • Slave 主機本身並沒有自行設定 zone file ,其 zone file 是由 Master 主機傳送而來,因此, master 主機必須要針對 slave 主機開放 allow-transfer 的設定項目才行。
  • 目前 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 的說明,與解決之道!
2004/10/29:新增了 rndckey 的說明與解決之道!
2004/10/30:新增了 Master/Slave 的架構設定
2004/10/31:新增了 動態 DNS 主機的設定
2005/07/19:增加了 SOA 內五個數字的大小
2008/08/18:更早之前的版本:按此連結
 
     
| 繁體主站 | 簡體主站 | 基礎篇 | 伺服器 | 企業應用 | 桌面應用 | 安全管理 | 討論板 | 酷學園 | 書籍戡誤 | 鳥哥我 | 崑山資傳 |
本網頁主要以 firefox 配合解析度 1024x768 作為設計依據
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu