伺服器架設篇 - CentOS 5.x

第十九章、主機名稱控制者:DNS 伺服器

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

最近更新時間: 2011/05/10

本文資料主要針對 CentOS 5.x 的系統進行說明,而 CentOS 5.x 已經在 2017 年 3 月份正式不再進行維護,事實上,在 2012 年底幾乎就不再維護了。 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 CentOS 5 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
我們都知道,在『記憶』的角色上,人腦總是不如電腦的,而人們對文字的印象又比數字高。因此,想要使用純粹的 TCP/IP 來上網,實在不好記憶又很麻煩。為了適應人類的使用習慣,因此一個名為 DNS 的服務,幫我們將主機名稱解析為 IP 好讓大家只要記得主機名稱就能使用 Internet 的咚咚就這麼誕生啦!在這一章當中,我們會談一談 DNS 服務內的正、反解 zone 的意義,解析主機名稱的授權概念與整體查詢流程,以及 master/slave DNS 服務的配置等等呦!趕緊動動腦先~

19.1 什麼是 DNS

DNS 越來越重要,尤其未來 IPv6 這個需要 128bits 位址的玩意兒。因為我們連 IPv4 的 32bits 都背不起來了, 128bits 要怎麼背? 這時主機名稱自動解析為 IP 就很重要啦!那就是 DNS。但是 DNS 的架設有點麻煩,重點是原理的部分比較不好理解。 因此在這個小節當中,讓我們先來談談與網路主機名稱有關的一些知識,這樣架設 DNS 才不會出問題。

19.1.1 用網路主機名稱取得 IP 的歷史淵源

目前的網際網路世界使用的是所謂的 TCP/IP 協定,其中 IP 為第四版的 IPv4 。不過,這個 IPv4 是由 32 位元所組成,為了人腦已經轉成四組十進位的數字了,例如 12.34.56.78 這樣的格式。當我們利用 Internet 傳送資料的時候,就需要這個 IP ,否則資料封包怎麼知道要被送到哪裡去?


  • 單一檔案處理上網的年代: /etc/hosts

然而人腦對於 IP 這種數字的玩意兒,記憶力實在是不怎麼樣。但是要上 Internet 又一定需要 IP,怎麼辦?為了應付這個問題, 早期的朋友想到一個方法,那就是利用某些特定的檔案將主機名稱與 IP 作一個對應, 如此一來,我們就可以透過主機名稱來取得該主機的 IP 了!真是個好主意,因為人類對於名字的記憶力可就好多了! 那就是 /etc/hosts 這個檔案的用途了。

可惜的是,這個方法還是有缺憾的,那就是主機名稱與 IP 的對應無法自動於所有的電腦內更新, 且要將主機名稱加入該檔案僅能向 INTERNIC 註冊,若 IP 數量太多時,該檔案會大到不像話,也就更不利於其他主機同步化了。 如下圖所示,用戶端電腦每次都得要重新下載一次檔案才能順利聯網!

早期透過單一檔案進行網路連線的示意圖
圖 19.1-1、早期透過單一檔案進行網路連線的示意圖

第四章 4.2.1 裡面我們約略談過 /etc/hosts 這個檔案的用法,基本上該檔案內容就是『IP 主機名稱 主機別名一 主機別名二...』。在裡面最重要的就是 localhost 對應到 127.0.0.1 這個咚咚!你千萬不能刪除該筆記錄的。這裡也再次強調,在你的私有網域內部,最好將所有的私有 IP 與主機名稱對應都寫入這個檔案中啦!


  • 分散式、階層式主機名稱管理架構: DNS 系統

早期網路尚未流行且電腦數量不多時,/etc/hosts 倒是還夠用的,但自從 90 年代網路熱門化後,單一檔案 /etc/hosts 的聯網問題就發生上面講的狀況啦!為了解決這個日益嚴重的問題,柏克萊大學發展出另外一套階層式管理主機名稱對應 IP 的系統, 我們稱它為 Berkeley Internet Name Domain, BIND ,這個系統可就優秀的多了~ 透過階層式管理,可以輕鬆的進行維護的工作~太棒了!這也是目前全世界使用最廣泛的領域名稱系統 (Domain Name System, DNS) 哩~透過 DNS ,我們不需要知道主機的 IP ,只要知道該主機的名稱,就能夠輕易的連上該主機了!

DNS 利用類似樹狀目錄的架構,將主機名稱的管理分配在不同層級的 DNS 伺服器當中,經由分層管理, 所以每一部 DNS 伺服器記憶的資訊就不會很多,而且若有 IP 異動時也相當容易修改!因為你如果已經申請到主機名稱解析的授權, 那麼在你自己的 DNS 伺服器中,就能夠修改全世界都可以查詢到的主機名稱了!而不用透過上層 ISP 的維護呢! 自己動手當然是最快的啦!

由於目前的 IPv4 已經接近發送完畢的階段,因此未來那個 128bits 的 IPv6 會逐漸熱門起來。那麼你需要背 128bits 的 IP 來上網嗎?想必是不可能的!因此這個可以透過主機名稱就解析到 IP 的 DNS 服務,可以想像的到,它會越來越重要。此外,目前全世界的 WWW 主機名稱也都是透過 DNS 系統在處理 IP 的對應,所以,當 DNS 掛點時,我們將無法透過主機名稱來連線,那就幾乎相當於沒有 Internet 了

因為 DNS 是這麼的重要,所以即使我們沒有架設它的必要時,還是得要熟悉一下它的原理才好。因此,跟 DNS 有關的 FQDN、Hostname 與 IP 的查詢流程,正解與反解、合法授權的 DNS 伺服器之意義,以及 Zone 等等的知識作一個認識才行!

Tips 鳥哥 在底下的說明當中,我們有時會提到 DNS 有時會提到 BIND ,這有什麼不同? 由上面的說明裡面,你可以瞭解到, DNS 是一種網際網路的通訊協定名稱, 至於 Bind 則是提供這個 DNS 服務的軟體~這樣你瞭解了嗎?!

  • 完整主機名稱: Fully Qualified Domain Name (FQDN)

第一個與 DNS 有關的主機名稱概念,就是『主機名稱與領域名稱 (hostname and domain name)』的觀念,以及由這兩者組成的完整主機名稱 Fully Qualified Domain Name, FQDN 的意義了。在討論這個主題之前,我們來聊一聊比較生活化的話題:

  • 以區域來區分同名同姓者的差異: 網路世界其實有很多人自稱為『鳥哥』的,包括敝人在下小生我啦!那麼你怎麼知道此鳥哥非彼鳥哥呢? 這個時候你可以利用每個鳥哥的所在地來作為區分啊,比如說台南的鳥哥與台北的鳥哥等。 那萬一台南還有兩個人自稱鳥哥怎麼辦?沒關係,你還可以依照鄉鎮來區分呢!比如說台南北區的鳥哥及台南中區的鳥哥。 如果將這個咚咚列出來,就有點像這樣:
    鳥哥、北區、台南
    鳥哥、中區、台南
    鳥哥、台北
    ......
    是否就可以分辨每個鳥哥的不同點了呢?呵呵!沒錯!就是這樣!那個地區就是『領域 (domain) 』,而鳥哥就是主機名啦!

  • 以區域號碼來區分相同的電話號碼: 另外一個例子可以使用電話號碼來看,假如高雄有個 1234567 而台南也有個 1234567,那麼(1)你在高雄直接撥接 1234567 時,他會直接掛入高雄的 1234567 電話中,(2)但如果你要撥到台南去,就得加入 (06) 這個區碼才行!我們就是使用區碼來做為辨識之用的!此時那個 06 區碼就是 domain name,而電話號碼就是主機名稱啦!

有沒有一點點瞭解鳥哥想表達的啦?我們上面講到,DNS 是以樹狀目錄分階層的方式來處理主機名稱,那我們知道樹狀目錄中, 那個目錄可以記錄檔名。那麼 DNS 記錄的哪個咚咚跟『目錄』有關?就是那個領域名稱。領域名稱底下還可以記錄各個主機名稱, 組合起來才是完整的主機名稱 (FQDN)。

舉例來說,我們常常會發現主機名稱都是 www 的網站,例如 www.google.com.tw, www.seednet.net, www.hinet.net 等等,那麼我們怎麼知道這些 www 名稱的主機在不同的地方呢?就需要給他領域名稱囉!也就是 .google.com.tw, .seednet.net, .hinet.net 等等的不同,所以即使你的主機名稱相同,但是只要不是在同一個領域內,那麼就可以被分辨出不同的位置囉!

我們知道目錄樹的最頂層是根目錄 (/),那麼 DNS 既然也是階層式的,最頂層是啥呢?每一層的 domain name 與 hostname 又該怎麼分?我們舉鳥哥所在的崑山科大的 WWW 伺服器為例好了 (www.ksu.edu.tw) :

分階層的 DNS 架構,以崑山科大為例
圖 19.1-2、分階層的 DNS 架構,以崑山科大為例 (hostname & domain name)

在上面的例子當中,由上向下數的第二層裡面,那個 .tw 是 domain name ,而 com, edu, gov 則是主機的名稱,而在這個主機的名稱之管理下,還有其他更小網域的主機,所以在第三層的時候,基本上,那個 edu.tw 就變成了 domain name 了!而崑山科大與成大的 ksu, ncku 則成為了 hostname 囉!

以此類推,最後得到我們的主機那個 www 是主機名稱,而 domain name 是由 ksu.edu.tw 那個名字所決定的!自然,我們的主機就是讓管理 ksu.edu.tw 這個 domain name 的 DNS 伺服器所管理的囉!這樣是否瞭解了 domain name 與 hostname 的不同了呢?

Tips 鳥哥 並不是以小數點 (.) 區分 domain name 與 hostname 喔!某些時刻 domain name 所管理的 hostname 會含有小數點。 舉例來說,鳥哥所在的資訊傳播系並沒有額外的 DNS 伺服器架設,因此我們的主機名稱為 www.dic ,而 domain name 還是 ksu.edu.tw ,因此全名為 www.dic.ksu.edu.tw 哩!

19.1.2 DNS 的主機名稱對應 IP 的查詢流程

約略瞭解了 FQDN 的 domain name 與 hostname 之後,接下來我們要談一談這個 DNS 的: (1)階層架構是怎樣? (2)查詢原理是怎樣?總是要先知道架構才能知道如何查詢主機名稱的吶!所以底下我們先來介紹一下整體的 DNS 階層架構。


  • DNS 的階層架構與 TLD

我們依舊使用台灣學術網路的 DNS 伺服器所管理的各 domain 為例,將最上層到崑山科大 (ksu) 時,之間的各層繪製如下圖:

從最上層到崑山科大之間的 DNS 階層示意圖
圖 19.1-3、從最上層到崑山科大之間的 DNS 階層示意圖

在整個 DNS 系統的最上方一定是 . (小數點) 這個 DNS 伺服器 (稱為 root),最早以前它底下管理的就只有 (1)com, edu, gov, mil, org, .net 這種特殊領域以及 (2)以國家為分類的第二層的主機名稱了!這兩者稱為 Top Level Domains (TLDs) 喔!

  • 一般最上層領域名稱 (Generic TLDs, gTLD):例如 .com, .org, .gov 等等
  • 國碼最上層領域名稱 (Country code TLDs, ccTLD):例如 .tw, .uk, .jp, .cn 等

先來談談一般最上層領域 (gTLD) 好了,最早 root 僅管理六大領域名稱,分別如下:

名稱代表意義
com公司、行號、企業
org組織、機構
edu教育單位
gov 政府單位
net 網路、通訊
mil 軍事單位

但是網際網路成長的速度太快了,因此後來除了上述的六大類別之外,還有諸如 .asia, .info, .jobs (註1) 等領域名稱的開放。此外,為了讓某些國家也能夠有自己的最上層領域名稱,因此, 就有所謂的 ccTLD 了。這樣做有什麼好處呢?因為自己的國家內有最上層 ccTLD ,所以如果有 domain name 的需求,則只要向自己的國家申請即可,不需要再到最上層去申請囉!


  • 授權與分層負責

既然 TLD 這麼好,那麼是否我們可以自己設定 TLD 呢?當然不行!因為我們得向上層 ISP 申請領域名稱的授權才行。例如台灣地區最上層的領域名稱是以 .tw 為開頭,管理這個領域名稱的機器 IP 是在台灣,但是 .tw 這部伺服器必須向 root (.) 註冊領域名稱查詢授權才行 (如上圖 19.1-3 所示)。

那麼每個國家之下記錄的主要下層有哪些領域呢?基本上就是原先 root 管理的那六大類。 不過,由於各層 DNS 都能管理自己轄下的主機名稱或子領域,因此,我們的 .tw 可以自行規劃自己的子領域名稱喔! 例如目前台灣 ISP 常提供的 .idv.tw 的個人網站就是一例啊!

再強調一次,DNS 系統是以所謂的階層式的管理,所以,請注意喔!那個 .tw 只記錄底下那一層的這數個主要的 domain 的主機而已!至於例如 edu.tw 底下還有個 ksu.edu.tw 這部機器,那就直接授權交給 edu.tw 那部機器去管理了!也就是說『 每個上一層的 DNS 伺服器所記錄的資訊,其實只有其下一層的主機名稱而已! 』至於再下一層,則直接『授權』給下層的某部主機來管理囉!呵呵!所以你就應該會知道 DNS 到底是如何管理的吧!

會這樣設定的原因不是沒有道理的!這樣設計的好處就是:每部機器管理的只有下一層的 hostname 對應 IP 而已,所以減少了管理上的困擾!而下層 Client 端如果有問題,只要詢問上一層的 DNS server 即可!不需要跨越上層,除錯上面也會比較簡單呢!


  • 透過 DNS 查詢主機名稱 IP 的流程

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

透過 DNS 系統查詢主機名稱解譯的流程
圖 19.1-4、透過 DNS 系統查詢主機名稱解譯的流程

首先,當你在瀏覽器的網址列輸入 http://www.ksu.edu.tw 時,你的電腦就會依據相關設定 (在 Linux 底下就是利用 /etc/resolv.conf 這個檔案) 所提供的 DNS 的 IP 去進行連線查詢了。由於目前最常見的 DNS 伺服器就屬 Hinet 的 168.95.1.1 這個 DNS,所以我們就拿他來做例子吧!嗯!這個時候,hinet 的這部伺服器會這樣工作:

  1. 收到用戶的查詢要求,先查看本身有沒有紀錄,若無則向 . 查詢
    由於 DNS 是階層式的架構,每部主機都會管理自己轄下的主機名稱解譯而已。因為 hinet 並沒有管理台灣學術網路的權力, 因此就無法直接回報給用戶端。此時 168.95.1.1 就會向最頂層,也就是 . (root) 的伺服器查詢相關 IP 資訊。

  2. 向最頂層的 . (root) 查詢
    168.95.1.1 會主動的向 . 詢問 www.ksu.edu.tw 在哪裡呢?但是由於 . 只記錄了 .tw 的資訊 (因為台灣只有 .tw 向 . 註冊而已),此時 . 會告知『我是不知道這部主機的 IP 啦,不過,你應該向 .tw 去詢問才對,我這裡不管! 我跟你說 .tw 在哪裡吧!』

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

  4. 向第三層的 .edu.tw 伺服器查詢
    同理可證, .edu.tw 只會告訴 168.95.1.1 ,應該要去 .ksu.edu.tw 進行查詢,這裡只能告知 .ksu.edu.tw 的 IP 而已。

  5. 向第四層的 .ksu.edu.tw 伺服器查詢
    等到 168.95.1.1 找到 .ksu.edu.tw 之後, Bingo !.ksu.edu.tw 說:『沒錯!這部主機名稱是我管理的~ 我跟你說他的 IP 是...所以此時 168.95.1.1 就能夠查到 www.ksu.edu.tw 的 IP 囉!

  6. 記錄暫存記憶體並回報用戶
    查到了正確的 IP 後,168.95.1.1 的 DNS 機器總不會在下次有人查詢 www.ksu.edu.tw 的時候再跑一次這樣的流程吧! 粉遠粉累的吶!而且也很耗系統的資源與網路的頻寬,所以呢,168.95.1.1 這個 DNS 會很聰明的先記錄一份查詢的結果在自己的暫存記憶體當中,以方便回應下一次的相同要求啊! 最後則將結果回報給 client 端!當然啦,那個記憶在 cache 當中的資料,其實是有時間性的,當過了 DNS 設定記憶的時間 (通常可能是 24 小時),那麼該記錄就會被釋放喔!

整個分層查詢的流程就是這樣,總是得要先經過 . 來向下一層進行查詢,最終總是能得到答案的。這樣分層的好處是:

  • 主機名稱修改的僅需自己的 DNS 更動即可,不需通知其他人:
    當一個『合法』的 DNS 伺服器裡面的設定修改了之後,來自世界各地任何一個 DNS 的要求,都會正確無誤的顯示正確的主機名稱對應 IP 的資訊,因為他們會一層一層的尋找下來。所以,要找你的主機名稱對應的 IP 就一定得要透過你的上層 DNS 伺服器的紀錄才行!因此,只要你的主機名字是經過上層『合法的 DNS』伺服器設定的,那麼就可以在 Internet 上面被查詢到啦!呵呵!很簡單維護吧,機動性也很高。

  • DNS 伺服器對主機名稱解析結果的快取時間:
    由於每次查詢到的結果都會儲存在 DNS 伺服器的快取記憶體中,以方便若下次有相同需求的解析時,能夠快速的回應。 不過,查詢結果已經被快取了,但是原始 DNS 的主機名稱與 IP 對應卻修改了,此時若有人再次查詢, 系統可能會回報舊的 IP 喔!所以,在快取內的答案是有時間性的!通常是數十分鐘到三天之內。 這也是為什麼我們常說當你修改了一個 domain name 之後,可能要 2 ~ 3 天後才能全面的啟用的緣故啦!

  • 可持續向下授權 (子領域名稱授權):
    每一部可以記錄主機名稱與 IP 對應的 DNS 伺服器都可以隨意更動他自己的資料庫對應, 因此主機名稱與網域名稱在各個主機底下都不相同。舉例來說, idv.tw 是僅有台灣才有這個 idv 的網域~ 因為這個 idv 是由 .tw 所管理的,所以只要台灣 .tw 維護小組同意,就能夠建立該網域喔!

好啦!既然 DNS 這麼棒,然後我們又需要架站,所以需要一個主機的名稱,那麼我們需要架設 DNS 了嗎?當然不是,為什麼呢?剛剛鳥哥提到了很多次的『合法』的字眼,因為他就牽涉到『授權』的問題了! 我們在第十章當中也提到,只要主機名稱合法即可,不見得需要架設 DNS 的啦!

例題:
透過 dig 實作出本小節談到的 . --> .tw --> .edu.tw --> .ksu.edu.tw --> www.ksu.edu.tw 的查詢流程,並分析每個查詢階段的 DNS 伺服器有幾部?
答:
事實上,我們可以透過第四章約略談過的 dig 這個指令來實作出喔!使用追蹤功能 (+trace) 就能夠達到這個目的了。使用方式如下:
[root@www ~]# dig +trace www.ksu.edu.tw
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 <<>>+trace www.ksu.edu.tw
;; global options:  printcmd
.                       486278  IN      NS      a.root-servers.net.
.                       486278  IN      NS      b.root-servers.net.
....(底下省略)....
# 上面的部分在追蹤 . 的伺服器,可從 a ~ m.root-servers.net.
;; Received 500 bytes from 168.95.1.1#53(168.95.1.1) in 22 ms

