我們知道電腦網路系統只認識所謂的 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 的方式來上網時 ) ?呵呵! 他最大的用途就是『造福懶惰與記憶性薄弱的人類∼』 哈哈!沒錯!為什麼說他是造福人類呢?且聽我娓娓道來:

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

關於『授權』的意義:
很多朋友都認為『 架設 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 ,所以理論上,是比較不安全的!因此,能不設當然就不要設定比較好囉!所以,這裡的建議如下:

正解與反解的 Zone 意義:
講了這許多,還得再提一提關於正解、反解與 Zone 的問題才行啊!

架設 DNS 所需要的套件:

設定部分:
在 DNS 的設定上面,基本上,您必須要已經很清楚 zone 是什麼了,否則很難繼續設定喔!會搞的一塌糊塗的∼無論如何,您一定要知道的是, bind 的設定檔,就是 /etc/named.conf ( 在新版的 BIND 當中, 這個檔案似乎已經被搬移到 /var/named/chroot 當中了!您必須自行尋找∼ ) 這個檔案,如果他不存在的話,請自行建立吧!另外,針對 DNS server 的類型大致上可以分為三類,分別是: 那麼 Master/Slave 的資料更新到底是如何動作的呢?請注意,Slave 是需要更新來自 Master 的 DNS 資料啊!所以當然 Slave 在設定之初就需要存在 Master 才行喔!好了, Master 與 Slave 的資料同步動作可以由底下的圖示來看:

圖四、Master/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 的好處與壞處,其實有很多種的意見!大致的意見可分為這兩派:
很多種說法啦!鳥哥本人也覺得很有趣哩!只是不知道哪一派較正確就是了 >_<"" ,不過可以知道的是,如果上層的 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 架構!那麼這兩種方法目前的使用狀態是怎樣的呢? 無論如何,我們都可以透過 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 永遠與主機名稱保持正確的對應!這對只有撥接制上網的用戶來說,真是方便啊!

重點回顧:

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

參考資源:

本章習題練習:
前往參考解答

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:更早之前的版本:按此連結