ITPub博客

首页 > IT基础架构 > 网络安全 > 簡易 DNS 伺服器

簡易 DNS 伺服器

原创 网络安全 作者:m77m78 时间:2006-05-20 01:13:26 0 删除 编辑
簡易 DNS 伺服器
原理部分
目前人類的電腦網路裡面,使用最普及的是所謂的 IP ( IPv4 )協定,透過這個協定, 我們可以將資料傳送到任何一個可以連上 Internet 的地方。 不過,這個 IP 協定所設定的 IP 是由 32 個位元,而轉成十進位的話,是由 4 組數字所集合而成的, 例如 123.234.56.78 這樣的格式。當我們利用 Internet 傳送資料的時候, 就需要這個 IP ,否則資料怎麼知道要被送到哪裡去?( 當然啦, 傳送資料的方法有很多,不見得全部都是透過 IPv4 這個協定,例如 NetBIOS 就是一例。 不過,在這裡,我們不討論其他的傳輸方法,專門探討 IPv4 這個協定喔! )
[@more@]
簡易 DNS 伺服器
原理部分
目前人類的電腦網路裡面,使用最普及的是所謂的 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 主機的咦髁鞒?/font>

由上面的圖示來看,您可以發現,其實,我們 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 參數的咦髡f明

    所有的 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.反解檔案
  7. 大概就是這幾個!要注意的是,除了第一個 /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.0192.168.1.2mdk.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 的資料同步咦饔嘘P!
        • 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.
      
      上面前幾行跟前面一樣,就不提了!只有最後一

      来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/34329/viewspace-836569/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 簡易 SAMBA 伺服器
请登录后发表评论 登录
全部评论

注册时间:2008-04-25

  • 博文量
    168
  • 访问量
    731781