tw.                     172800  IN      NS      ns.twnic.net.
tw.                     172800  IN      NS      a.dns.tw.
tw.                     172800  IN      NS      b.dns.tw.
....(底下省略)....
# 上面的部分在追蹤 .tw. 的伺服器,可從 a ~ h.dns.tw. 包括 ns.twnic.net.
;; Received 474 bytes from 192.33.4.12#53(c.root-servers.net) in 168 ms

edu.tw.                 86400   IN      NS      a.twnic.net.tw.
edu.tw.                 86400   IN      NS      b.twnic.net.tw.
# 追蹤 .edu.tw. 的則有 7 部伺服器
;; Received 395 bytes from 192.83.166.11#53(ns.twnic.net) in 22 ms

ksu.edu.tw.             86400   IN      NS      dns2.ksu.edu.tw.
ksu.edu.tw.             86400   IN      NS      dns3.twaren.net.
ksu.edu.tw.             86400   IN      NS      dns1.ksu.edu.tw.
;; Received 131 bytes from 192.83.166.9#53(a.twnic.net.tw) in 22 ms

www.ksu.edu.tw.         3600    IN      A       120.114.100.101
ksu.edu.tw.             3600    IN      NS      dns2.ksu.edu.tw.
ksu.edu.tw.             3600    IN      NS      dns1.ksu.edu.tw.
ksu.edu.tw.             3600    IN      NS      dns3.twaren.net.
;; Received 147 bytes from 120.114.150.1#53(dns2.ksu.edu.tw) in 14 ms
最終的結果有找到 A (Address) 是 120.114.100.101,不過這個例題的重點是,要讓大家瞧瞧整個 DNS 的搜尋過程! 在 dig 加上 +trace 的選項後,就能夠達到這個目的。至於其他的都是伺服器 (NS) 的設定值與追蹤過程喔! 有沒有很清楚啊?^_^。至於 A 與 NS 等相關的資料,我們在後續的 DNS 資料庫介紹中,再分別介紹囉。


  • DNS 使用的 port number

好了,既然 DNS 系統使用的是網路的查詢,那麼自然需要有監聽的 port 囉!沒錯!很合理!那麼 DNS 使用的是那一個 port 呢?那就是 53 這個 port 啦!你可以到你的 Linux 底下的 /etc/services 這個檔案看看!搜尋一下 domain 這個關鍵字,就可以查到 53 這個 port 啦!

但是這裡需要跟大家報告的是,通常 DNS 查詢的時候,是以 udp 這個較快速的資料傳輸協定來查詢的, 但是萬一沒有辦法查詢到完整的資訊時,就會再次的以 tcp 這個協定來重新查詢的!所以啟動 DNS 的 daemon (就是 named 啦) 時,會同時啟動 tcp 及 udp 的 port 53 喔!所以,記得防火牆也要同時放行 tcp, udp port 53 呢!

19.1.3 合法 DNS 的關鍵:申請領域查詢授權

什麼?DNS 伺服器的架設還有『合法』與『不合法』之分喔?不是像其他的伺服器一樣,架設好之後人家就查的到嗎? 非也非也!為什麼呢?底下我們就來談一談。


  • 向上層領域註冊取得合法的領域查詢授權

我們在第十章也講過,申請一個合法的主機名稱就是需要註冊, 註冊就是需要花錢啦!那麼註冊取得的資料有兩種,一種是第十章談到的 FQDN (主機名稱),一種就是申請領域查詢權。所謂的 FQDN 就是我們只需要主機名,詳細的設定資料就由 ISP 幫我們搞定。例如圖 19.1-4 所示, 那部 www.ksu.edu.tw 的詳細主機名稱對應 IP 的資料就是請管理 .ksu.edu.tw 那個領域的伺服器搞定的。

那什麼是領域查詢授權呢?同樣用圖 19.1-4 來解釋,我們的 .ksu.edu.tw 必須要向 .edu.tw 那部主機註冊申請領域授權,因此,未來有任何 .ksu.edu.tw 的要求時, .edu.tw 都會說:『我不知道! 詳情請去找 .ksu.edu.tw 吧!』此時,我們就得要架設 DNS 伺服器來設定 .ksu.edu.tw 相關的主機名稱對應才行喔! 是否很像人類社會的『授權』的概念?

也就是說,當你老闆充分的『授權』給你某項工作的時候,從此,要進行該項工作的任何人, 從老闆那邊知道你才是真正『有權』的人之後,都必須要向你請示一樣!^_^!所以囉,如果你要架設 DNS ,而且是可以連上 Internet 上面的 DNS 時,你就必須要透過『上層 DNS 伺服器的授權』才行!這是很重要的觀念喔!

讓我們歸納一下,要讓你的主機名稱對應 IP 且讓其他電腦都可以查詢的到,你有兩種方式:

  1. 上層 DNS 授權領域查詢權,讓你自己設定 DNS 伺服器,或者是;
  2. 直接請上層 DNS 伺服器來幫你設定主機名稱對應!


  • 擁有領域查詢權後,所有的主機名資訊都以自己為準,與上層無關

很多朋友可能都有過申請 DNS 領域查詢授權的經驗,在申請時,ISP 就會要你填寫 (1)你的 DNS 伺服器名稱以及 (2)該伺服器的 IP。既然已經在 ISP 就填寫了主機名稱與 IP 的對應,所以,即使我的 DNS 伺服器掛點了,在 ISP 上面的主機名稱應該還是查到的 IP 吧?答案是:『錯!』查不到的!為什麼呢?

DNS 系統記錄的資訊非常的多,不過重點其實有兩個,一個是記錄伺服器所在的 NS (NameServer) 標誌,另一個則是記錄主機名稱對應的 A (Address) 標誌。我們在網路上面查詢到的最終結果,都是查詢 IP (IP Address) 的,因此最終的標誌要找的是 A 這個記錄才對!我們以鳥哥註冊的 .vbird.org 來說明好了,鳥哥去註冊時, 記錄在 ISP 的 DNS 伺服器名稱為 dns.vbird.org,該筆記錄其實就是 NS ,並非 A ,如下圖所示:

記錄的授權主機名稱與實際 A 記錄的差異
圖 19.1-5、記錄的授權主機名稱與實際 A 記錄的差異

上圖中,雖然在 godaddy 伺服器內有記錄一筆『要查詢 .vbird.org 時,請到 dns.vbird.org (NS) 去查,這個管理者的 IP 是 140.116...』,但是這筆記錄只是告訴我們要去下一個伺服器找,並不是最終的 A (IP Address) 的答案,所以還得要繼續往下找 (隨時記得圖 19.1-4 的查詢流程)。此時,有幾種結果會導致 dns.vbird.org 的 IP 找不到,或者是最終的 IP 與 godaddy 記錄的不同的結果喔!那就是:

  • dns.vbird.org 伺服器掛點時: 如果 dns.vbird.org 這部主機掛點,那麼在上圖顯示『查詢』箭頭的步驟會被中斷,因此就會出現『查不到 dns.vbird.org 的 IP』的結果。因為無論如何,DNS 系統都會去找到最後一個含有 A 位址的記錄啊!

  • dns.vbird.org 伺服器內的資料庫忘記補上資料時: 如果鳥哥在自己的伺服器資料庫中,忘記加上 dns.vbird.org 的記錄時,最終的結果還是會顯示『找不到該伺服器的 IP』;

  • dns.vbird.org 伺服器內的資料庫資料編寫不一致時: 如果是在鳥哥自己伺服器的資料庫內的 dns.vbird.org 所記錄的 IP 與 godaddy 的不同,最終的結果會以鳥哥記錄的為準。

總之,你在 ISP 上面填寫的主機名稱只是一個參考用的,最終還是要在你自己 DNS 伺服器當中設定好才行! 雖然可以自己惡搞一下,不過,通常大家還是會讓 ISP 上面的 DNS 伺服器主機名與自己的資料庫主機名一致, 亦即上圖中,中間與最下面方框內的 dns.vbird.org 的 NS 及 A 都對應到同一個 IP 就是了。

19.1.4 主機名交由 ISP 代管還是自己設定 DNS 伺服器

前面 19.1.3 小節以及第十章都談過,申請主機名稱或網域名稱主要有兩種方式,就是剛剛上頭提到的 DNS 授權,或者是直接交給 ISP 來管理。交給 ISP 管理的,就可以稱作是網域名稱代管啦!當然啦,如果你是學校單位的話, 或者是企業內部的小單位,那麼就得請你向上層 DNS 主機的負責人要求囉!無論如何,你只能有兩個選擇就是了,要不就是請他幫忙你設定好 hostname 對應 IP ,要嘛就是請他直接將某個 domain name 段授權給你做為 DNS 的主要管理網域。

那麼我怎麼知道那個方式對我比較好呢?請注意,由於 DNS 架設之後,會多出一個監聽的 port ,所以理論上,是比較不安全的!而且,由於網際網路現在都是透過主機名稱在連線,在瞭解上面談到的主機名稱查詢流程後, 你會發現,DNS 設定錯誤是很要命的!因為你的主機名稱再也找不到了。所以,這裡的建議是:

  • 需要架設 DNS 的時機:
  • 你所負責需要連上 Internet 的主機數量龐大:例如你一個人負責整個公司十幾部的網路 Server,而這些 Server 都是掛載你的公司網域之下的。這個時候想要不架設 DNS 也粉難啦!
  • 你可能需要時常修改你 Server 的名字,或者是你的 Server 有隨時增加的可能性與變動性;
  • 不需要架設 DNS 的時機:
  • 網路主機數量很少:例如家裡或公司只有需要一部 mail server 時;
  • 你可以直接請上層 DNS 主機管理員幫你設定好 Hostname 的對應時;
  • 你對於 DNS 的認知不足時,如果架設反而容易造成網路不通的情況;
  • 架設 DNS 的費用很高時!

19.1.5 DNS 資料庫的記錄:正解, 反解, Zone 的意義

從前面的圖 19.1-4 的查詢流程中,我們知道最重要的就是 .ksu.edu.tw 那部 DNS 伺服器內的記錄資訊了。這些記錄的咚咚我們可以稱呼為資料庫,而在資料庫裡面針對每個要解析的領域 (domain),就稱為一個區域 (zone)。那麼到底有哪些要解析的領域呢?基本上,有從主機名稱查到 IP 的流程,也可以從 IP 反查到主機名稱的方式。 因為最早前 DNS 的任務就是要將主機名稱解析為 IP,因此:

  • 從主機名稱查詢到 IP 的流程稱為:正解
  • 從 IP 反解析到主機名稱的流程稱為:反解
  • 不管是正解還是反解,每個領域的記錄就是一個區域 (zone)

舉例來說,崑山科大 DNS 伺服器管理的就是 *.ksu.edu.tw 這個領域的查詢權,任何想要知道 *.ksu.edu.tw 主機名的 IP 都得向崑山科大的 DNS 伺服器查詢,此時 .ksu.edu.tw 就是一個『正解的領域』。而崑山科大有申請到幾個 class C 的子網域, 例如 120.114.140.0/24,如果這 254 個可用 IP 都要設定主機名稱,那麼這個 120.114.140.0/24 就是一個『反解的領域』! 另外,每一部 DNS 伺服器都可以管理多個領域,不管是正解還是反解。


  • 正解的設定權以及 DNS 正解 zone 記錄的標誌

那誰可以申請正解的 DNS 伺服器架設權呢?答案是:都可以!只要該領域沒有人使用, 那你先搶到了,就能夠使用了。不過,因為國際 INTERNIC 已經定義出 gTLD 以及 ccTLD 了,所以你不能自訂例如 centos.vbird 這種網域的!還是得要符合上層 DNS 所給予的領域範圍才行。舉例來說,台灣個人網站就常使用 *.idv.tw 這樣的領域名稱。

那正解檔的 zone 裡面主要記錄了什麼東西呢?因為正解的重點在由主機名稱查詢到 IP,而且每部 DNS 伺服器還是得要定義清楚,同時,你可能還需要架設 master/slave 架構的 DNS 環境,因此,正解 zone 通常具有底下幾種標誌:

  • SOA:就是開始驗證 (Start of Authority) 的縮寫,相關資料本章後續小節說明;
  • NS:就是名稱伺服器 (NameServer) 的縮寫,後面記錄的資料是 DNS 伺服器的意思;
  • A:就是位址 (Address) 的縮寫,後面記錄的是 IP 的對應 (最重要);


  • 反解的設定權以及 DNS 反解 zone 記錄的標誌

正解的領域名稱只要符合 INTERNIC 及你的 ISP 規範即可,取得授權較為簡單 (自己取名字)。那反解呢?反解主要是由 IP 找到主機名稱,因此重點是 IP 的所有人是誰啦!因為 IP 都是 INTERNIC 發放給各家 ISP 的,而且我們也知道,IP 可不能亂設定 (路由問題)!所以囉,能夠設定反解的就只有 IP 的擁有人,亦即你的 ISP 才有權力設定反解的。那你向 ISP 取得的 IP 能不能自己設定反解呢?答案是不行!除非你取得的是整個 class C 以上等級的 IP 網段,那你的 ISP 才有可能給你 IP 反解授權。否則,若有反解的需求,就得要向你的直屬上層 ISP 申請才行!

那麼反解的 zone 主要記錄的資訊有哪些呢?除了伺服器必備的 NS 以及 SOA 之外,最重要的就是:

  • PTR:就是指向 (PoinTeR) 的縮寫,後面記錄的資料就是反解到主機名稱囉!


  • 每部 DNS 都需要的正解 zone: hint

現在你知道一個正解或一個反解就可以稱為一個 zone 了!那麼有沒有那個 zone 是特別重要的呢?有的,那就是 . 啊! 從圖 19.1-4 裡面我們就知道,當 DNS 伺服器在自己的資料庫找不到所需的資訊時, 一定會去找 . ,那 . 在哪裡啊?所以就得要有記錄 . 在哪裡的記錄 zone 才行啊!這個記錄 . 的 zone 的類型,就被我們稱為 hint 類型!這幾乎是每個 DNS 伺服器都得要知道的 zone 喔!

所以說,一部簡單的正解 DNS 伺服器,基本上就要有兩個 zone 才行,一個是 hint ,一個是關於自己領域的正解 zone。舉鳥哥註冊的 vbird.org 為例,在鳥哥的 DNS 伺服器內,至少就要有這兩個 zone:

  • hint (root):記錄 . 的 zone;
  • vbird.org:記錄 .vbird.org 這個正解的 zone。

你會發現我沒有 vbird.org 這個 domain 所屬 IP 的反解 zone ,為什麼呢?請參考上面的詳細說明吧! 簡單的說,就是因為反解需要要求 IP 協定的上層來設定才行!


  • 正反解是否一定要成對?

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

事實上,需要正反解成對需求的大概僅有 mail server 才需要吧!由於目前網路頻寬老是被垃圾、廣告郵件佔光, 所以 Internet 的社會對於合法的 mail server 規定也就越來越嚴格。如果你想要架設 mail server 時, 最好具有固定 IP ,這樣才能向你的 ISP 要求設定反解喔!以 hinet 為例的反解申請:

19.1.6 DNS 資料庫的類型:hint, master/slave 架構

你知道的,DNS 越來越重要,所以,如果你有註冊過領域名稱的話,就可以發現,現在 ISP 都要你填寫兩部 DNS 伺服器的 IP 哩!因為要作為備援之用嘛!總不能一部 DNS 掛點後,害你的所有主機名稱都不能被找到~那真麻煩~

但是,如果有兩部以上的 DNS 伺服器,那麼網路上會搜尋到哪一部呢?答案是,不知道!因為是隨機的~ 所以,如果你的領域有兩部 DNS 伺服器的話,那這兩部 DNS 伺服器的內容就得完全一模一樣,否則,由於是隨機找到 DNS 來詢問,因此若資料不同步,很可能造成其他用戶無法取得正確資料的問題。

為了解決這個問題,因此在 . (root) 這個 hint 類型的資料庫檔案外,還有兩種基本類型,分別是 Master (主人、主要) 資料庫與 Slave (奴隸、次要) 資料庫類型。這個 Master/Slave 就是要用來解決不同 DNS 伺服器上面的資料同步問題的。 所以底下讓我們來聊聊 Master/Slave 吧!


  • Master:

這種類型的 DNS 資料庫中,裡面所有的主機名稱相關資訊等,通通要管理員自己手動去修改與設定, 設定完畢還得要重新啟動 DNS 服務去讀取正確的資料庫內容,才算完成資料庫更新。一般來說,我們說的 DNS 架設,就是指設定這種資料庫的類型。同時,這種類型的資料庫,還能夠提供資料庫內容給 slave 的 DNS 伺服器喔!


  • Slave:

如前所述,通常你不會只有一部 DNS 伺服器,例如我們前面的例題查詢到的 .ksu.edu.tw 就有 3 部 DNS 伺服器來管理自己的領域。那如果每部 DNS 我們都是使用 Master 資料庫類型,當有用戶向我要求要修改或者新增、刪除資料時, 一筆資料我就得要做三次,還可能會不小心手滑導致某幾部出現錯誤,此時可就傷腦筋了~因此,這時使用 Slave 類型的資料庫取得方式就很有用!

Slave 必須要與 Master 相互搭配,若以 .ksu.edu.tw 的例子來說,如果我必須要有三部主機提供 DNS 服務,且三部內容相同, 那麼我只要指定一部伺服器為 Master ,其他兩部為該 Master 的 Slave 伺服器,那麼當要修改一筆名稱對應時,我只要手動更改 Master 那部機器的設定檔,然後,重新啟動 BIND 這個服務後,呵呵!其他兩部 Slave 就會自動的被通知更新了!這樣一來,在維護上面可就輕鬆寫意的多了~

Tips 鳥哥 如果你設定 Master/Slave 架構時,你的 Master 主機必須要限制 只有某些特定 IP 的主機能夠取得你 Master 主機的正反解資料庫權限才好! 所以,上面才會提到 Master/Slave 必須要互相搭配才行!

  • Master / Slave 的查詢優先權?

另外,既然我的所有 DNS 伺服器是需要同時提供 internet 上面的領域名稱解析的服務, 所以不論是 Master 還是 Slave 伺服器,他都必須要可以同時提供 DNS 的服務才好! 因為在 DNS 系統當中,領域名稱的查詢是『先搶先贏』的狀態,我們不會曉得哪一部主機的資料會先被查詢到的! 為了提供良好的 DNS 服務,每部 DNS 主機都要能正常工作才好啊!而且,每一部 DNS 伺服器的資料庫內容需要完全一致,否則就會造成用戶端找到的 IP 是錯誤的!


  • Master / Slave 資料的同步化過程

那麼 Master/Slave 的資料更新到底是如何動作的呢?請注意,Slave 是需要更新來自 Master 的資料啊!所以當然 Slave 在設定之初就需要存在 Master 才行喔!基本上,不論 Master 還是 Slave 的資料庫,都會有一個代表該資料庫新舊的『序號』,這個序號數值的大小,是會影響是否要更新的動作唷! 至於更新的方式主要有兩種:

  • Master 主動告知:例如在 Master 在修改了資料庫內容,並且加大資料庫序號後, 重新啟動 DNS 服務,那 master 會主動告知 slave 來更新資料庫,此時就能夠達成資料同步;

  • 由 Slave 主動提出要求:基本上, Slave 會定時的向 Master 察看資料庫的序號, 當發現 Master 資料庫的序號比 Slave 自己的序號還要大 (代表比較新),那麼 Slave 就會開始更新。如果序號不變, 那麼就判斷資料庫沒有更動,因此不會進行同步更新。

由上面的說明來看,其實設計資料庫的序號最重要的目的就是讓 master/slave 資料的同步化。那我們也知道 slave 會向 master 提出資料庫更新的需求,問題是,多久提出一次更新,如果該次更新時由於網路問題,所以沒有查詢到 master 的序號 (亦即更新失敗),那隔多久會重新更新一次?這個與 SOA 的標誌有關,後續談到正、反解資料庫後, 再來詳細說明吧!

如果你想要架設 Master/Slave 的 DNS 架構時,兩部主機 (Master/Slave) 都需要你能夠掌控才行!網路上很多的文件在這個地方都有點『閃失』,請特別的留意啊!因為鳥哥的 DNS 伺服器常常會聽到某些其他 DNS 的資料庫同步化需求,真覺得煩吶!

19.2 Client 端的設定

由於 DNS 是每部想要連上網際網路的主機都得要設定的,因此我們就從簡單的用戶端設定談起。因為未來架設好 DNS server 後,我們都會直接進行測試,所以,這個部分得先處理處理比較妥當啊!

19.2.1 相關設定檔

19.1.1 的說明當中我們曉得主機名稱對應到 IP 有兩種方法,早期的方法是直接寫在檔案裡面來對應, 後來比較新的方法則是透過 DNS 架構!那麼這兩種方法分別使用什麼設定檔?可不可以同時存在? 若同時存在時,那個方法優先?嗯!我們先來談一談幾個設定檔吧!

  • /etc/hosts :這個是最早的 hostname 對應 IP 的檔案;
  • /etc/resolv.conf :這個重要!就是 ISP 的 DNS 伺服器 IP 記錄處;
  • /etc/nsswitch.conf:這個檔案則是在『決定』先要使用 /etc/hosts 還是 /etc/resolv.conf 的設定!

一般而言, Linux 的預設主機名稱與 IP 的對應搜尋都以 /etc/hosts 為優先,為什麼呢?你可以查看一下 /etc/nsswitch.conf ,並找到 hosts 的項目:

[root@www ~]# vim /etc/nsswitch.conf
hosts:      files dns

上面那個 files 就是使用 /etc/hosts,而最後的 dns 則是使用 /etc/resolv.conf 的 DNS 伺服器來進行搜尋啦!因此,你可以先以 /etc/hosts 來設定 IP 對應!當然啦,你也可以將他調換過來,不過,總是 /etc/hosts 比較簡單,所以將他擺在前面比較好啦!

好啦,既然我們是要進行 DNS 測試的,那麼就得要瞭解一下 /etc/resolv.conf 的內容,假設你在台灣,使用的是 hinet 的 168.95.1.1 這部 DNS 伺服器,所以你應該這樣寫:

[root@www ~]# vim /etc/resolv.conf
nameserver 168.95.1.1
nameserver 139.175.10.20

DNS 伺服器的 IP 可以設定多個,為什麼要設定多個呢?因為當第一部 (照設定的順序) DNS 掛點時,我們用戶端可以使用第二部 (上述是 139.175.10.20) 來進行查詢,這多少有點像 DNS 備援功能。 通常建議至少填寫兩部 DNS 伺服器的 IP,不過在網路正常使用的情況下,永遠只有第一部 DNS 伺服器會被使用來查詢,其他的設定值只是在第一部出問題時才會被使用。

Tips 鳥哥 盡量不要設定超過 3 部以上的 DNS IP 在 /etc/resolv.conf 中,因為如果是你的區網出問題,導致無法連線到 DNS 伺服器,那麼你的主機還是會向每部 DNS 伺服器發出連線要求,每次連線都有 timeout 時間的等待,會導致浪費非常多的時間喔!
例題:
我的主機使用 DHCP 取得 IP ,很奇怪的,當我修改過 /etc/resolv.conf 之後,隔不多久這個檔案又會恢復成原本的樣子,這是什麼原因? 該如何處理?
答:
因為使用 DHCP 時,系統會主動的使用 DHCP 伺服器傳來的資料進行系統設定檔的修訂。因此,你必須告知系統,不要使用 DHCP 傳來的伺服器設定值。 此時,你得要在 /etc/sysconfig/network-scripts/ifcfg-eth0 等相關檔案內,增加一行:『PEERDNS=no』,然後重新啟動網路即可。

19.2.2 DNS 的正、反解查詢指令: host, nslookup, dig

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


  • host
[root@www ~]# host [-a] FQDN [server]
[root@www ~]# host -l domain [server]
選項與參數:
-a :代表列出該主機所有的相關資訊,包括 IP、TTL 與除錯訊息等等
-l :若後面接的那個 domain 設定允許 allow-transfer 時,則列出該 domain 
     所管理的所有主機名稱對應資料!
server:這個參數可有可無,當想要利用非 /etc/resolv.conf 內的 DNS 主機
        來查詢主機名稱與 IP 的對應時,就可以利用這個參數了!

# 1. 使用預設值來查出 linux.vbird.org 的 IP 
[root@www ~]# host linux.vbird.org
linux.vbird.org has address 140.116.44.180             <==這是 IP
linux.vbird.org mail is handled by 10 linux.vbird.org. <==這是 MX (後續章節說明)

# 2. 查出 linux.vbird.org 的所有重要參數
[root@www ~]# host -a linux.vbird.org
Trying "linux.vbird.org"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56213
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

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

;; ANSWER SECTION:
linux.vbird.org.        145     IN      A       140.116.44.180

;; AUTHORITY SECTION:
vbird.org.              145     IN      NS      dns.vbird.org.
vbird.org.              145     IN      NS      dns2.vbird.org.

Received 86 bytes from 168.95.1.1#53 in 15 ms  <==果然是從 168.95.1.1 取得的資料
# 看樣子,不就是 dig 的輸出結果?所以,我們才會說,使用 dig 才是王道!

# 3. 強制以 139.175.10.20 這部 DNS 主機來查詢
[root@www ~]# host linux.vbird.org 139.175.10.20
Using domain server:
Name: 139.175.10.20
Address: 139.175.10.20#53
Aliases:

linux.vbird.org has address 140.116.44.180
linux.vbird.org mail is handled by 10 linux.vbird.org.

看到最後一個範例,有注意到上面輸出的特殊字體部分嗎?很多朋友在測試自己的 DNS 時,常常會『指定到錯誤的 DNS 查詢主機』了~因為他們的 /etc/reslov.conf 忘記改,所以老是找不到自己設定的資料庫 IP 資料。所以你要仔細看啊!

# 4. 找出 vbird.org 領域的所有主機對應
[root@www ~]# host -l vbird.org
; Transfer failed.
Host vbird.org not found: 9(NOTAUTH)
; Transfer failed. <==竟然失敗了!請看底下的說明!

怎麼會無法回應呢?這樣的回應是因為管理 vbird.org 領域的 DNS 並不許我們的領域查詢,畢竟我們不是 vbird.org 的系統管理員,當然沒有權限可以讀取整個 vbird.org 的領域設定囉!這個『 host -l 』是用在自己的 DNS 伺服器上,本章稍後談到伺服器設定後,使用這個選項就能夠讀取相關的資料了。


  • nslookup
[root@www ~]# nslookup [FQDN] [server]
[root@www ~]# nslookup
選項與參數:
1. 可以直接在 nslookup 加上待查詢的主機名稱或者是 IP ,[server] 可有可無;
2. 如果在 nslookup 後面沒有加上任何主機名稱或 IP ,那將進入 nslookup 的查詢功能
   在 nslookup 的查詢功能當中,可以輸入其他參數來進行特殊查詢,例如:
   set type=any :列出所有的資訊『正解方面設定檔』
   set type=mx  :列出與 mx 相關的資訊!

# 1. 直接搜尋 mail.ksu.edu.tw 的 IP 資訊 
[root@www ~]# nslookup mail.ksu.edu.tw
Server:         168.95.1.1
Address:        168.95.1.1#53  <==還是請特別注意 DNS 的 IP 是否正確!

Non-authoritative answer:
Name:   mail.ksu.edu.tw
Address: 120.114.100.20        <==回報 IP 給你囉!

nslookup 可單純的將 hostname 與 IP 對應列出而已,不過,還是會將查詢的 DNS 主機的 IP 列出來的! 如果想要知道更多詳細的參數,那可以直接進入 nslookup 這個軟體的操作畫面中,如下範例:

[root@www ~]# nslookup  <==進入 nslookup 查詢畫面
> 120.114.100.20         <==執行反解的查詢
> www.ksu.edu.tw         <==執行正解的查詢
# 上面這兩個僅列出正反解的資訊,沒有啥了不起的地方啦!
> set type=any           <==變更查詢,不是僅有 A,全部資訊都列出來
> www.ksu.edu.tw
Server:         168.95.1.1
Address:        168.95.1.1#53

Non-authoritative answer:
Name:   www.ksu.edu.tw
Address: 120.114.100.101  <==這是答案

Authoritative answers can be found from: <==這是相關授權 DNS 說明
ksu.edu.tw      nameserver = dns2.ksu.edu.tw.
ksu.edu.tw      nameserver = dns1.ksu.edu.tw.
dns1.ksu.edu.tw internet address = 120.114.50.1
dns2.ksu.edu.tw internet address = 120.114.150.1
> exit <==離開吧!皮卡丘

在上面的案例當中,請注意,如果你在 nslookup 的查詢畫面當中,輸入 set type=any 或其他參數, 那麼就無法再進行反解的查詢了!這是因為 any 或者是 mx 等等的標誌都是記錄在正解 zone 當中的緣故!


  • dig (未來的主流,請愛用他!)
[root@www ~]# dig [options] FQDN [@server]
選項與參數:
@server :如果不以 /etc/resolv.conf 的設定來作為 DNS 查詢,可在此填入其他的 IP
options:相關的參數很多,主要有 +trace, -t type 以及 -x 三者最常用
  +trace :就是從 . 開始追蹤,在 19.1.2 裡面談過了!回頭瞧瞧去!
  -t type:查詢的資料主要有 mx, ns, soa 等類型,相關類型 19.4 來介紹
  -x     :查詢反解資訊,非常重要的項目!

# 1. 使用預設值查詢 linux.vbird.org 吧!
[root@www ~]# dig linux.vbird.org
; >><< DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 >><< linux.vbird.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42438
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:     <==提出的問題的部分
;linux.vbird.org.               IN      A

;; ANSWER SECTION:       <==主要的回答階段
linux.vbird.org.        600     IN      A       140.116.44.180

;; AUTHORITY SECTION:    <==其他與此次回答有關的部分
vbird.org.              600     IN      NS      dns2.vbird.org.
vbird.org.              600     IN      NS      dns.vbird.org.

;; Query time: 46 msec
;; SERVER: 168.95.1.1#53(168.95.1.1)
;; WHEN: Tue May  3 16:48:21 2011
;; MSG SIZE  rcvd: 86

在這個範例當中,我們可以看到整個顯示出的訊息包括有幾個部分:

  • QUESTION(問題):顯示所要查詢的內容,因為我們是查詢 linux.vbird.org 的 IP,所以這裡顯示 A (Address);
  • ANSWER(回答):依據剛剛的 QUESTION 去查詢所得到的結果,答案就是回答 IP 啊!
  • AUTHORITY(驗證):由這裡我們可以知道 linux.vbird.org 是由哪部 DNS 伺服器所提供的答案! 結果是 dns.vbird.org 及 dns2.vbird.org 這兩部主機管理的。另外,那個 600 是啥咚咚?圖 19.1-4 提到過的流程,就是允許查詢者能夠保留這筆記錄多久的意思 (快取),在 linux.vbird.org 的設定中,預設可以保留 600 秒。
# 2. 查詢 linux.vbird.org 的 SOA 相關資訊吧!
[root@www ~]# dig -t soa linux.vbird.org
; >><< DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 >><< -t soa linux.vbird.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29236
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;linux.vbird.org.               IN      SOA

;; AUTHORITY SECTION:
vbird.org.              600     IN      SOA     dns.vbird.org. root.dns.vbird.org. 
2007091402 28800 7200 720000 86400

;; Query time: 24 msec
;; SERVER: 168.95.1.1#53(168.95.1.1)
;; WHEN: Tue May  3 16:56:20 2011
;; MSG SIZE  rcvd: 78

由於 dig 的輸出資訊實在是太豐富了,又分成多個部分去進行回報,因此很適合作為 DNS 追蹤回報的一個指令呢! 你可以透過這個指令來瞭解一下你所設定的 DNS 資料庫是否正確,並進行除錯喔! ^_^!此外,你也可以透過『 -t type 』 的功能去查詢其他伺服器的設定值,可以方便你進行設定 DNS 伺服器時的參考喔!正解查詢完畢,接下來玩一玩反解吧!

# 3. 查詢 120.114.100.20 的反解資訊結果
[root@www ~]# dig -x 120.114.100.20
; >><< DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 >><< -x 120.114.100.20
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52303
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 2

;; QUESTION SECTION:
;20.100.114.120.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
20.100.114.120.in-addr.arpa. 3600 IN    PTR     mail-out-r2.ksu.edu.tw.
20.100.114.120.in-addr.arpa. 3600 IN    PTR     mail-smtp-proxy.ksu.edu.tw.
20.100.114.120.in-addr.arpa. 3600 IN    PTR     mail.ksu.edu.tw.

;; AUTHORITY SECTION:
100.114.120.in-addr.arpa. 3600  IN      NS      dns1.ksu.edu.tw.
100.114.120.in-addr.arpa. 3600  IN      NS      dns3.twaren.net.
100.114.120.in-addr.arpa. 3600  IN      NS      dns2.ksu.edu.tw.

;; ADDITIONAL SECTION:
dns1.ksu.edu.tw.        492     IN      A       120.114.50.1
dns3.twaren.net.        634     IN      A       211.79.61.47

;; Query time: 34 msec
;; SERVER: 168.95.1.1#53(168.95.1.1)
;; WHEN: Tue May  3 17:02:29 2011
;; MSG SIZE  rcvd: 229

反解相當有趣!從上面的輸出結果來看,反解的查詢目標竟然從 120.114.100.20 變成了 20.100.114.120.in-addr.arpa. 這個模樣~這是啥鬼東西?不要怕,這等我們講到反解時再跟大家進一步解釋。 你現在要知道的是,反解的查詢領域名,跟正解不太一樣即可,尤其是那個怪異的 in-addr.arpa. 結尾的資料,可以先記下來。

19.2.3 查詢領域管理者相關資訊: whois

上個小節談到的是主機名稱的正反解查詢指令,那如果你想要知道整個領域的設定,使用的是『 host -l 領域名 』去查, 那如果你想要知道的是『這個領域是誰管的』的資訊呢?那就得要使用 whois 這個指令才行喔!在 CentOS 5.x 當中, whois 是由 jwhois 這個軟體提供的,因此,如果找不到 whois 時,請用 yum 去安裝這個軟體吧!


  • whois
[root@www ~]# whois [domainname]  <==注意啊!是 domain 而不是 hostname
[root@www ~]# whois centos.org
[查詢 whois.publicinterestregistry.net]
[whois.publicinterestregistry.net]
# 這中間是一堆 whois 伺服器提供的訊息告知!底下是實際註冊的資料
Domain ID:D103409469-LROR
Domain Name:CENTOS.ORG
Created On:04-Dec-2003 12:28:30 UTC
Last Updated On:05-Dec-2010 01:23:25 UTC
Expiration Date:04-Dec-2011 12:28:30 UTC  <==記載了建立與與失效的日期
Sponsoring Registrar:Key-Systems GmbH (R51-LROR)
Status:CLIENT TRANSFER PROHIBITED
Registrant ID:P-8686062
Registrant Name:CentOS Domain Administrator
Registrant Organization:The CentOS Project
Registrant Street1:Mechelsesteenweg 170
# 底下則是一堆聯絡方式,鳥哥將它取消了,免得多佔篇幅~

whois 這個指令可以查詢到當初註冊這個 domain 的使用者的相關資訊。不過,由於近年來很多網路資訊安全的問題,這個 whois 所提供的資訊真的是太詳細了,為了保護使用者的隱私權,所以,目前這個 whois 所查詢到的資訊已經不見得是完全正確的了~而且,在顯示出 whois 的資訊之前,還會有一段宣告事項的告知呢~ ^_^y

如果使用 whois 來檢查鳥哥所註冊的合法 domain 會是如何呢?看看:

[root@www ~]# whois vbird.idv.tw
[查詢 whois.twnic.net]
[whois.twnic.net]           <==這個 whois 伺服器查到的資料
Domain Name: vbird.idv.tw   <==這個 domain 的資訊

   Contact:                 <==聯絡者的聯絡方式
      Der-Min Tsai
      vbird@pc510.ev.ncku.edu.tw

   Record expires on 2018-09-17 (YYYY-MM-DD)
   Record created on 2002-09-13 (YYYY-MM-DD)

Registration Service Provider: HINET

呵呵!這個 domain 會在 2018/09/17 失效的意思啦!報告完畢!無論如何,我們都可以透過 nslookup, host, dig 等等的指令來查詢主機名稱與 IP 的對應,這些指令的用法可以請你以 man command 來查詢更多的用法喔!

19.3 DNS 伺服器的軟體、種類與 cache only DNS 伺服器設定

談完了一些基礎概念後,接下來讓我們來聊一聊,那如何設定好 DNS 伺服器啊?這當然就得由軟體安裝談起啦! 在這個小節,我們先不要談 DNS 記錄的正反解咚咚,只講到 hint 這個 . (root) 的 zone,談一談最簡單的僅有快取的 DNS 伺服器 (Caching only DNS server) 吧!

19.3.1 架設 DNS 所需要的軟體

終於廢話都說完了!相信你大概也有點累的吧?鳥哥是蠻累的啦,因為手臂、肩頸酸痛的毛病頗嚴重....咦!講這個幹嘛? @_@ 好啦,我們終於要來安裝 DNS 所需要的軟體了!還記得前面提過的,我們要使用的 DNS 軟體就是使用柏克萊大學發展出來的 BIND (Berkeley Internet Name Domain, BIND) 這個啦!那麼怎麼知道你安裝了沒?不就是 rpm 與 yum 嗎?自己查查看。

[root@www ~]# rpm -qa | grep '^bind'
bind-libs-9.3.6-16.P1.el5    <==給 bind 與相關指令使用的函式庫
bind-utils-9.3.6-16.P1.el5   <==這個是用戶端搜尋主機名稱的相關指令
bind-9.3.6-16.P1.el5         <==就是 bind 主程式所需軟體
bind-chroot-9.3.6-16.P1.el5  <==將 bind 主程式關在家裡面!

上面比較重要的是那個『 bind-chroot 』啦!所謂的 chroot 代表的是『 change to root(根目錄) 』的意思,root 代表的是根目錄。早期的 bind 預設將程序啟動在 /var/named 當中,但是該程序可以在根目錄下的其他目錄到處轉移,因此若 bind 的程式有問題時,則該程序會造成整個系統的危害。為避免這個問題, 所以我們將某個目錄指定為 bind 程式的根目錄,由於已經是根目錄,所以 bind 便不能離開該目錄!所以若該程序被攻擊,了不起也是在某個特定目錄底下搞破壞而已。 CentOS 5.x 預設將 bind 鎖在 /var/named/chroot 目錄中喔!

此外,你應該還會發現一個問題,現在我們主程式是由 bind, bind-chroot 所提供,那前一小節提到的,每部 DNS 伺服器都要有的 . (root) 這個 zone file 在哪裡?並沒有提供啊?沒錯,因此我們還得要安裝一個額外的支援軟體, 那就是 caching-nameserver 這個軟體。

  • caching-nameserver:提供包括 ., localhost, 127.0.0.0/8 的反解等相關 zone file ,以及 bind 主設定檔 named.conf 的內容範例。

因為我們都講 DNS,所以很容易忽略或者是忘記這個軟體的存在!記得要安裝這軟體才行呦!

19.3.2 BIND 的預設路徑設定與 chroot

要架設好 BIND 需要什麼設定資料呢?基本上有兩個主要的資料要處理:

  • BIND 本身的設定檔:主要規範主機的設定、zone file 的所在、權限的設定等;
  • 正反解資料庫檔案 (zone file):記錄主機名稱與 IP 對應的等。

BIND 的設定檔為 /etc/named.conf,在這個檔案裡面可以規範 zone file 的完整檔名喔! 也就是說,你的 zone file 其實是由 /etc/named.conf 所指定的,所以 zone file 檔名可以隨便取啦! 只要 /etc/named.conf 內規範為正確即可。一般來說, CentOS 5.x 的預設目錄是這樣的:

  • /etc/named.conf :這就是我們的主設定檔啦!
  • /etc/sysconfig/named :是否啟動 chroot 及額外的參數,就由這個檔案控制;
  • /var/named/ :資料庫檔案預設放置在這個目錄
  • /var/run/named :named 這支程式執行時預設放置 pid-file 在此目錄內。


  • /etc/sysconfig/named 與 chroot 環境

不過,為了系統的安全性考量,一般來說目前各主要 distributions 都已經自動的將你的 bind 相關程式給他 chroot 了! 那你如何知道你 chroot 所指定的目錄在哪裡呢?其實是記錄在 /etc/sysconfig/named 裡面啦!你可以先查閱一下:

[root@www ~]# cat /etc/sysconfig/named
ROOTDIR=/var/named/chroot

事實上該檔案內較有意義的就只有上面這一行,意思是說:『我要將 named 給他 chroot ,並且變更的根目錄為 /var/named/chroot 』喔!由於根目錄已經被變更到 /var/named/chroot 了,但 bind 的相關程式是需要 /etc, /var/named, /var/run ...等目錄的,所以實際上咱們 bind 的相關程式所需要的所有資料會是在:

  • /var/named/chroot/etc/named.conf
  • /var/named/chroot/var/named/zone_file1
  • /var/named/chroot/var/named/zone_file.....
  • /var/named/chroot/var/run/named/...

哇!真是好麻煩~不過,不要太擔心!因為新版本的 distributions 通常幫你作好一些連結對應了!舉例來說,你依舊可以使用 /etc/named.conf 來設定你的 DNS ,為什麼呢?因為 CentOS 主動的幫你將 /var/named/chroot/etc/named.conf 連結到 /etc/named.conf 囉!另外,絕大部分預設的 zone file 資料庫檔案也都主動的幫你做好連結了!請自行進入 /var/named 去 ls 一下吧!

Tips 鳥哥 事實上, /etc/sysconfig/named 是由 /etc/init.d/named 啟動時所讀入的,所以你也可以直接修改 /etc/init.d/named 這個 script 哩!

19.3.3 單純的 cache-only DNS 伺服器與 forwarding 功能

在下一小節開始介紹正、反解 zone 的資料設定之前,在這個小節當中,我們先來談一個單純修改設定檔,而不必設計 zone file 的環境,那就是不具有自己正反解 zone 的僅進行快取的 DNS 伺服器。


  • 什麼是 cache-only 與 forwarding DNS 伺服器呢?

有個只需要 . 這個 zone file 的簡單 DNS 伺服器,我們稱這種沒有自己公開的 DNS 資料庫的伺服器為 cache-only (僅快取) DNS server!顧名思義,這個 DNS server 只有快取搜尋結果的功能,也就是說,他本身並沒有主機名稱與 IP 正反解的設定檔,完全是由對外的查詢來提供他的資料來源!

那如果連 . 都不想要呢?那就得要指定一個上層 DNS 伺服器作為你的 forwarding (轉遞) 目標,將原本自己要往 . 查詢的任務,丟給上層 DNS 伺服器去煩惱即可。 如此一來,我們這部具有 forwarding 功能的 DNS 伺服器,甚至連 . 都不需要了!因為 . 有記錄在上層 DNS 上頭了嘛!

如同剛剛提到的,cache only 的 DNS 並不存在資料庫 (其實還是存在 . 這個 root 領域的 zone file), 因此不論是誰來查詢資料,這部 DNS 一律開始從自己的快取以及 . 找起,整個流程與圖 19.1-4 相同。那如果具有 forwarding 功能呢?果真如此,那即使你的 DNS 具有 . 這個 zone file,這部 DNS 還是會將查詢權『委請』上層 DNS 查詢的,這部 DNS 伺服器當場變成用戶端啦!查詢流程會變這樣喔:

具有 forwarding 功能的 DNS 伺服器查詢方式
圖 19.3-1、具有 forwarding 功能的 DNS 伺服器查詢方式

觀察上圖的查詢方向,你會發現到,具有 forwarding 機制時,查詢權會委請上層 DNS 伺服器來處理,所以根本也不需要 . 這個位置所在的 zone 啦。一般來說,如果你的環境需要架設一個 cache-only 的 DNS 伺服器時,其實可以直接加上 forwarding 的機制,讓查詢權指向上層或者是流量較大的上層 DNS 伺服器即可。那既然 cache only 的伺服器並沒有資料庫, forwarding 機制甚至不需要 . 的 zone ,那幹嘛還得要架設這樣的 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 server

那如何在你的 Linux 主機上架設一個 cache-only 的 DNS 伺服器呢?其實真的很簡單的啦!因為不需要設定正反解的 zone (只需要 . 的 zone 支援即可),所以只要設定一個檔案 (就是 named.conf 主設定檔) 即可!真是快樂得不得了吶! 另外,cache-only 只要加上個 forwarders 的設定即可指定 forwarding 的資料,所以底下我們將設定具有 forwarding 的 cache-only DNS 伺服器吧!


  1. 編輯主要設定檔: /etc/named.conf

    再說一次,我們的設定資訊都是在 /var/named/chroot/ 目錄底下,因此實際的檔案為 /var/named/chroot/etc/named.conf! 這咚咚請不要忘記了。在這個檔案中,主要是定義跟伺服器環境有關的設定,以及各個 zone 的領域及資料庫所在檔名。 在鳥哥的這個案例當中,因為使用了 forwarding 的機制,所以這個 cache-only DNS 伺服器並沒有 zone (連 . 都沒有),所以我們只要設定好跟伺服器有關的設定即可。設定這個檔案的時候請注意:

    • 註解資料是放置在兩條斜線『 // 』後面接的資料
    • 每個段落之後都需要以分號『 ; 』來做為結尾!

    在 CentOS 5.x 當中,這個檔案預設並不存在的!但是我們可以參考 /var/named/chroot/etc/named.* 檔案來建立這個 named.conf。鳥哥實際上是這樣進行動作的:
    [root@www ~]# cd /var/named/chroot/etc
    [root@www etc]# cp -a named.caching-nameserver.conf named.conf
    [root@www etc]# vim named.conf
    // 在預設的情況下即使不存在 named.conf, CentOS 5.x 會讀取 named.rfc1912.zones 
    // 與 named.caching-nameserver.conf 兩個檔案喔!不過我們僅需要自訂的 named.conf
    // 同時,修改一下原本的檔案內容,將內容盡量簡單化成如下:
    options {
            listen-on port 53  { any; };     //可不設定,代表全部接受
            directory          "/var/named"; //資料庫預設放置的目錄所在
            dump-file          "/var/named/data/cache_dump.db"; //一些統計資訊
            statistics-file    "/var/named/data/named_stats.txt";
            memstatistics-file "/var/named/data/named_mem_stats.txt";
            allow-query        { any; };     //可不設定,代表全部接受
            forward only;                    //可暫時不設定
            forwarders {                     //是重點!
                    168.95.1.1;              //先用中華電信的 DNS 當上層
                    139.175.10.20;           //再用 seednet 當上層
            };
    };  //最終記得要結尾符號!
    
    鳥哥將大部分的資料都予以刪除,只將少部分保留的資料加以小部分的修訂而已。在 named.conf 的結構中,與伺服器環境有關的是由 options 這個項目內容設定的,因為 options 裡面還有很多子參數, 所以就以大括號 { } 包起來囉。至於 options 內的子參數在上面提到的較重要的項目簡單敘述如下:

    • listen-on port 53 { any; };
      監聽在這部主機系統上面的哪個網路介面。預設是監聽在 localhost,亦即只有本機可以對 DNS 服務進行查詢,那當然是很不合理啊! 所以這裡要將大括號內的資料改寫成 any。記得,因為可以監聽多個介面,因此 any 後面得要加上分號才算結束喔! 另外,這個項目如果忘記寫也沒有關係,因為預設是對整個主機系統的所有介面進行監聽的。

    • directory "/var/named";
      意思是說,如果此檔案底下有規範到正、反解的 zone file 檔名時,該檔名預設應該放置在哪個目錄底下的意思。預設放置到 /var/named/ 底下。不過由於我們建議使用 bind-chroot 功能,因此,資料庫檔案預設應該放置在 /var/named/chroot/var/named/ 這個目錄才對喔!

    • dump-file, statistics-file, memstatistics-file
      與 named 這個服務有關的許多統計資訊,如果想要輸出成為檔案的話,預設的檔名就如上所述。鳥哥自己很少看這些統計資料, 所以,這三個設定值寫不寫應該都是沒有關係的。

    • allow-query { any; };
      這個是針對用戶端的設定,到底誰可以對我的 DNS 服務提出查詢請求的意思。原本的檔案內容預設是針對 localhost 開放而已, 我們這裡改成對所有的用戶開放 (當然啦,防火牆也得放行才行)。不過,預設 DNS 就是對所有用戶放行,所以這個設定值也可以不用寫。

    • forward only ;
      這個設定可以讓你的 DNS 伺服器僅進行 forward,即使有 . 這個 zone file 的設定,也不會使用 . 的資料, 只會將查詢權交給上層 DNS 伺服器而已,是 cache only DNS 最常見的設定了!

    • forwarders { 168.95.1.1; 139.175.10.20; } ;
      既然有 forward only,那麼到底要對哪部上層 DNS 伺服器進行轉遞呢?那就是 forwarders (不要忘記那個 s) 設定值的重要性了!由於擔心上層 DNS 伺服器也可能會掛點,因此可以設定多部上層 DNS 伺服器喔!每一個 forwarder 伺服器的 IP 都需要有『 ; 』來做為結尾!

    很簡單吧!至於更多的參數我們會在後續篇幅當中慢慢介紹的。這樣就已經設定完成了最簡單的 cache only DNS server 了!


  2. 啟動 named 並觀察服務的埠口

    啟動總不會忘記吧?趕快去啟動一下吧!同時啟動完畢之後,觀察一下由 named 所開啟的埠口,看看到底哪些埠口會被 DNS 用到的!
    # 1. 啟動一下 DNS 這玩意兒!
    [root@www ~]# /etc/init.d/named start
    Starting named:                     [  OK  ]
    [root@www ~]# chkconfig named on
    
    # 2. 到底用了多少埠口呢?
    [root@www ~]# netstat -utlnp | grep named
    Proto Recv-Q Send-Q Local Address       Foreign Address  State  PID/Program name
    tcp        0      0 192.168.100.254:53  0.0.0.0:*        LISTEN 11867/named
    tcp        0      0 192.168.1.10:53     0.0.0.0:*        LISTEN 11867/named
    tcp        0      0 127.0.0.1:53        0.0.0.0:*        LISTEN 11867/named
    tcp        0      0 127.0.0.1:953       0.0.0.0:*        LISTEN 11867/named
    tcp        0      0 ::1:953             :::*             LISTEN 11867/named
    udp        0      0 192.168.100.254:53  0.0.0.0:*               11867/named
    udp        0      0 192.168.1.10:53     0.0.0.0:*               11867/named
    udp        0      0 127.0.0.1:53        0.0.0.0:*               11867/named
    
    我們知道 DNS 會同時啟用 UDP/TCP 的 port 53,而且是針對所有介面,因此上面的資料並沒有什麼特異的部分。不過,怎麼會有 port 953 且僅針對本機來監聽呢?其實那是 named 的遠端控制功能,稱為遠端名稱解析服務控制功能 (remote name daemon control, rndc)。預設的情況下,僅有本機可以針對 rndc 來控制。我們會在後續的章節再來探討這個 rndc 啦,目前我們只要知道 UDP/TCP port 53 有啟動即可。

  3. 檢查 /var/log/messages 的內容訊息 (極重要!)

    named 這個服務的記錄檔就直接給他放置在 /var/log/messages 裡面啦,所以來看看裡面的幾行登錄資訊吧!
    [root@www ~]# tail -n 30 /var/log/messages | grep named
    May  3 14:21:23 www named[11867]: starting BIND 9.3.6-P1-RedHat-9.3.6-16.P1.el5 -u named 
    -t /var/named/chroot <==說明的是 chroot 在哪個目錄下!
    May  3 14:21:23 www named[11867]: found 1 CPU, using 1 worker thread
    May  3 14:21:23 www named[11867]: using up to 4096 sockets
    May  3 14:21:23 www named[11867]: loading configuration from '/etc/named.conf'
    May  3 14:21:23 www named[11867]: max open files (1024) is smaller than max sockets (4096)
    May  3 14:21:23 www named[11867]: using default UDP/IPv4 port range: [1024, 65535]
    May  3 14:21:23 www named[11867]: using default UDP/IPv6 port range: [1024, 65535]
    May  3 14:21:23 www named[11867]: listening on IPv4 interface lo, 127.0.0.1#53
    May  3 14:21:23 www named[11867]: listening on IPv4 interface eth0, 192.168.1.10#53
    May  3 14:21:23 www named[11867]: listening on IPv4 interface eth1, 192.168.100.254#53
    May  3 14:21:23 www named[11867]: command channel listening on 127.0.0.1#953
    May  3 14:21:23 www named[11867]: command channel listening on ::1#953
    May  3 14:21:23 www named[11867]: the working directory is not writable
    May  3 14:21:23 www named[11867]: running
    
    上面最重要的是第一行出現的『-t ...』那個項目指出你的 chroot 目錄囉。另外,上面表格中特殊字體的部分,有寫到讀取 /etc/named.conf,代表可以順利的載入 /var/named/etc/named.conf 的意思。如果上面有出現冒號後面接數字 (:10), 那就代表某個檔案內的第十行有問題的意思,屆時再進入處理即可。要注意的是,即使 port 53 有啟動,但有可能 DNS 服務是錯誤的,此時這個登錄檔就顯的非常重要!每次重新啟動 DNS 後,請務必查閱一下這個檔案的內容!!

    Tips 鳥哥 如果你在 /var/log/messages 裡面一直看到這樣的錯誤資訊:
    couldn't add command channel 127.0.0.1#953: not found
    那表示你還必需要加入 rndc key ,請參考本章後面的 利用 RNDC 指令管理 DNS 伺服器 的介紹,將他加入你的 named.conf 中!

  4. 測試:

    如果你的 DNS 伺服器具有連上網際網路的功能,那麼透過『 dig www.google.com @127.0.0.1 』這個基本指令執行看看, 如果有找到 google 的 IP ,並且輸出資料的最底下顯示『 SERVER: 127.0.0.1#53(127.0.0.1) 』的字樣, 那就代表應該是成功啦!其他更詳細的測試請參考:19.2 小節的內容


  • 特別說明:Forwarders 的好處與問題分析

關於 forwarder 的好處與壞處,其實有很多種的意見!大致的意見可分為這兩派:

  • 利用 Forwarder 的功能來增進效能的理論

    這些朋友們認為,當很多的下層 DNS 伺服器都使用 forwarder 時,那麼那個被設定為 forwarder 的主機,由於會記錄很多的查詢資訊記錄 (請參考圖 19.1-4 的說明),因此,對於那些下層的 DNS 伺服器而言,查詢速度會增快很多,亦即會節省很多的查詢時間!因為 forwarder 伺服器裡面有較多的快取記錄了, 所以包括 forwarder 本身,以及所有向這部 forwarder 要求資料的 DNS 伺服器,都能夠減少往 . 查詢的機會, 因此速度當然增加。

  • 利用 Forwarder 反而會使整體的效能降低

    但是另外一派則持相反的見解!這是因為當主 DNS 本身的『業務量』就很繁忙的時候,那麼你的 cache only DNS 伺服器還向他要求資料,因為他原本的資料傳輸量就太大了,頻寬方面可能負荷不量,而太多的下層 DNS 還向他要求資料,所以他的查詢速度會變慢!因為查詢速度變慢了,而你的 cache only server 又是向他提出要求的,所以自然兩邊的查詢速度就會同步下降!

很多種說法啦!鳥哥本人也覺得很有趣哩!只是不知道哪一派較正確就是了,不過可以知道的是,如果上層的 DNS 速度很快的話,那麼他被設定為 forwarder 時,或許真的可以增加不少效能哩!

19.4 DNS 伺服器的詳細設定

好了,經過上面的說明後,我們大概知道 DNS 的幾個小細節是這樣的:

  1. DNS 伺服器的架設需要上層 DNS 的授權才可以成為合法的 DNS 伺服器 (否則只是練功);
  2. 設定檔位置:目前 bind 程式已進行 chroot,相關目錄可參考 /etc/sysconfig/named;
  3. named 主要設定檔是 /etc/named.conf (再次強調需考慮 chroot 喔!);
  4. 每個正、反解領域都需要一個資料庫檔案,而檔名則是由 /etc/named.conf 所設定;
  5. 當 DNS 查詢時,若本身沒有資料庫檔案,則前往 root (.) 或 forwarders 伺服器查詢;
  6. named 是否啟動成功務必要查閱 /var/log/messages 內的資訊!

其中第一點很重要,因為我們尚未向上層 ISP 註冊合法的領域名稱,所以我們當然就沒有權利架設合法的 DNS 伺服器了。 而由於擔心我們的 DNS 伺服器會與外部網際網路環境互相干擾,所以底下鳥哥將主要以一個 centos.vbird 的領域名稱來架設 DNS 伺服器,如此一來咱們就可以好好的玩一玩自己區域網路內的 DNS 啦!

19.4.1 正解檔記錄的資料 (Resource Record, RR)

既然 DNS 最早之前的目的就是要從主機名稱去找到 IP,所以就讓我們先從正解 zone 來談起吧。既然要談正解, 那麼就應該要瞭解正解檔案記錄的資訊有哪些吧?在這個小節裡面,我們就先來談談正解 zone 常常記錄的資料有哪些吧。


  • 正解檔資源記錄 (resource record, RR) 格式

我們從前面幾個小節的 dig 指令輸出結果中,可以發現到一個有趣的咚咚,那就是輸出的資料格式似乎是固定的! 舉例來說,查詢 www.ksu.edu.tw 的 IP 時,輸出的結果為:

[root@www ~]# dig www.ksu.edu.tw
....(前面省略)....
;; ANSWER SECTION:
www.ksu.edu.tw.         2203    IN      A       120.114.100.101

;; AUTHORITY SECTION:
ksu.edu.tw.             911     IN      NS      dns1.ksu.edu.tw.
....(後面省略)....
# 上面的輸出資料已經被簡化過了,重點是要大家瞭解 RR 的格式

在答案的輸出階段,主要查詢得到的是 A 的標誌,在認證階段,則是提供 ksu.edu.tw 的 NS 伺服器為哪一部的意思。 格式非常接近,只是 A 後面接 IP,而 NS 後面接主機名稱而已。我們可以將整個輸出的格式簡化成為如下的說明:

[domain]   [ttl]          IN [[RR type]  [RR data]]
[待查資料] [暫存時間(秒)] IN [[資源類型] [資源內容]]

上表中,關鍵字 IN 是固定的,而 RR type 與 RR data 則是互有關連性的,例如剛剛才提過的 A 就是接 IP 而不是主機名稱啊。此外,在 domain 的部分,若可能的話,請盡量使用 FQDN,亦即是主機名稱結尾加上一個小數點的 (.) 就被稱為 FQDN 了!例如剛剛 dig www.ksu.edu.tw 的輸出結果中,在答案階段時,搜尋的主機名稱會變成 www.ksu.edu.tw. 喔!注意看最後面有個小數點喔!那個小數點非常重要!

至於 ttl 就是 time to live 的縮寫,意思就是當這筆記錄被其他 DNS 伺服器查詢到後, 這個記錄會保持在對方 DNS 伺服器的快取中,保持多少秒鐘的意思。所以,當你反覆執行 dig www.ksu.edu.tw 之後,就會發現這個時間會減少!為什麼呢?因為在你的 DNS 快取中,這筆資料能夠保存的時間會開始倒數, 當這個數字歸零後,下次有人再重新搜尋這筆記錄時,你的 DNS 就會重新沿著 . (root) 開始重來搜尋一遍, 而不會從快取裡面捉取了 (因為快取內的資料會被捨棄)。

由於 ttl 可由特定的參數來統一控管,因此在 RR 的記錄格式中,通常這個 ttl 的欄位是可以忽略的。 那麼常見的 RR 有哪些呢?我們將正解檔的 RR 記錄格式彙整如下:

# 常見的正解檔 RR 相關資訊
[domain]    IN  [[RR type]  [RR data]]
主機名稱.   IN  A           IPv4 的 IP 位址
主機名稱.   IN  AAAA        IPv6 的 IP 位址
領域名稱.   IN  NS          管理這個領域名稱的伺服器主機名字.
領域名稱.   IN  SOA         管理這個領域名稱的七個重要參數(容後說明)
領域名稱.   IN  MX          順序數字  接收郵件的伺服器主機名字
主機別名.   IN  CNAME       實際代表這個主機別名的主機名字.

接下來我們以崑山科大的 DNS 設定,包括 ksu.edu.tw 這個領域 (domain, zone),以及 www.ksu.edu.tw 這個主機名稱 (FQDN) 的查詢結果來跟大家解釋每個 RR 記錄的資訊為何呦!


  • A, AAAA :查詢 IP 的記錄

這個 A 的 RR 類型是在查詢某個主機名稱的 IP,也是最長被查詢的一個 RR 標誌喔!舉例來說,要找到 www.ksu.edu.tw 的 A 的話,就是這樣查:

[root@www ~]# dig [-t a] www.ksu.edu.tw
;; ANSWER SECTION:
www.ksu.edu.tw.         2987    IN      A       120.114.100.101
# 主機FQDN.             ttl                     這部主機的 IP 就是這裡
# 僅列出答案階段的資料,後續的 RR 相關標誌也是這樣顯示的喔!
# 指令列中的 [-t a] 可以不加,而最左邊主機名稱結尾都會有小數點喔!

左邊是主機名稱,當然,你也可以讓你的 domain 擁有一個 A 的標誌,例如『 dig google.com 』也能找到 IP。 不過,咱們崑山科大的 ksu.edu.tw 則沒有設定 IP 就是了。要再次特別強調的,主機名稱如果是全名, 結尾部分請務必加上小數點。如果你的 IP 設定的是 IPv6 的話,那麼查詢就得要使用 aaaa 類型才行。


  • NS :查詢管理領域名稱 (zone) 的伺服器主機名

如果你想要知道 www.ksu.edu.tw 的這筆記錄是由哪部 DNS 伺服器提供的,那就得要使用 NS (NameServer) 的 RR 類型標誌來查詢。不過,由於 NS 是管理整個領域的,因此,你得要查詢的目標將得輸入 domain,亦即 ksu.edu.tw 才行喔!舉例如下:

[root@www ~]# dig -t ns ksu.edu.tw
;; ANSWER SECTION:
ksu.edu.tw.             1596    IN      NS  dns1.ksu.edu.tw.

;; ADDITIONAL SECTION:
dns1.ksu.edu.tw.        577     IN      A   120.114.50.1
# 除了列出 NS 是哪部伺服器之外,該伺服器的 IP 也會額外提供!

前面提過,DNS 伺服器是很重要的,因此至少都會有兩部以上。崑山科大共有三部 DNS 伺服器,鳥哥僅列出第一部提供參考。 NS 後面會加伺服器名稱,而這個伺服器的 IP 也會額外提供才對!因此 NS 經常伴隨 A 的標誌啊!這樣你才能到 NS 去查詢資料嘛!這樣說有理解吧? ^_^


  • SOA :查詢管理領域名稱的伺服器管理資訊

如果你有多部 DNS 伺服器管理同一個領域名稱時,那麼最好使用 master/slave 的方式來進行管理。既然要這樣管理, 那就得要宣告被管理的 zone file 是如何進行傳輸的,此時就得要 SOA (Start Of Authority) 的標誌了。先來瞧瞧崑山科大的設定是怎樣:

[root@www ~]# dig -t soa ksu.edu.tw
;; ANSWER SECTION:
ksu.edu.tw.       3600   IN     SOA    dns1.ksu.edu.tw.   abuse.mail.ksu.edu.tw. 
  2010080369 1800 900 604800 86400
# 上述的輸出結果是同一行喔!

SOA 主要是與領域有關,所以前面當然要寫 ksu.edu.tw 這個領域名。而 SOA 後面共會接七個參數,這七個參數的意義依序是:

  1. Master DNS 伺服器主機名稱:這個領域主要是哪部 DNS 作為 master 的意思。在本例中, dns1.ksu.edu.tw 為 ksu.edu.tw 這個領域的主要 DNS 伺服器囉;

  2. 管理員的 email:那麼管理員的 email 為何?發生問題可以聯絡這個管理員。要注意的是, 由於 @ 在資料庫檔案中是有特別意義的,因此這裡就將 abuse@mail.ksu.edu.tw 改寫成 abuse.mail.ksu.edu.tw ,這樣看的懂了嗎?

  3. 序號 (Serial):這個序號代表的是這個資料庫檔案的新舊,序號越大代表越新。 當 slave 要判斷是否主動下載新的資料庫時,就以序號是否比 slave 上的還要新來判斷,若是則下載,若不是則不下載。 所以當你修訂了資料庫內容時,記得要將這個數值放大才行! 為了方便使用者記憶,通常序號都會使用日期格式『YYYYMMDDNU』來記憶,例如崑山科大的 2010080369 序號代表 2010/08/03 當天的第 69 次更新的感覺。不過,序號不可大於 2 的 32 次方,亦即必須小於 4294967296 才行喔。

  4. 更新頻率 (Refresh):那麼啥時 slave 會去向 master 要求資料更新的判斷? 就是這個數值定義的。崑山科大的 DNS 設定每 1800 秒進行一次 slave 向 master 要求資料更新。那每次 slave 去更新時, 如果發現序號沒有比較大,那就不會下載資料庫檔案。

  5. 失敗重新嘗試時間 (Retry):如果因為某些因素,導致 slave 無法對 master 達成連線, 那麼在多久的時間內,slave 會嘗試重新連線到 master。在崑山科大的設定中,900 秒會重新嘗試一次。意思是說,每 1800 秒 slave 會主動向 master 連線,但如果該次連線沒有成功,那接下來嘗試連線的時間會變成 900 秒。若後來有成功,則又會恢復到 1800 秒才再一次連線。

  6. 失效時間 (Expire):如果一直失敗嘗試時間,持續連線到達這個設定值時限, 那麼 slave 將不再繼續嘗試連線,並且嘗試刪除這份下載的 zone file 資訊。崑山科大設定為 604800 秒。意思是說,當連線一直失敗,每 900 秒嘗試到達 604800 秒後,崑山科大的 slave 將不再更新,只能等待系統管理員的處理。

  7. 快取時間 (Minumum TTL):如果這個資料庫 zone file 中,每筆 RR 記錄都沒有寫到 TTL 快取時間的話,那麼就以這個 SOA 的設定值為主。

除了 Serial 不可以超過 2 的 32 次方之外,有沒有其它的限制啊針對這幾個數值?是有的,基本上就是這樣:

  • Refresh >= Retry *2
  • Refresh + Retry < Expire
  • Expire >= Rrtry * 10
  • Expire >= 7Days

一般來說,如果 DNS RR 資料變更情況頻繁的,那麼上述的相關數值可以訂定的小一些,如果 DNS RR 是很穩定的, 為了節省頻寬,則可以將 Refresh 設定的較大一些。


  • CNAME :設定某主機名稱的別名 (alias)

有時候你不想要針對某個主機名稱設定 A 的標誌,而是想透過另外一部主機名稱的 A 來規範這個新主機名稱時, 可以使用別名 (CNAME) 的設定喔!舉例來說,追蹤 www.google.com 時,你會發現這樣:

[root@www ~]# dig www.google.com
;; ANSWER SECTION:
www.google.com.         557697  IN      CNAME   www.l.google.com.
www.l.google.com.       298     IN      A       72.14.203.99

意思是說,當你要追查 www.google.com 時,請找 www.1.google.com 那個主機,而那個主機的 A 就上面第二行的顯示了。 鳥哥常常開玩笑的說,你知道鳥哥的身份證字號嗎?你到戶政事務所去查『鳥哥』時,他會說:『沒這個人啊!因為沒有人姓鳥...』, 這個『鳥哥』就是別名 (CNAME) ,而對應到的名稱就是『蔡某某』,這個蔡某某才真的有身份字號的意思~ 一層一層去追蹤囉~

這個 CNAME 有啥好處呢?用 A 就好了吧?其實還是有好處的,舉例來說,如果你有一個 IP,這個 IP 是給很多主機名稱使用的。 那麼當你的 IP 更改時,所有的資料就得通通更新 A 標誌才行。如果你只有一個主要主機名稱設定 A,而其他的標誌使用 CNAME 時,那麼當 IP 更改,那你只要修訂一個 A 的標誌,其他的 CNAME 就跟著變動了!處理起來比較容易啊!


  • MX :查詢某領域名稱的郵件伺服器主機名稱

MX 是 Mail eXchanger (郵件交換) 的意思,通常你的整個領域會設定一個 MX ,代表,所有寄給這個領域的 email 應該要送到後頭的 email server 主機名上頭才是。先看看崑大的資料:

[root@www ~]# dig -t mx ksu.edu.tw
;; ANSWER SECTION:
ksu.edu.tw.             3600    IN      MX      8 mx01.ksu.edu.tw.

;; ADDITIONAL SECTION:
mx01.ksu.edu.tw.        3600    IN      A       120.114.100.28

上頭的意思是說,當有信件要送給 ksu.edu.tw 這個領域時,則預先將信件傳送給 mx01.ksu.edu.tw 這部郵件伺服器管理, 當然啦,這部 mx01.ksu.edu.tw 自然就是崑大自己管理的郵件伺服器才行!MX 後面接的主機名稱通常就是合法 mail server, 而想要當 MX 伺服器,就得要有 A 的標誌才行~所以上表後面就會出現 mx01.ksu.edu.tw 的 A 啊!

那麼在 mx01 之前的 8 是什麼意思?由於擔心郵件會遺失,因此較大型的企業會有多部這樣的上層郵件伺服器來預先收受信件。 那麼到底哪部郵件主機會先收下呢?就以數字較小的那部優先囉!舉例來說,如果你去查 google.com 的 MX 標誌, 就會發現他有 5 部這樣的伺服器呢!

19.4.2 反解檔記錄的 RR 資料

講完了正解來談談反解吧!在講反解之前,先來談談正解主機名稱的追蹤方式。以 www.ksu.edu.tw. 來說,整個網域的概念來看, 越右邊出現的名稱代表網域越大!舉例來說,.(root) > tw > edu 以此類推。因此追蹤時,是由大範圍找到小範圍, 最後,我們就知道追蹤的方向如圖 19.1-4 所示那樣。

但是 IP 則不一樣啊!以崑大的 120.114.100.101 來說好了,當然是 120 > 114 > 100 > 101 ,左邊的網域最大! 與預設的 DNS 從右邊向左邊查詢不一樣啊!那怎辦?為了解決這個問題,所以反解的 zone 就必須要將 IP 反過來寫,而在結尾時加上 .in-addr.arpa. 的結尾字樣即可。所以,當你想要追蹤反解時,那麼反解的結果就會是:

[root@www ~]# dig -x 120.114.100.101
;; ANSWER SECTION:
101.100.114.120.in-addr.arpa. 3600 IN   PTR     www.ksu.edu.tw.

例如上述的結果中,我們要查詢的主機名稱竟然變成了 IP 反轉的模樣!所以才稱為反解嘛!而反解的標誌最重要的就是 PTR 了!


  • PTR :就是反解啊!所以是查詢 IP 所對應的主機名稱

進行反解時,要注意的就是 zone 的名稱了!要將 IP 反轉過來寫,並且結尾加上 .in-addr.arpa. 才行! 例如 120.114.100.0/24 這個 class C IP 網段的反解設定,就必須要寫成: 100.114.120.in-addr.arpa. 這樣的 zone 名稱才行。 而 PTR 後面接的自然就是主機名稱囉!

在反解最重要的地方就是:後面的主機名稱盡量使用完整 FQDN,亦即加上小數點 (.) !為什麼呢?舉 100.114.120.in-addr.arpa. 為例,如果你只是填寫主機名稱,並沒有填寫領域名稱, 那麼當人家追蹤你的主機名稱時,你的主機名稱會變成: www.100.114.120.in-addr.arpa. 的怪模樣。 這是比較需要注意的地方。

Tips 鳥哥 老實說,鳥園討論區的一些有經驗的朋友一直在講,如果擔心會有誤解,主機名稱的設定則通通記得是要填寫 FQDN 就是了! 這樣絕對不會有問題! ^_^

19.4.3 步驟一:DNS 的環境規劃:正解、反解 zone 的預先定義案例說明

現在假設鳥哥的區網環境中想要設定 DNS 伺服器,鳥哥的區網原本規劃的網域名稱就是 centos.vbird,且搭配的 IP 網段為 192.168.100.0/24 這一段,因此主要的正解網域為 centos.vbird,而反解的網域則為 192.168.100.0/24, 鳥哥的這部 DNS 伺服器想要自己找尋 .(root) 而不透過 forwarders 的輔助,因此還得要 . 的領域正解檔。 綜合起來說,鳥哥需要設定到的檔案就有這幾個:

  1. named.conf (主要設定檔)
  2. named.centos.vbird (主要的 centos.vbird 的正解檔)
  3. named.192.168.100 (主要的 192.168.100.0/24 的反解檔)
  4. named.ca (由 caching-nameserver 軟體提供的 . 正解檔)

如果我還想要加入其他的領域,例如 niki.vbird 可不可以啊?當然可以啊!就再多一個資料庫正解檔案即可! 還有,鳥哥上頭這個設定資料為內部私有的,所以你可以完全照著玩!並不會影響到外部的網際網路啦! 只是,網際網路也查不到你的 DNS 設定就是了~反正是練功嘛!^_^

至於資料庫的正、反解對應上,依據實際的測試環境,規劃如下:

作業系統與IP主機名稱與 RR 標誌說明
Linux (192.168.100.254)master.centos.vbird (NS, A)
www.centos.vbird (A)
linux.centos.vbird (CNAME)
ftp.centos.vbird (CNAME)
forum.centos.vbird (CNAME)
www.centos.vbird (MX)
DNS 設置是使用 master.centos.vbird 這個 DNS 伺服器名稱。至於這部主機的另一個主要名稱是 www.centos.vbird,其他的都是 CNAME,這樣未來比較好修改。同時給予一個 MX 的標誌給主要主機名喔
Linux (192.168.100.100)slave.centos.vbird (NS, A)未來作為 slave DNS 的接班人~
WinXP (192.168.1.101)work.centos.vbird (A)一部經常用來工作的工作機
WinXP (192.168.1.21)vmxp.centos.vbird (A)一部用來測試的虛擬機

請特別留意啊,一個 IP 可以對應給多個主機名稱,同樣的,一個主機名稱可以給予多個 IP 喔! 主要是因為那部 www.centos.vbird 的機器未來的用途相當的多,鳥哥希望那一部主機有多個名稱,以方便未來額外的規劃啊。 所以就對該 IP 對應了四個主機名稱啊!

Tips 鳥哥 在自家設的沒有經過合法授權的 DNS 最好不要以 Internet 上面已經存在的領域名稱來練習架設! 舉例來說,假設今天你以 192.168.100.254 那部機器來架設 *.yahoo.com 的領域, 因為我將 192.168.100.254 放置在第一位,導致每次的查詢其實 yahoo.com 這個領域的資料都是直接由 192.168.100.254 所提供,這很不好~因為可能會造成你的用戶端的不便~

19.4.4 步驟二:主設定檔 /etc/named.conf 的設置

這個設定檔較多的 options 參數我們已經在 19.3.3 裡面談過,在我們目前的案例中, 則必須要將 forwarders 相關功能取消,並加上禁止傳輸 zone file 的參數即可。至於 zone 的設定上,必須要包含上個小節談到的三個主要的 zone 喔!因此這個檔案的任務是:

  • options:規範 DNS 伺服器的使用權限 (可否查詢、forward 與否等);
  • zone:設定出 zone (domain name) 以及 zone file 的所在 (包含 master/slave/hint);
  • 其他:設定 DNS 本機管理介面以及其相關的金鑰檔案 (key file)。(本章稍後進階應用再談)

那就直接看一下鳥哥的範本吧:

[root@www ~]# vim /var/named/chroot/etc/named.conf
options {
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        allow-transfer  { none; };   // 不許別人進行 zone 轉移
};

zone "." IN {
        type hint;
        file "named.ca";
};
zone "centos.vbird" IN {            // 這個 zone 的名稱
        type master;                // 是什麼類型
        file "named.centos.vbird";  // 檔案放在哪裡
};
zone "100.168.192.in-addr.arpa" IN {
        type master;
        file "named.192.168.100";
};

在 options 裡面僅新增一個新的參數,就是 allow-transfer,意義為:

  • allow-transfer ( none; };
    是否允許來自 slave DNS 對我的整個領域資料進行傳送?這個設定值與 master/slave DNS 伺服器之間的資料庫傳送有關。除非你有 slave DNS 伺服器,否則這裡不要開放喔!因此這裡我們先設定為 none。

至於在 zone 裡面的設定值,主要則有底下幾個:

zone 內的相關參數說明
設定值意義
type該 zone 的類型,主要的類型有針對 . 的 hint,以及自己手動修改資料庫檔案的 master,與可自動更新資料庫的 slave。
file就是 zone file 的檔名啊!記得要加上 chroot 的完整路徑喔!
反解 zone主要就是 in-addr.arpa 這個玩意兒!請參考 19.4.2 的解釋

另外,由於 chroot 的關係,因此設定檔會放置到 /var/named/chroot/etc/ 底下,而資料庫檔案則是放置到 /var/named/chroot/var/named/ 目錄下喔!不要忘記了!至於為何檔名都是 named 開頭呢?這只是個習慣而已, 你也可以依據自己的習慣來訂定檔名的。經過上面的說明,所以我們會知道,zone file 檔名都是透過 named.conf 這個設定檔來規範的啊!

19.4.5 步驟三:最上層 . (root) 資料庫檔案的設定

圖 19.1-4 可以知道 . 的重要性!那麼這個 . 在哪裡呢?事實上,它是由 INTERNIC 所管理維護的,全世界共有 13 部管理 . 的 DNS 伺服器呢!相關的最新設定在:

要不要下載最新的資料隨你便,因為我們的 CentOS 5.x 內的 caching-nameserver 軟體已經提供了一個名為 named.ca 的檔案了,鳥哥是直接使用系統提供的資料啦。這個檔案的內容有點像這樣:

[root@www ~]# vim /var/named/chroot/var/named/named.ca
. <==這裡有個小數點     518400  IN      NS      A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4
# 上面這兩行是成對的!代表點由 A.ROOT-SERVERS.NET. 管理,並附上 IP 查詢
. <==這裡有個小數點     518400  IN      NS      M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33
M.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:dc3::35
# 上面這三行是成對的,代表 M 開頭的伺服器有 A 與 AAAA 的記錄

相關的正解標誌 NS, A, AAAA 意義,請回 19.4.1 去查詢,這裡不再解釋。 比較特殊的是,由於考慮 IPv6 未來的流行性,因此很多部 . 伺服器都加上 AAAA 的 IPv6 功能囉。 這個檔案的內容你不要修改啊~因為這個內容是 Internet 上面通用的資料,一般來說,也不會常常變動, 所以不需要更動他,將他放置到正確的目錄並改成你所指定的檔名即可啊!接下來可以看看其他正解檔案啦!

19.4.6 步驟四:正解資料庫檔案的設定

再來開始正解檔的設定吧!正解檔一定要有的 RR 標誌有底下幾個喔:

  • 關於本領域的基礎設定方面:例如快取記憶時間 (TTL)、領域名稱 (ORIGIN) 等;
  • 關於 master/slave 的認證方面 (SOA);
  • 關於本領域的領域名稱伺服器所在主機名稱與 IP 對應 (NS, A);
  • 其他正反解相關的資源記錄 (A, MX, CNAME 等)。

相關的 RR 意義請回 19.4.1 去查詢。此外,這個檔案的特殊符號也得跟大家報告一下:

字元意義
一定從行首開始所有設定資料一定要從行首開始,前面不可有空白字元。若有空白字元,代表延續前一個 domain 的意思~非常重要~
@這個符號代表 zone 的意思!例如寫在 named.centos.vbird 中,@ 代表 centos.vbird.,如果寫在 named.192.168.100 檔案中,則 @ 代表 100.168.192.in-addr.arpa. 的意思 (參考 named.conf 內的 zone 設定)
.這個點 (.) 很重要!因為他代表一個完整主機名稱 (FQDN) 而不是僅有 hostname 而已。舉例來說,在 named.centos.vbird 當中寫 www.centos.vbird 則代表 FQDN 為 www.centos.vbird.@ ==> www.centos.vbird.centos.vbird. 喔!因此當然要寫成 www.centos.vbird. 才對!
;代表註解符號~似乎 # 也是註解~兩個符號都能使用

鳥哥打算沿用系統提供的一些設定檔,然後據以修改成為鳥哥自己需要的環境。整個 DNS 是由 master.centos.vbird 這部伺服器管理的,而管理者的 email 為 vbird@www.centos.vbird 這個。整個正解檔最終有點像這樣:

[root@www ~]# vim /var/named/chroot/var/named/named.centos.vbird
# 與整個領域相關性較高的設定包括 NS, A, MX, SOA 等標誌的設定處!
$TTL    600
@                       IN SOA   master.centos.vbird. vbird.www.centos.vbird. (
                                 2011050501 3H 15M 1W 1D ) ; 與上面是同一行
@                       IN NS    master.centos.vbird.  ; DNS 伺服器名稱
master.centos.vbird.    IN A     192.168.100.254         ; DNS 伺服器 IP
@                       IN MX 10 www.centos.vbird.     ; 領域名稱的郵件伺服器

# 針對 192.168.100.254 這部主機的所有相關正解設定。
www.centos.vbird.       IN A     192.168.100.254
linux.centos.vbird.     IN CNAME www.centos.vbird.
ftp.centos.vbird.       IN CNAME www.centos.vbird.
forum.centos.vbird.     IN CNAME www.centos.vbird.

# 其他三部主機的主機名稱正解設定。
slave.centos.vbird.     IN A     192.168.100.100
work.centos.vbird.      IN A     192.168.1.101
vmxp                    IN A     192.168.1.21  ; 這是簡化的寫法! 

再次強調,一個正解的資料庫設定中,至少應該要有 $TTL, SOA, NS (與這部 NS 主機名稱的 A), 鳥哥將這些基本要用到的標誌寫在上表的第一部份。至於其他的,則是相關的主機名稱正解設定囉。 如果這些設定值你看不懂,那麼,可以肯定的是,請回 19.4.1 去瞧瞧吧! 底下強調一下之前沒有講到的設定值項目:

關於本領域的一些設定值
設定值說明
$TTL為了簡化每筆 RR 記錄的設定,因此我們將 TTL 挪到最前面統一設定。因為鳥哥的 DNS 伺服器還在測試中,所以 TTL 寫了個比較小的數值,可以存在對方 DNS 伺服器的快取 600 秒而已。
$ORIGIN這個設定值可以重新指定 zone 的定義。在預設的情況下,這個正反解資料庫檔案中的 zone 是由 named.conf 所指定的,就是 zone 那個參數的功能。 不過,這個 zone 是可以改的,就是用 $ORIGIN 來修訂就是了。通常這個設定值不會用到的

老實說,初次設定 DNS 的朋友大概都會被那個小數點 (.) 玩死~其實你不要太緊張,只要記住:『 加上了 . 表示這是個完整的主機名稱 (FQDN),亦即是 "hostname + domain name" 了, 如果沒有加上 . 的話,表示該名稱僅為 "hostname" 而已!因為我們這個設定檔的 zone 是 centos.vbird, 所以上表的最後一行,鳥哥只寫出主機名稱 (vmxp) ,因為沒有小數點結尾,因此完整的 FQDN 要加上 zone,所以主機名稱 vmxp 代表的是: vmxp.centos.vbird. 喔!

19.4.7 步驟五:反解資料庫檔案的設定

反解跟正解一樣,還都需要 TTL, SOA, NS 等等的,但是相對於正解裡面有 A,反解裡面則僅有 PTR 喔! 另外,由於反解的 zone 名稱是很怪 zz.yy.xx.in-addr.arpa. 的模樣,因此只要在反解裡面要用到主機名稱時, 務必使用 FQDN 來設定啊!更多與反解有關的資料,請到 19.4.2 去查閱喔! 至於 192.168.100.0/24 這個網域的 DNS 反解則成為:

[root@www ~]# vim /var/named/chroot/var/named/named.192.168.100
$TTL    600
@       IN SOA  master.centos.vbird. vbird.www.centos.vbird. (
                2011050501 3H 15M 1W 1D )
@       IN NS   master.centos.vbird.
254     IN PTR  master.centos.vbird.  ; 將原本的 A 改成 PTR 的標誌而已

254     IN PTR  www.centos.vbird.     ; 這些是特定的 IP 對應
100     IN PTR  slave.ceneos.vbird.

1       IN PTR  dhcp1.centos.vbird.   ; 可能針對 DHCP 自動發放的 IP 也設定好!
2       IN PTR  dhcp2.centos.vbird.
....(中間省略)....
50      IN PTR  dhcp50.centos.vbird.

因為我們的 zone 是 100.168.192.in-addr.arpa. 這一個,因此 IP 的全名部分已經含有 192.168.100 了, 所以在上表當中的最左邊,數值只需要存在最後一個 IP 即可。因此 254 就代表 192.168.100.254 囉! 此外,為了擔心 DHCP 自動分配的 IP 沒有對應的主機名稱,所以這裡也附掛了 192.168.100.{1~50} 的主機名稱對應喔!

19.4.8 步驟六:DNS 的啟動、觀察與防火牆

DNS 的啟動也太簡單了吧?就直接利用系統提供的啟動 script 即可!

[root@www ~]# /etc/init.d/named restart  <==也可能是需要 restart 喔
[root@www ~]# chkconfig named on

但即使畫面上出現的是『確定』或『OK』,都不見得你的 DNS 服務是正常的。所以,請你『務必』查閱 /var/log/messages 的內容才行!基本上,內容會有點像這樣:

[root@www ~]# tail -n 30 /var/log/messages | grep named
named[6049]: starting BIND 9.3.6-P1-RedHat-9.3.6-16.P1.el5 -u named -t 
/var/named/chroot
named[6049]: found 1 CPU, using 1 worker thread
named[6049]: using up to 4096 sockets
named[6049]: loading configuration from '/etc/named.conf'
named[6049]: max open files (1024) is smaller than max sockets (4096)
named[6049]: using default UDP/IPv4 port range: [1024, 65535]
named[6049]: using default UDP/IPv6 port range: [1024, 65535]
named[6049]: listening on IPv4 interface lo, 127.0.0.1#53
named[6049]: listening on IPv4 interface eth0, 192.168.1.10#53
named[6049]: listening on IPv4 interface eth1, 192.168.100.254#53
named[6049]: command channel listening on 127.0.0.1#953
named[6049]: command channel listening on ::1#953
named[6049]: the working directory is not writable
named[6049]: zone 100.168.192.in-addr.arpa/IN: loaded serial 2011050501
named[6049]: zone centos.vbird/IN: loaded serial 2011050501
named[6049]: running

上面的輸出訊息中,你得要特別注意有畫底線的部分。包括 -t chroot_dir 是設定 chroot 目錄的位置, 而設定檔 (configuration) 則是 /etc/named.conf,最重要的是你的所有的 zone (hint 類型的 . 除外) 的序號 (serial) 號碼要跟你的資料庫內容一致才行!而且不能夠有出現『設定的檔名:數字』的內容, 否則肯定就是設定檔有問題~上面的訊息看起來還算 OK 啦!

在上述的輸出資料當中因為資訊太長了,所以鳥哥將登錄的時間與主機的欄位拿掉了!上面是順利啟動時的狀況, 如果出現問題怎辦?通常出現問題的原因是因為:

  • 語法設定錯誤:
    這個問題好解決,因為在 /var/log/messages 裡面有詳細的說明,按照內容去修訂即可;

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

我們這裡先就語法設定錯誤方面進行介紹,至於邏輯設定的問題,那個就需要多多的進行測試才能知道了~ 底下的錯誤訊息都會記錄在 /var/log/messages 裡面喔!

named: /etc/named.conf:8: missing ';' before '}'
# 注意到上面提到的檔名與數字嗎?說明的是 /etc/named.conf 的第 8 行,
# 至於錯誤是因為缺少分號 (;) 所致!去修正一下即可。

dns_rdata_fromtext: named.centos.vbird:4: near eol: unexpected end of input
zone centos.vbird/IN: loading master file named.centos.vbird: unexpected end of input
_default/centos.vbird/IN: unexpected end of input
# 指的是 named.centos.vbird 的第 4 行有問題,察看檔案內容第 4 行是 SOA 的項目,
# 通常是 SOA 那五個數字沒有完全!趕緊去修訂一下即可啊!

dns_rdata_fromtext: named.centos.vbird:7: near 'www.centos.vbird.': 
not a valid number
# 說明第 7 行在 www.centos.vbird 附近需要有一個合法的數字!剛好是 MX ,
# 所以,趕緊加上一個合法的數字,去瞧瞧改改即可!

通常最大的問題是...打錯字!所以,務必要慢慢打字,慢慢察看清楚,尤其是登錄檔內的資訊喔!都處理完畢之後, 也能夠透過 netstat 去查到 port 53 有在監聽,再來就是要放行人家的查詢了!所以,又得要修改防火牆囉! 假設你還是安裝鳥哥的防火牆腳本,那麼接下來就是:

[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
# 大約在 173, 174 行左右,找到如下兩行,將註解拿掉即可!
iptables -A INPUT -p UDP -i $EXTIF --dport  53  --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i $EXTIF --dport  53  --sport 1024:65534 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule

19.4.9 步驟七:測試與資料庫更新

在上面的設定都搞定,並且啟動之後,你的 DNS 伺服器應該是已經妥當的在運作了。 那你怎麼知道你的設定是否合理?當然要作測試喔!測試有兩種方式,一種是藉由 client 端的查詢功能, 目的是檢驗你的資料庫設定有無錯誤;另外你也可以連上底下這個網站:

這個網站可以幫你檢驗你的 DNS 伺服器的主要設定是否有問題!不過,這個網站的檢驗主要是以合法授權的 zone 為主,我們自己亂搞的 DNS 是沒有辦法檢查的啦!真是可惜~好了,就讓我們來測試測試結果吧!首先, 得將 DNS 伺服器自己的 /etc/resolv.conf 改成如下模樣較佳:

[root@www ~]# vim /etc/resolv.conf
nameserver 192.168.100.254   <==自己的 IP 一定要最早出現!
nameserver 168.95.1.1

接下來,就讓我們針對上面較重要的正、反解資訊進行檢測吧!同樣的,鳥哥也僅列出答案的部分而已!

# 1. 檢查 master.centos.vbird 以及 www.centos.vbird 的 A 標誌
[root@www ~]# dig master.centos.vbird
;; ANSWER SECTION:
master.centos.vbird.    600     IN      A       192.168.100.254
[root@www ~]# dig www.centos.vbird
;; ANSWER SECTION:
www.centos.vbird.       600     IN      A       192.168.100.254

# 2. 檢查 ftp.centos.vbird 與 vmxp 等等的 A 標誌
[root@www ~]# dig ftp.centos.vbird
;; ANSWER SECTION:
ftp.centos.vbird.       600     IN      CNAME   www.centos.vbird.
www.centos.vbird.       600     IN      A       192.168.100.254
[root@www ~]# dig vmxp.centos.vbird
;; ANSWER SECTION:
vmxp.centos.vbird.      600     IN      A       192.168.1.21

# 3. 檢查 centos.vbird 這個 zone 的 MX
[root@www ~]# dig -t mx centos.vbird
;; ANSWER SECTION:
centos.vbird.           600     IN      MX      10 www.centos.vbird.

# 4. 檢查 192.168.100.254 及 192.168.100.10 的反解
[root@www ~]# dig -x 192.168.100.254
;; ANSWER SECTION:
254.100.168.192.in-addr.arpa. 600 IN    PTR     www.centos.vbird.
254.100.168.192.in-addr.arpa. 600 IN    PTR     master.centos.vbird.
[root@www ~]# dig -x 192.168.100.10
;; ANSWER SECTION:
10.100.168.192.in-addr.arpa. 600 IN     PTR     dhcp10.centos.vbird.

測試要成功才行呦!什麼是成功呢?除了要真的有資料顯示之外,該資料是否正是你要的模樣?那才是順利成功。 如果有出現錯誤的資訊,例如找不到 www.centos.vbird 之類的,那就失敗了,得要找出問題才行。

另外,如果你的資料庫需要更新時,應該做哪些舉動啊?舉例來說,你的某個主機 IP 或者主機名稱要變更,也可能是新增某個主機名稱與 IP 的對應呢!很簡單啦,通常這樣做就好了:

  1. 先針對要更改的那個 zone 的資料庫檔案去做更新,就是加入 RR 的標誌即是!
  2. 更改該 zone file 的序號 (Serial) ,就是那個 SOA 的第三個參數 (第一個數字),因為這個數字會影響到 master/slave 的判定更新與否喔!
  3. 重新啟動 named ,或者是讓 named 重新讀取設定檔即可。

就這麼簡單啊!不過大家常常會忘記第二個步驟啦!就是將序號變大啊!如果序號沒有變大,那 master/slave 的資料庫可能不會主動的更新,會造成一些困擾喔!

19.5 協同工作的 DNS: Slave DNS 及子網域授權設定

我們在本章一開始就曾談過,DNS 大概是未來最重要的網路服務之一,因為所有的主機名稱需求都得要 DNS 提供才行。 因此,ISP 在提供 domain name 註冊時,就強調得要有兩部以上的 DNS 伺服器才行。而為了簡化 DNS 管理人員的負擔, 使用 Master/Slave DNS 架構的情況會比較好!為什麼呢?讓我們再回憶一下 Slave DNS 的特色:

  • 為了不間斷的提供 DNS 服務,你的領域至少需要有兩部 DNS 伺服器來提供查詢的功能;
  • 承上,這幾部 DNS 伺服器應該要分散在兩個以上的不同 IP 網域才好;
  • 為方便管理,通常除了一部主要 Master DNS 之外,其他的 DNS 會使用 slave 的模式;
  • slave DNS 伺服器本身並沒有資料庫,他的資料庫是由 master DNS 所提供的;
  • master/slave DNS 必需要可以相互傳輸 zone file 的相關資訊才行,這部份需要 /etc/named.conf 之設定輔助。

除此之外,如果你有朋友或者是學生想要跟你要一個子網域,那又該如何設定另一部 DNS 伺服器呢?就讓我們依序來談談囉~

19.5.1 master DNS 權限的開放

我們使用 19.4.3 的案例,繼續來架設一部支援該案例的 slave DNS 吧!基本的假設為:

  • 提供 slave DNS 伺服器進行 zone transfer 的伺服器為 master.centos.vbird
  • centos.vbird 及 100.168.192.in-addr.arpa 兩個 zone 都提供給 slave DNS 使用
  • master.centos.vbird 的 named 僅提供給 slave.centos.vbird 這部主機進行 zone transfer
  • Slave DNS server 架設在 192.168.100.100 這部伺服器上面 (所以 zone file 要修訂)

如上所示,我們的 master.centos.vbird 這部伺服器除了 named.conf 需要調整之外,兩個 zone file 也都需要調整! 在 named.conf 當中,需要設定哪個 IP 可以對我的 zone 進行傳輸 (allow-transfer),而在 zone file 當中,就是各加入一筆 NS 的記錄即可!增加的部分如下所示:

# 1. 修訂 named.conf,主要修改 zone 參數內的 allow-transfer 項目
[root@www ~]# vim /var/named/chroot/etc/named.conf
....前面省略....
zone "centos.vbird" IN {
        type master;
        file "named.centos.vbird";
        allow-transfer { 192.168.100.100; };  // 在這裡新增 slave 的 IP
};
zone "100.168.192.in-addr.arpa" IN {
        type master;
        file "named.192.168.100";
        allow-transfer { 192.168.100.100; };  // 在這裡新增 slave 的 IP
};

在上頭所列示的那兩個資料庫檔案當中,你必須要新增所需要的 NS 標誌才行!NS 對應的主機名稱為 slave.centos.vbird, IP 則是 192.168.100.100 呦!結果如下:

# 2. 在 zone file 裡面新增 NS 標誌,要注意需要有 A(正解) 及 PTR(反解) 的設定
[root@www ~]# vim /var/named/chroot/var/named/named.centos.vbird
$TTL    600
@                       IN SOA   master.centos.vbird. vbird.www.centos.vbird. (
                                 2011050701 3H 15M 1W 1D )
@                       IN NS    master.centos.vbird.
@                       IN NS    slave.centos.vbird.
master.centos.vbird.    IN A     192.168.100.254
slave.centos.vbird.     IN A     192.168.100.100
@                       IN MX 10 www.centos.vbird.
....(底下省略)....

[root@www ~]# vim /var/named/chroot/var/named/named.192.168.100
$TTL    600
@       IN SOA  master.centos.vbird. vbird.www.centos.vbird. (
                2011050701 3H 15M 1W 1D )
@       IN NS   master.centos.vbird.
@       IN NS   slave.centos.vbird.
254     IN PTR  master.centos.vbird.
100     IN PTR  slave.ceneos.vbird.
....(底下省略)....
# 要特別注意一件事,那就是,你的 zone file 內的序號要增加!鳥哥測試日期是 5/7,
# 所以,序號就以該天的日期為準來設計的!最後記得 restart 一下啦!

[root@www ~]# /etc/init.d/named restart
[root@www ~]# tail -n 30 /var/log/messages | grep named
starting BIND 9.3.6-P1-RedHat-9.3.6-16.P1.el5 -u named -t /var/named/chroot
found 1 CPU, using 1 worker thread
....(中間省略)....
zone 100.168.192.in-addr.arpa/IN: loaded serial 2011050701
zone centos.vbird/IN: loaded serial 2011050701
zone centos.vbird/IN: sending notifies (serial 2011050701)
zone 100.168.192.in-addr.arpa/IN: sending notifies (serial 2011050701)

反正重新啟動過 named 後,直覺記得就是要查閱 messages 登錄資訊就對了。從上表的輸出來看,會多一個 sending notifies (傳送注意事項) 關鍵字的資料,那就是提醒 slave DNS 來比對序號大小了!所以,你說,序號有沒有很重要呢?當然很重要啊! 連登錄訊息都會告知序號的大小哩!這樣 master DNS 就設定妥當囉!接下來玩玩 Slave 的設定吧!

19.5.2 Slave DNS 的設定與資料庫權限問題

既然 Slave DNS 也是 DNS 伺服器嘛!所以,當然也是需要安裝 bind, bind-chroot, caching-nameserver 等等的軟體! 這部份回去 19.3.1 裡面瞧瞧即可,反正記得使用 yum 安裝就對了。 接下來得要設定 named.conf 吧?而既然 Master/Slave 的資料庫是相同的,所以,理論上, named.conf 內容就是大同小異囉~ 唯一要注意的就是 zone type 類型的差異,以及宣告 master 在哪裡就是了。 至於 zone filename 部分,由於 zone file 都是從 master 取得的,透過 named 這個程式來主動建立起需要的 zone file,因此這個 zone file 放置的目錄權限就很重要!讓我們直接來處理看看:

# 1. 準備 named.conf 的內容:
[root@client ~]# vim /var/named/chroot/etc/named.conf
....(前面的部分完全與 master.centos.vbird 相同,故省略)....
zone "centos.vbird" IN {
        type slave;
        file "slaves/named.centos.vbird";
        masters { 192.168.100.254; };
};
zone "100.168.192.in-addr.arpa" IN {
        type slave;
        file "slaves/named.192.168.100";
        masters { 192.168.100.254; };
};

# 2. 檢查 zone file 預計建立的目錄權限是否正確!底下目錄為系統預設值:
[root@client ~]# ll -d /var/named/chroot/var/named/slaves
drwxrwx--- 2 named named 4096  7月 27  2004 /var/named/chroot/var/named/slaves/
# 注意權限、使用者以及群組三個欄位的資料!需要與 named 這個用戶及群組有關!
[root@client ~]# ll -dZ /var/named/chroot/var/named/slaves
drwxrwx---  named named system_u:object_r:named_cache_t  /var/named/chroot/var/named/slaves/
# 也不要忘記與 SELinux 有關的事情!

為了方便使用者設定,CentOS 預設在 /var/named/slaves/ 處理好了相關權限~所以你可以輕鬆的處理權限問題~ 我們就建議你的 slave zone file 放置在該目錄下!所以上表當中的 file 參數才會這麼寫~此外,那個 masters 結尾有個 s 喔!這裡最容易寫錯~那麼要不要處理 zone file 呢?除了 named.ca 這個 . 需要主動存在之外, 另外兩個 type slave 的資料庫檔案,當然不必存在啊!因為會從 master 處取得嘛!接下來,就讓我們來啟動 named 並進行觀察吧!

[root@client ~]# /etc/init.d/named start
[root@client ~]# chkconfig named on
[root@client ~]# tail -n 30 /var/log/messages | grep named
starting BIND 9.3.6-P1-RedHat-9.3.6-16.P1.el5 -u named -t /var/named/chroot
loading configuration from '/etc/named.conf'
....(中間省略)....
zone centos.vbird/IN: Transfer started.
transfer of 'centos.vbird/IN' from 192.168.100.254#53: connected using 
192.168.100.100#60087
zone centos.vbird/IN: transferred serial 2011050701
transfer of 'centos.vbird/IN' from 192.168.100.254#53: end of transfer
zone centos.vbird/IN: sending notifies (serial 2011050701)
# 你會看到如上的訊息,重點是還有告知序號喔!非常重要!

[root@client ~]# ll /var/named/chroot/var/named/slaves
-rw-r--r-- 1 named named 1933  5月  7 13:16 named.192.168.100
-rw-r--r-- 1 named named  543  5月  7 13:16 named.centos.vbird
# 這兩個 zone file 會主動被建立起來呢!

[root@client ~]# dig master.centos.vbird @127.0.0.1
[root@client ~]# dig -x 192.168.100.254 @127.0.0.1
# 上述兩個檢測的指令如果是正確的顯示出 A 與 PTR 的話,那就完成了!

你瞧!如此一來你的 zone file 就會主動的被建立起來喔!未來如果你的 master DNS 要更新資料庫時, 只要修改過序號,並重新啟動 named 後,這部 slave DNS 就會跟著更新啦!啊!真是『福氣啦!』!! 不過,如果你發現到啟動 slave DNS 時,你的登錄資訊竟然是這樣:

zone centos.vbird/IN: Transfer started.
transfer of 'centos.vbird/IN' from 192.168.100.254#53: connected using 
192.168.100.100#58187
dumping master file: tmp-a1bYfCd3i3: open: permission denied
transfer of 'centos.vbird/IN' from 192.168.100.254#53: failed while receiving 
responses: permission denied
transfer of 'centos.vbird/IN' from 192.168.100.254#53: end of transfer

如果出現類似這樣的訊息時,不必懷疑啦!肯定是權限錯誤啦!請再次檢查你的資料庫檔案所放置的目錄權限是否可以讓 named 寫入啊!處理處理就好了!現在,你的 DNS 會變的更加強壯囉!因為有類似的備援系統囉~不過仍然要注意的是, 網路查詢 centos.vbird 時,master 與 slave 的地位是相同的,並不是 master 掛點才使用 slave 來查詢喔!所以,這兩部伺服器的相同 domain 的資料庫內容要完全一致才行!

19.5.3 建置子網域 DNS 伺服器:子網域授權課題

除了 Master/Slave 需要協同 DNS 伺服器共同提供服務之外,DNS 之間如果有上層、下屬的關係時,該如何設定? 亦即,假設我的網域很大,我只想要負責上層的 DNS 而已,下層希望直接交給各單位的負責人來負責,要怎麼設定呢? 舉個例子來說,以成大為例,成大計中僅管理各個系所的 DNS 伺服器 IP 而已,由於各個系所的主機數量可能很大, 如果每個人都要請計中來設定,那麼管理員可能會瘋掉,而且在實際設計上也不太人性化。

所以囉,計中就將各個 subdomain (子網域) 的管理權交給各個系所的主機管理員去管理,如此一來, 各系所的設定上面會比較靈活,且上層 DNS 伺服器管理員也不用太麻煩吶!

好了,那麼如何開放子網域授權呢?我們以剛剛在 master 上面建立的 centos.vbird 這個 zone 為例, 假設今天你是個 ISP ,有個人想要跟妳申請 domain name ,他要的 domain 是『 niki.centos.vbird 』, 那你該如何處理?

  • 上層 DNS 伺服器:亦即是 master.centos.vbird 這一部,只要在 centos.vbird 那個 zone file 內,增加指定 NS 並指向下層 DNS 的主機名稱與 IP (A) 即可,而 zone file 的序號也要增加才行;

  • 下層 DNS 伺服器:申請的領域名稱必須是上層 DNS 所可以提供的名稱,並告知上層 DNS 管理員,我們這個 zone 所需指定的 DNS 主機名稱與對應的 IP 即可。然後就開始設定自己的 zone 與 zone file 相關資料。

假設我們管理 niki.centos.vbird 的伺服器主機名稱為 dns.niki.centos.vbird ,而這部主機的 IP 為 192.168.100.200, 那接下來就讓我們實際來設定吧!


  • 上層 DNS 伺服器:只需新增 zone file 的 NS 與 A 即可

上層 DNS 的處理真是簡單到爆炸!我們修改的是 named.centos.vbird 這個,新增如下的資料即可:

[root@www ~]# vim /var/named/chroot/var/named/named.centos.vbird
@                       IN SOA   master.centos.vbird. vbird.www.centos.vbird. (
                                 2011050702 3H 15M 1W 1D )
# 上面的 SOA 部分序號加大,底下新增這兩行即可 (原本的資料都保留不動)!
niki.centos.vbird.      IN NS    dns.niki.centos.vbird.
dns.niki.centos.vbird.  IN A     192.168.100.200

[root@www ~]# /etc/init.d/named restart
[root@www ~]# tail -n 30 /var/log/messages | grep named
May  7 14:17:18 www named[18773]: zone centos.vbird/IN: loaded serial 2011050702
# 登錄檔的關鍵是上面的序號部分~必須是我們填寫的新的序號才對!

[root@www ~]# dig dns.niki.centos.vbird @127.0.0.1
# 你會發現是錯誤的!找不到 A 喔!

上層 DNS 的設定非常簡單!只要修改 zone file 即可~不過,由於 zone file 指定的是 NS 的查詢權功能, 因此,最後那個指令在 dig dns.niki.centos.vbird 時,卻會找不到 A 喔!那是正常的~因為 192.168.100.200 尚未設定好 niki.centos.vbird 這個領域嘛!所以追蹤的結果並沒有發現在 192.168.100.200 有 niki.centos.vbird 的 zone 啊! 所以當然找不到。此時資料庫的管理權在 192.168.100.200 上啦!這樣可以理解嗎?再來處理下層 DNS 吧!


  • 下層 DNS 伺服器:需要有完整的 zone 相關設定

下層的 DNS 設定就與 19.4 的詳細內容一樣了!所以在這裡我們僅列出重要的項目:

# 1. 修改 named.conf ,增加 zone 的參數,假設檔名為 named.niki.centos.vbird
[root@client ~]# vim /var/named/chroot/etc/named.conf
....(前面省略)....
zone "niki.centos.vbird" IN {
        type master;
        file "named.niki.centos.vbird";
};

# 2. 建立 named.niki.centos.vbird
[root@client ~]# vim /var/named/chroot/var/named/named.niki.centos.vbird
$TTL   600
@      IN SOA   dns.niki.centos.vbird. root.niki.centos.vbird. (
                2011050701 3H 15M 1W 1D )
@      IN NS    dns.niki.centos.vbird.
dns    IN A     192.168.100.200
www    IN A     192.168.100.200
www    IN MX 10 www.niki.centos.vbird.
@      IN A     192.168.100.200
# 為了簡化整個版面,所以鳥哥都使用 hostname 而非 FQDN!請見諒!

# 3. 啟動並觀察相關登錄資訊
[root@client ~]# /etc/init.d/named restart
[root@client ~]# tail -n 30 /var/log/messages | grep named
....(前面省略)....
zone niki.centos.vbird/IN: loaded serial 2011050701
....(底下省略)....
# 同時,記得處理一下防火牆的放行問題!

[root@client ~]# dig www.niki.centos.vbird @192.168.100.254
# 上述的動作必須要有回應才行!否則就會出問題~

19.5.4 依不同介面給予不同的 DNS 主機名稱: view 功能的應用

想像一個環境,以我們目前的區域網路伺服器來說,我的 master.centos.vbird 有兩個介面,分別是 192.168.100.254/24 (對內) 及 192.168.1.10/24 (對外),那當我外邊的用戶想要瞭解到 master.centos.vbird 這部伺服器的 IP 時,取得的竟然是 192.168.100.254,因此還得要透過 NAT 才能連線到該介面,但明明 192.168.100.254 與外部的 192.168.1.10 是同一台伺服器主機嘛!幹嘛還得要經過 NAT 轉到內部介面呢?有沒有辦法讓外部的查詢找到 master.centos.vbird 是 192.168.1.10 而內部的找到則回應 192.168.100.254 呢?可以的!那就透過 view 的功能!

那麼 view 要怎麼處理呢?其實就是讓不同來源的用戶,能夠取得他們自己的 zone 回應就是了。舉例來說,當用戶來自 10.0.0.1 時,這個來源不可能是內部 (192.168.100.0/24) ,因此這個來源就會使用外部的 zone file 內容來回應。 因此,我們就得要準備同一個 zone 需要兩個不同的設定,再將個別的設定帶入自己的用戶端查詢當中。

現在我們針對這個概念,對於鳥哥的區網設定 view 的原則是這樣的:

  • 建立一個名為 intranet 的名字,這個名字代表用戶端為 192.168.100.0/24 的來源;
  • 建立一個名為 internet 的名字,這個名字代表用戶端為非 192.168.100.0/24 的其他來源
  • intranet 使用的 zone file 為本章前面各小節所建立的 zone filename,internet 使用的 zone filename 則在原本的檔名後面累加 inter 的副檔名,並修訂各標誌的結果。

再次強調,最終的結果當中,從內網查到的 www.centos.vbird IP 應該是 192.168.100.254,而只要不是這個來源的用戶端, 查到的 www.centos.vbird IP 應該是 192.168.1.10 才對!那就讓我們來實際設定此一項目吧!

[root@www ~]# vim /var/named/chroot/etc/named.conf
options {
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        allow-transfer  { none; };
};

acl intranet { 192.168.100.0/24; };        <==針對 intranet 給予的來源 IP 指定
acl internet { ! 192.168.100.0/24; any; }; <==加上驚嘆號 (!) 代表反向選擇的意思

view "lan" {                            <==只是一個名字,代表的是內網
        match-clients { "intranet"; };  <==吻合這個來源的才使用底下的 zone
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "centos.vbird" IN {
                type master;
                file "named.centos.vbird";
                allow-transfer { 192.168.100.100; };
        };
        zone "100.168.192.in-addr.arpa" IN {
                type master;
                file "named.192.168.100";
                allow-transfer { 192.168.100.100; };
        };
};

view "wan" {                           <==同樣,只是個名字而已!
        match-clients { "internet"; }; <==代表的則是外網的 internet 來源
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "centos.vbird" IN {
                type master;
                file "named.centos.vbird.inter"; <==檔名必須與原有的不同!
        };
        // 外網因為沒有使用到內網的 IP,所以 IP 反解部分可以不寫於此
};

上表中,有些資料是重複的,有些則需要經過修改。現在,讓我們來改改 named.centos.vbird.inter 吧!

[root@www ~]# cd /var/named/chroot/var/named
[root@www named]# cp -a named.centos.vbird named.centos.vbird.inter
[root@www named]# vim named.centos.vbird.inter
; 與整個領域相關性較高的設定
$TTL    600
@                       IN SOA   master.centos.vbird. vbird.www.centos.vbird. (
                                 2011050901 3H 15M 1W 1D )
@                       IN NS    master.centos.vbird.
master.centos.vbird.    IN A     192.168.1.10
@                       IN MX 10 www.centos.vbird.

www.centos.vbird.       IN A     192.168.1.10
linux.centos.vbird.     IN CNAME www.centos.vbird.
ftp.centos.vbird.       IN CNAME www.centos.vbird.
forum.centos.vbird.     IN CNAME www.centos.vbird.
work.centos.vbird.      IN A     192.168.1.101
vmxp                    IN A     192.168.1.21

[root@www named]# /etc/init.d/named restart
[root@www named]# tail -n 30 /var/log/messages
[root@www named]# dig www.centos.vbird @192.168.100.254
www.centos.vbird.       600     IN      A       192.168.100.254
# 要得到上面的 IP 才是對的喔!因為介面來自於 192.168.100.0/24 網段

[root@wwww named]# dig www.centos.vbird @192.168.1.10
www.centos.vbird.       600     IN      A       192.168.1.10
# 要得到上面的 IP 才是對的喔!因為介面來自非 192.168.100.0/24 網段

有沒有很簡單!這樣就能讓你的 DNS 依據不同的用戶來源,分別給予同一個主機名稱的不同解析呢!

例題:
你的網站讀者非常的多,但是分佈在世界各地。你想讓亞洲區的讀者連線到台灣的站台,而其他國家的連線則連到美國的站台, 但又不想要讓使用者自己挑選不同的主機名稱,想使用同一組主機名稱,此時該如何是好?
答:
鳥哥可以想到的最簡單的方案,就是透過 DNS 來設定相同主機名稱的不同 IP 目標,亦即是透過 view 來規範即可。 不過,與上述鳥哥的區網簡單範例不同,我們得要收集亞洲區的 IP 才行,這些區段可能可以透過底下的網站來取得: 然後再透過 acl 以及 view 來規範即可。鳥哥的收集資料如下,如果有誤,還請告知!
acl asia { 1.0.0.0/8;  14.0.0.0/8;  27.0.0.0/8;  36.0.0.0/8;  39.0.0.0/8;
          42.0.0.0/0;  49.0.0.0/8;  58.0.0.0/8;  59.0.0.0/8;  60.0.0.0/8;
          61.0.0.0/8; 101.0.0.0/8; 103.0.0.0/8; 106.0.0.0/8; 110.0.0.0/8;
         111.0.0.0/8; 112.0.0.0/8; 113.0.0.0/8; 114.0.0.0/8; 115.0.0.0/8;
         116.0.0.0/8; 117.0.0.0/8; 118.0.0.0/8; 119.0.0.0/8; 120.0.0.0/8;
         121.0.0.0/8; 122.0.0.0/8; 123.0.0.0/8; 124.0.0.0/8; 125.0.0.0/8;
         126.0.0.0/8; 175.0.0.0/8; 180.0.0.0/8; 182.0.0.0/8; 183.0.0.0/8;
         202.0.0.0/8; 203.0.0.0/8; 210.0.0.0/8; 211.0.0.0/8; 218.0.0.0/8;
         219.0.0.0/8; 220.0.0.0/8; 221.0.0.0/8; 222.0.0.0/8; 223.0.0.0/8;
         139.175.0.0/16; 140.0.0.0/8;150.116.0.0/16;150.117.0.0/16;
         163.0.0.0/8; 168.95.0.0/16;192.0.0.0/8; 
};
acl nonasia { ! "asia"; any; };
如上所示,加入 asia 與 nonasia 的相關設定,再使用 view 來處理相關的 zone ,並修改 zone file 內容, 就能夠處理好這個案例的需求囉!

19.6 DNS 伺服器的進階設定

其實, DNS 伺服器的運作原理與架設方式的變化,真的很高深莫測的!在這裡,我們額外的提出一些比較進階的內容給大家參考參考, 例如架設一個合法授權的 DNS 伺服器以及利用 rndc 控管 DNS 系統喔!

19.6.1 架設一個合法授權的 DNS 伺服器

好啦!現在你應該知道什麼是『經上游授權的合法 DNS 伺服器』了吧? 沒錯!就是上游的 DNS 伺服器將子網域的查核權開放給你來設定就對啦!嗯!雖然知道原理,但是那麼我要如何來架設一個合法的 DNS 伺服器呢?好讓我自己管理自己的 domain!舉例來說,鳥哥的 vbird.idv.tw 就是鳥哥自己管理的哩~底下我們就來談一談,如何向 ISP 申請一個合法授權的 DNS 伺服器,或者是合法的主機名稱啊!


  • 1. 申請一個合法的 domain name ...就是要花錢!

既然是要建立一個合法的 DNS server,自然就要向合法的 ISP 申請授權囉!目前你可以到底下的地方去申請喔!

其實 TWNIC 已經將台灣地區的一些 domain 授權給各大 ISP 管理了,所以你連接上述的網站之後,可以點選裡頭相關的連結到各大 ISP 去註冊!例如鳥哥就在 Hinet 註冊了 vbird.idv.tw 這個網域!現在鳥哥就以 Hinet 的註冊做為說明吧:

  1. 進入主畫面:
    直接連結到底下的網頁去: http://domain.hinet.net

  2. 選擇需要的網域名稱,並查詢該網域是否已存在:
    因為網域必需是獨一無二的,所以你必需使用該網頁當中提供的查詢功能, 去查詢一下你想要的網域是否已經被註冊了呢?一定要沒有被註冊的網域才可以喔!

  3. 逐步進行註冊:
    你可以選擇很多種類的領域來註冊,如果想要註冊個人網站,請按下圖所指的 (1) 處,如果想要註冊類似 vbird.tw 這種網域的話,則可以選擇 (2) 所指的那個項目。然後以該網站提供的功能一步一步的往下去進行, 例如以鳥哥的『個人網址』之註冊為例,按下個人網址之後,會出現流程步驟為:
    以 Hinet 網站為依據介紹註冊 domain 的方法
    圖 19.6-1、以 Hinet 網站為依據介紹註冊 domain 的方法
    請依序一步一步的將他完成,最後你會得到一組帳號密碼,就能夠修改自己的領域啦!

  4. 選擇網站代管或架設 DNS 模式:
    我們可以直接請 ISP 幫我們設定好 host 對應 IP 就好(最多三部),當然也可以自行設定一下我們所需要的 DNS 伺服器啦!如果未來你可能會架設 mail server ,所以還是自行設定 DNS 主機好了!你可以選擇圖 19.6-1 在 (3) 所指的『DNS異動與查詢』項目,會出現下面圖示。記得選擇『DNS』及填寫你的 hostname 與正確的 IP 即可喔!注意: 要填選這個項目,最好你的 IP 是固定制的,浮動制的 IP 不建議用這個選項!
    以 Hinet 網站為依據介紹註冊 domain 的方法
    圖 19.6-2、以 Hinet 網站為依據介紹註冊 domain 的方法

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


  • 3. 測試:

設定一部合法的 DNS 完畢後,建議你可以到這個網站去查詢一下你的設定是否妥當:

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

19.6.2 LAME Server 的問題

或許你曾經在 /var/log/messages 裡面看到類似這樣的訊息:

[root@www ~]# more /var/log/messages
1 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
2 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
3 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

這是什麼東西吶?根據官方提供的文件資料來看 ( 在你的 CentOS 5.x 的系統下,請察看這個檔案『 /usr/share/doc/bind-9.3.6/arm/Bv9ARM.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@www ~]# vim /etc/named.conf
// 加入底下這個參數:
logging {
        category lame-servers { null; };
};

# 2. 重新啟動 bind
[root@www ~]# /etc/init.d/named restart

基本上,那個 logging 是主機的登錄檔記錄的一個設定項目,因為我們不要 lame server 的資訊, 所以才將他設定為無 (null) ,這樣就改完了!記得重新啟動 named 之後,還是要察看一下 /var/log/messages 喔! 以確定 named 的正確啟動與否!然後,嘿嘿,以後就不會看到 lame server 咯!

19.6.3 利用 RNDC 指令管理 DNS 伺服器

不知道你會不會覺得很奇怪,那就是為啥啟動 DNS 後,在 /var/log/messages 老是看到這一句話:

command channel listening on 127.0.0.1#953

而且在本機端的 port 953 還多了個 named 所啟動的服務,那是啥?那就是所謂的 rndc 了。這個 rndc 是 BIND version 9 以後所提供的功能啦,他可以讓你很輕鬆的管理你自己的 DNS 伺服器喔! 包括可以檢查已經存在 DNS 快取當中的資料、重新更新某個 zone 而不需要重新啟動整個 DNS , 以及檢查 DNS 的狀態與統計資料等等的,挺有趣的!

不過,因為 rndc 可以很深入的管理你的 DNS 伺服器,所以當然要進行一些控管啦! 控管的方式是經過 rndc 的設定來建立一支金鑰 (rndc key),並將這支金鑰相關的資訊寫入你的 named.conf 設定檔當中,重新啟動 DNS 後,你的 DNS 就能夠藉由 rndc 這個指令來管理囉! 事實上,新版的 distributions 通常已經幫你主動的建立好 rndc key 了,所以你不需要忙碌~ 不過,如果你還是在登錄檔當中發現一些錯誤,例如:

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

那就表示你 DNS 的 rndc key 沒有設定好啦!那要如何設定好?很簡單~只要先建立一把 rndc key ,然後加到 named.conf 當中去即可!你可以使用 bind 提供的指令來進行這樣的工作喔!

# 1. 先建立 rndc key 的相關資料吧!
[root@www ~]# rndc-confgen
# Start of rndc.conf <==底下沒有 # 的,請複製到 /etc/rndc.conf 檔案中!
key "rndckey" {
        algorithm hmac-md5;
        secret "9wKjThl8p/g0dO2pUDvWHQ==";
};

options {
        default-key "rndckey";
        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 "rndckey" {
#       algorithm hmac-md5;
#       secret "9wKjThl8p/g0dO2pUDvWHQ==";
# };
#
# controls {
#       inet 127.0.0.1 port 953
#               allow { 127.0.0.1; } keys { "rndckey"; };
# };
# End of named.conf
# 至於上面的 key 及 controls 的項目則貼到 named.conf 當中去!
# 請注意,這個 rndc-confgen 是利用亂數計算出加密的那把 key ,
# 所以每次執行的結果都不一樣。所以上述的資料與你的螢幕會有點不同。

# 2. 建立 rndc.key 檔案
[root@www ~]# vim /var/named/chroot/etc/rndc.key
# 在這個檔案當中將原本的資料全部刪除,並將剛剛得到的結果給他貼上去
key "rndckey" {
        algorithm hmac-md5;
        secret "9wKjThl8p/g0dO2pUDvWHQ==";
};

# 3. 修改 named.conf
[root@www ~]# vim /var/named/chroot/etc/named.conf
key "rndckey" {
       algorithm hmac-md5;
       secret "9wKjThl8p/g0dO2pUDvWHQ==";
 };

controls {
       inet 127.0.0.1 port 953
               allow { 127.0.0.1; } keys { "rndckey"; };
};

[root@www ~]# /etc/init.d/named restart

建立了rndc key 並且啟動 DNS ,同時你的系統也已經有 port 953 之後,我們就可以在本機執行 rndc 這個指令了。這個指令的用法請直接輸入 rndc 來查詢即可:

[root@www ~]# rndc
Usage: rndc [-c config] [-s server] [-p port]
        [-k key-file ] [-y key] [-V] command

command is one of the following:

  reload        Reload configuration file and zones.
  stats         Write server statistics to the statistics file.
  dumpdb        Dump cache(s) to the dump file (named_dump.db).
  flush         Flushes all of the server's caches.
  status        Display status of the server.
# 其他就給他省略啦!請自行輸入這個指令來參考囉!

那如何使用呢?我們舉幾個小例子來說明吧!

# 範例一:將目前 DNS 伺服器的狀態顯示出來
[root@www ~]# rndc status
number of zones: 3           <==這部 DNS 管理的 zone 數量
debug level: 0               <==是否具有 debug 及 debug 的等級
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF         <==是否將查詢的資料記錄下來?
server is up and running     <==主機目前正在運作當中

# 範例二:將目前系統的 DNS 統計資料記錄下來
[root@www ~]# rndc stats
# 此時,預設會在 /var/named/chroot/var/named/data 內產生新檔案,你可以去查閱:
[root@www ~]# cat /var/named/chroot/var/named/data/named_stats.txt
+++ Statistics Dump +++ (1305011057)
success 0
referral 0
nxrrset 0
nxdomain 0
recursion 0
failure 0
--- Statistics Dump --- (1305011057)

# 範例三:將目前快取記憶體當中的資料記錄下來
[root@www ~]# rndc dumpdb
# 與 stats 類似,會將 cache 的資料放置成為一個檔案,你可以去查閱:
# /var/named/chroot/var/named/data/cache_dump.db

如果你在執行 rndc 指令時老是出現如下錯誤:

rndc: connection to remote host closed
This may indicate that the remote server is using an older version of
the command protocol, this host is not authorized to connect,
or the key is invalid.

這表示你的 /etc/rndc.key 與 /var/named/chroot/etc/rndc.key 內金鑰的編碼不同所致。 請你自行以上述的 rndc-confgen 的方式自行處理你的 rndc key ,並重新啟動 named 即可啊! 用這東西管理,你就不需要每次都重新啟動 named 囉! ^_^

19.6.4 架設動態 DNS 伺服器: 讓你成為 ISP 啦!

什麼是動態 DNS (Dynamic DNS, DDNS) 主機呢?還記得我們在第十章裡面提到, 如果我們本身是以撥接制的 ADSL 連上 Internet 時,我們的 IP 通常是 ISP 隨機提供的,因此每次上網的 IP 都不固定,所以, 我們沒有辦法以上面的 DNS 設定來給予這種連上 Internet 的方法一個適當的主機名稱。

也因此,如果我們想要利用這種沒有固定 IP 的連線方法架設網站時,就得要有特殊的管道了~ 其中之一的方法就是利用 Internet 上面已經提供的免費動態 IP 對應主機名稱的服務! 例如: http://www.no-ip.org

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

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


  • 1. DDNS Server 端的設定:

假設我有一個朋友,他使用的 Linux 主機的 IP 是會隨時變動的,但是他想要架設 Web 網站, 所以他向我申請了一個領域名稱,那就是 web.centos.vbird ,此時我必需要給他一把金鑰, 並且設定我的 named.conf 讓 centos.vbird 這個 zone 能夠接受來自用戶端的資料更新才行!首先來建立這把金鑰吧!

[root@www ~]# dnssec-keygen -a [演算法] -b [密碼長度] -n [類型] 名稱
選項與參數:
-a :後面接的 [type] 為演算方式的意思,主要有 RSAMD5, RSA, DSA, DH
     與 HMAC-MD5 等。建議你可以使用常見的 HMAC-MD5 來演算密碼;
-b :你的密碼長度為多少?通常給予 512 位元的 HMAC-MD5;
-n :後面接的則是用戶端能夠更新的類型,主要有底下兩種,建議給 HOST 即可:
     ZONE:用戶端可以更新任何標誌及整個 ZONE;
     HOST:用戶端僅可以針對他的主機名稱來更新。

[root@www ~]# mkdir -p /var/named/keys; cd /var/named/keys
[root@www keys]# dnssec-keygen -a HMAC-MD5 -b 512 -n HOST web
Kweb.+157+60597
[root@www keys]# ls -l K*
-rw------- 1 root root 112  5月 10 15:14 Kweb.+157+60597.key
-rw------- 1 root root 145  5月 10 15:14 Kweb.+157+60597.private
# 上面那把是公鑰,下面那把則是私鑰檔案!

[root@www keys]# cat Kweb.+157+60597.key
web. IN KEY 512 3 157 xP4YSC75BNqQ1B7A54lSGQkcUFo..
# 注意到最右邊的那個密碼長度,等一下我們要複製的僅有那個地方!

接下來你必需要:將公鑰的密碼複製到 /etc/named.conf 當中,將私鑰傳給你的 web.centos.vbird 那部主機上!好了,那就開始來修改 named.conf 內的相關設定吧!

[root@www ~]# vim /var/named/chroot/etc/named.conf
// 先在任意地方加入這個 Key 的相關密碼資訊!
key "web" {
        algorithm hmac-md5;
        secret "xP4YSC75BNqQ1B7A54lSGQkcUFo..";
};

// 然後將你原本的 zone 加入底下這一段宣示
        zone "centos.vbird" IN {
                type master;
                file "named.centos.vbird";
                allow-transfer { 192.168.100.100; };
                update-policy {
                        grant web name web.centos.vbird. A;
                };
        };

[root@www ~]# chown named /var/named/chroot/var/named
[root@www ~]# /etc/init.d/named restart
[root@www ~]# setsebool -P named_write_master_zones=1

注意到上頭的 grant web name web.centos.vbird. A; 那一行, grant 後面接的就是 key 的名稱,也就是說,我這把 web 的 key 在這個 zone (centos.vbird) 裡面可以修改主機名稱 web.centos.vbird 的 A 的標誌,亦即是修改主機的 IP 對應啦!語法也就是: grant [key_name] name [hostname] 標籤 也就是說,我的一把 key 其實可以給予多種權限喔!就看你如何規範了。

設定好之後,由於未來用戶端傳來的資訊是由我們主機的 named 所寫入, 寫入的目錄在 /var/named/chroot/var/named/ 當中,所以你必需要修改一下權限喔! 給他重新啟動 DNS,然後觀察一下 /var/log/messages 裡面有沒有錯誤即可! 如此一來,DDNS 主機端就設定妥當囉!


  • 2. Client 端的更新:

接下來則是 DDNS Client 端的更新了。首先,你必須要由 Server 端取得剛剛建立的那兩個檔案, 請將剛剛建立的 Kweb.+157+60597.key 及 Kweb.+157+60597.private 利用 SSH 的 sftp 傳送到用戶端, 亦即是那部 web.centos.vbird 主機上頭, 假設你已經將這兩個檔案放置到 /usr/local/ddns 裡面去,然後測試看看:

[root@web ~]# cd /usr/local/ddns
[root@web ddns]# nsupdate -k Kweb.+157+50096.key
> server 192.168.100.254
> update delete web.centos.vbird                    <==刪除原有的
> update add web.centos.vbird 600 A 192.168.100.200 <==更新到最新的
> send
> 最後在此按下 [ctrl]+D 即可

請注意到『 update add web.centos.vbird 600 A 192.168.100.200 』這行, 他的意義說的是,新增一筆資料, ttl 是 600 ,給予 A 的標籤,對應到 192.168.100.200 的意思~ 至於 nsupdate -k 後面加的則是我們在 Server 端產生的那個 key 檔案!

然後你就會發現到在 DNS 伺服器端的 /var/named/chroot/var/named/ 裡面多出一個暫存檔,那就是 named.centos.vbird.jnl 當然,/var/named/chroot/var/named/named.centos.vbird 就會隨著用戶端的要求而更新資料喔!

由於手動更新好像挺麻煩的,我們就讓 Client 自動更新吧!利用底下這個 script 即可!

[root@web ~]# vi /usr/local/ddns/ddns_update.sh
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

# 0. keyin your parameters
basedir="/usr/local/ddns"                  # 基本工作目錄
keyfile="$basedir"/"Kweb.+157+60597.key"   # 將檔名填進去吧!
ttl=600                                    # 你可以指定 ttl 的時間喔!
outif="eth0"                               # 對外的連線介面!
hostname="web.centos.vbird"                # 你向 ISP 取得的那個主機名稱啦!
servername="192.168.100.254"               # 就是你的 ISP 啊!

# 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 永遠與主機名稱保持正確的對應!這對只有撥接制上網的用戶來說,真是方便啊!

19.7 重點回顧

  • 在 Internet 當中,任何一部合法的主機都具有獨一無二的主機名稱,這個主機名稱包含了 hostname 與 domain name ,並稱為 Fully Qualified Domain Name (FQDN);
  • 為了克服人類對於 IP 不易記憶的困擾,而有名稱解析器的產生,首先是 /etc/hosts ,而後則是 DNS 系統的產生;
  • 目前 Unix Like 的機器當中,都是以 BIND 這個柏克萊大學發展的軟體來架設 DNS 伺服器;
  • DNS 是個協定的名稱,BIND 則是一個軟體,這個軟體提供的程式為 named !
  • 在 DNS 當中,每一筆記錄我們就稱他為 RR (Resource Record)。
  • 在 DNS 系統中,正解為由 hostname 找 IP ,而反解則是由 IP 找 hostname ,至於 zone 則是一個或者是部分網域的設定值;
  • 在 bind 9 之後,預設的情況下 named 已經作了 chroot 的動作。
  • Slave 主機本身並沒有自行設定 zone file ,其 zone file 是由 Master 主機傳送而來,因此, master 主機必須要針對 slave 主機開放 allow-transfer 的設定項目才行。
  • 整個 DNS 搜尋的流程當中,若找不到本身的資料,則會向 root(.) 要求資料;
  • 正解的紀錄(record)主要有:SOA, A, MX, NS, CNAME, TXT 及 HINFO 等;
  • 反解的紀錄主要有: SOA, PTR 等;
  • DNS 查詢的指令主要有: host, nslookup, dig, whois 等等;
  • 在載入了 named 這個 daemon 之後,請務必前往 /var/log/messages 察看此 daemon 的成功與否。

19.8 本章習題

  • 為何要有 DNS 系統:
    最主要的功能其實在於 Hostname 對應 IP 的查詢,可以讓我們人類以電腦主機名稱連上 Internet ,而不必背誦 IP 哩!
  • Unix Like 系統當中,主要使用那個軟體做為 DNS 主機的架設,同時,他又是使用那個 daemon 來啟動 DNS 系統?
    在 Unix Like 系統當中,使用 BIND 這個軟體做為 DNS 的架設,至於 daemon 則是使用 named 這個 daemon !
  • 最早的 Internet 其實是為了政府人員可以連上網路以進行資源的分享,另外,則是電子郵件的使用。 而在早期使用的重要檔案只有 /etc/hosts 這個,請教這個 hosts 檔案的內容含有什麼項目?
    這個檔案的『格式』為『 [IP] [主機名稱] [主機別名(aliase)]』,而,這個檔案裡面放置了至少一行,也就是:
    127.0.0.1 localhost localhost.localdomain
    另外,也可以將經常連接的主機 IP 與 HOSTNAME 的對應給他寫進來!
  • 正解檔案(forward)反解檔案(reverse)與內部迴圈使用的檔案(loopback)主要的紀錄功能為:
    正解檔在設定 hostname 對應到 IP 的紀錄,主要的紀錄有 A, NS, SOA, MX, CNAME 等等; 反解檔主要設定 IP 對應到 Hostname 的紀錄,主要的紀錄為 SOA, NS 與 PTR 等。 內部迴圈則是 localhost 與 127.0.0.1 的對應啦!
  • 在主要的 DNS 設定檔 /etc/named.conf 當中,有一個較為特殊的檔案,他的類型為 hint ,請問這個檔案的功能為何?
    這個檔案主要是由 rs.internic.net 所下載下來的,主要記錄了 root (.) 這個 zone 的 IP !可以讓我們的 DNS Server 在找不到資料庫時,可以到這個 root 去查詢資料!
  • 在 client 端搜尋 HOSTNAME 對應到 IP 的查詢時,最重要的檔案,以及該檔案的主要用途為何?
    /etc/nsswitch.conf :可以用來設定查詢主機名稱的順序!例如先查詢 /etc/hosts 再查詢 DNS 系統;
    /etc/hosts :最早的名稱解析器;
    /etc/resolv.conf:這就是 DNS 系統的 resolver (解析器)了。
  • 一般來說,在 Client 端使用的查詢 HOSTNAME 的指令大多使用什麼?
    nslookup :可以用來收集一部主機的相關資訊;
    dig:可以用來收集詳細的主機資訊;
    whois :可以用來收集詳盡的 DNS 主機資訊。
    host 則較為簡單喔!
  • 請問 named 重要的資訊登錄在在那個檔案中?
    在 /var/log/messages 當中

19.9 參考資料與延伸閱讀

修改歷史:
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 內五個數字的大小
2006/10/17:將之前的舊文章移動到此處
2006/10/20:終於~不容易~將一些資料給他修訂完畢啦!
2007/06/25:小州大大來信告知 Forwarding 與 cache-only 的介紹可以加以修改。已經處理成為這樣
2011/04/26:將舊的基於 CentOS 4.x 的版本移動到此處
2011/05/10:增加了不少東西,包括將 view 也加進來~歡迎大家參考!
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

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