Tony之愛宜乎眾矣 撰寫於文章 <3XdZ2b$GnM@bbs.ee.ntu.edu.tw>...
>※ 引述《"959" <jim@ms1.seeder.net>》之銘言:
>: 我剛剛查了一下
>: 這個> $ORIGIN magicspace.cx.我也沒打...
>: 還有...那個網站寫的我不懂...我覺得太深...我真的很淺...不好意思
>這樣好了....先去 CLDP 看看 DNS HOW-TO
>
>如果需要一些比較口語話的文件 (我正在寫..) ,再寫信給我,我再用E-Mail
>傳給你.
>

(一下內容可以在 http://go.to/study-area 找到﹕)

DNS可以說不是一個容易弄清楚的概念﹐尤其是其運作原理。如果您看過“網路基
礎”﹐相信應該有一定概念了﹐否則﹐下面的設定檔可能您就不知道說些什麼了。在
Linux 上面﹐執行 DNS 程式是叫BIND﹐ 但我們一般成它的服務程式為﹕named 。

設定NAMED

如果您在 NT 下面設定過 DNS 伺服器﹐相信您會覺得在 Linux 下面難多了。除了概念
上要比較清楚外﹐另外對檔案的關聯也要有清楚的追蹤能力﹐這對於進行 debug 尤為
重要。

下面﹐讓我們設定一個最重要的 dns 設定檔﹐它就是 /etc/named.conf 。我將我自己
的設定檔案列出來﹐然後逐部份進行解釋﹕

// generated by named-bootconf.pl

options {
        directory "/var/named";
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
        // query-source address * port 53;
};

首先﹐在這個設定檔上﹐用來做註解的符號是“//”﹐而不是一般 shell script 的
“#”﹐而一個完整的句子都以“﹔”結尾。

在這個檔案的開頭部份的 options 下面﹐首先指定了 named 的記錄檔目錄為﹕
“/var/named”﹐也就是說﹐它會到這個目錄下面尋找 DNS 記錄檔案。所以﹐我們在
這個檔案後面部份所指定的檔案﹐就無需使用絕對路徑了﹐但它們一定要放在這個目錄
下面。
接下來﹐有一段文字﹐如果您仔細閱讀一下﹐它大致是說﹕如果您要設定的 DNS 伺服
器和 client 之間是隔著火牆的話﹐要將“// query-source address * port 53;”前
面的註解符號“//”拿掉。當然﹐您也必須要設定好您的火牆啦。

如果您打算使用 DNS forwarder 的話 (也就是 DNS 可以將有關外部的 DNS 查詢轉遞
給另外的機器﹐例如上一級的 DNS)﹐您可以在 options 下面加入這樣分句子﹕

 forward first;
 forwarders {
  203.56.8.1;
  203.56.8.2;
 };


接下來的句子﹕

//
// a caching only nameserver config
//
zone "." {
        type hint;
        file "named.ca";
};

這幾行﹐我們為 named 指定了 DNS 系統中的根目錄“.”(root zone)的區域記錄檔為
﹕“named.ca”﹐也就是“/var/named/named.ca”檔案了。同時﹐還指定了 zone 的
類別為﹕“hint”﹐也只有這個 zone 會使用這樣的類別。雖然 named.ca 這個檔案中
的‘ca’是 cache 的意思。但如果您了解 DNS 的運作﹐就應該知道這個暫存檔的作
用﹐同時﹐為什麼我們會把 root zone 放在這裡。

上面的句子﹐當您安裝好系統之後就被建立起來的﹐相信您不用勞什麼心。然而﹐接下
來的句子才真正是您要設定的開始。一般來說﹐我們都會先設定“反查詢區域(revers
zone)”﹕

zone "0.0.127.in-addr.arpa" {
        type master;
        file "named.local";
};

zone "0.168.192.in-addr.arpa" {
        notify no;
        type master;
        file "named.192.168.0";
};

zone "1.168.192.in-addr.arpa" {
        notify no;
        type master;
        file "named.192.168.1";
};

zone "35.30.203.in-addr.arpa" {
        notify no;
        type master;
        file "named.203.30.35";
};

這裡﹐我一共指定了四個反查詢區域﹐它們都有一個識別標誌﹕“.in-addr.arpa”。
在設定反查詢區域的時候﹐您一定要將您的 net ID 部份反過來寫。例如﹕我的網路為
192.168.0.0/24 ﹐它的反查詢區域名則是﹕“0.168.192.in-addr.arpa”﹔如果我將
netmask 改為16bit﹐即192.168.0.0/16﹐它的反查詢區域名就會變成﹕
“168.192.in-addr.arpa”。如果您還搞不懂如何區分 Net ID 和 Host ID﹐請立即去
看一看“網路基礎”中的“IP基礎”。
如果您真真正正明白到 IP 和 Net mask 的關係﹐這裡我要出一道難題了﹕我在我的網
路設定中﹐203.30.35.0 這個網路實際上借用了 3 個 bit 來切割成 8 個子網路了。
而我將這台機器分配到 sub-net ID 為‘100’的這個子網中去﹐也就是說﹐實際的
Net ID 會是‘203.30.35.128’。我的 DNS 也只負責這個子網路的名稱服務﹐而其他
的子網則由各自的 DNS 去管理。不同的是﹕我這裡還負責了各子網的“父網”﹐即
‘203.30.35.0’的查詢而已。無論如何﹐我得為我的子網路建立其反查詢區域﹐如下

zone "128.35.30.203.in-addr.arpa" {
        notify no;
        type master;
        file "named.203.30.35.128";
};

對於切割子網的 DNS 設定﹐是非常難懂的﹐您一定要對 IP 地址劃分有很清晰的了
解。在以後的敘述裡﹐務必留神﹐如果您不想弄那麼複雜﹐最簡單莫過於在“父網”上
面為所有子網做好設定﹐但問題是﹐如果子網那裡要進行﹐就一定要勞煩上級網路管理
員了﹐網路的靈活性當然就大打折扣了。或許﹐在一開始弄 DNS 的時候就把子網帶進
來﹐會顯得過於艱難。我這裡建議您大可先將關於子網的部份略過﹐等對 named 有一
定的經驗了﹐隨時歡迎回來再看﹐也很歡迎和網中人討論心得﹗

或許您還會發現我加入“notify no”這個敘述﹐為什麼呢﹖因為﹐我這裡設定的 DNS
是沒有向 InterNIC 註冊的﹐而且大部份使用私有IP位址。這行則會禁止我這裡設定的
DNS 向外面散播 DNS 信息。
同時﹐我將這些 zone 都設定為“主 DNS 伺服器”(master﹐也有人稱之為
 primary)。
最後﹐還指定了它們各自的記錄檔。檔案的名稱隨您喜歡﹐不致做成混亂則可。

當反解 DNS 指定好之後﹐我們就要指定正解 DNS 了﹕

zone "siyongc" {
        notify no;
        type master;
        file "named.siyongc";
};

zone "home" {
        notify no;
        type master;
        file "named.home";
};

zone "virtual.test" {
        notify no;
        type master;
        file "named.virtual.test";
};

zone "test.domain" {
        notify no;
        type master;
        file "named.test.domain";
};

和反向查詢區域一樣﹐這些檔區域也是 master 類別。它們也有著各自的記錄檔。

好了﹐現在﹐請回顧一下 /etc/named.conf 這個檔案﹐將所有各 zone 的記錄檔名稱
抄下來﹐我們要逐一將它們設定好。

先讓我們轉到 /var/named 這個目錄吧﹐然後 輸入 ls -l 看一看。最少﹐您應該會看
到 named.ca 這個檔案的﹐如果它不存在﹐用下面的內容建立一個吧﹕

.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     198.41.0.10
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     198.32.64.12
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33

這裡一共列出了 13 個 root zone 名稱伺服器的名稱﹐和它們的 IP 地址。‘3600000
’是 TTL ﹐也就是在快取中保留的時間。‘IN’表示這是一個 internet 地址類型﹔
‘NS’是“Name Server”的意思﹐是 DNS 記錄名稱之一。有時候﹐同一個區域可以由
多個 NS 管理﹐這這裡的‘.’區域就一共有 13 個 NS 了。‘A’呢﹖也是一個 DNS
記錄名稱﹐代表一個Host﹐它所對應的的通常會是主機名稱和 IP 地址。(關於更多的
記錄名稱﹐請參閱“網路基礎”中的“DNS 協定”)。

除了剛才的 named.ca 之外﹐您還應該會看到一個 named.local 吧﹖如果您還沒忘記
/etc/named.conf 的內容的話﹐應知道這個檔案是 zone "0.0.127.in-addr.arpa" 的
記錄檔﹐它的內容很簡單﹕

$TTL 86400
@       IN      SOA     localhost. root.localhost.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS      localhost.

1       IN      PTR     localhost.

請留心觀察記錄檔中的主機名稱﹐它們最後都是用一個“.”結尾的﹐在 DNS 記錄中﹐
這樣的名稱我們稱為“全域名稱”。如果缺少了這個點會怎樣呢﹖就會將該“區域名
稱”附加在記錄名稱後面了。也就是說﹕“localhost”會變成
“localhost.0.0.127.in-addr.arpa”。所以﹐這個小點“.”非常重要﹐在以後設定
中一定要非常留神﹗

這裡﹐我們看到“$TTL”這個 option (凡是帶有$符號的都是DNS記錄檔 option)﹐它
的值是以“秒”為單位的。然後我們又看到一個特殊字符“@”﹐它是“Origin”的意
思﹐如果您喜歡﹐可以用“$ORIGIN 0.0.127.in-addr.arpa.”來代替。也就是說這個
記錄檔是源自“0.0.127.in-addr.arpa”這個區域的。如果您使用“@”符號的話﹐它
會自動的將區域換成在 /etc/named.conf 所指定的 zone ﹐既然這樣﹐當然是使用
“@”啦。

“SOA”是“Start Of Authority”的意思﹐表示該檔案是該區域的資料檔。每一個資
料檔只能有一個 SOA﹐不得重複﹐而且一定是檔案中第一個“記錄”。緊接 SOA 後
面﹐指定了這個區域的授權主機和管理者的信箱﹐也就是“localhost.
root.localhost.”。這裡要注意的是﹕主機名稱﹐必須要為一個 A 記錄 (以後會提
到)﹔另外﹐信箱通常使用“user@host”的格式﹐但因為“@”在 DNS 記錄中是個保留
字符(剛才已經提過)﹐所以這裡就用“.”來代替了。

接下來在“( )”之間的數字﹐是用來和 slave 伺服器更新 DNS 資料使用的數據﹕
“Serial”的格式通常會是“年月日+修改次序”(但也不一定如此﹐您自己能夠記得就
行)﹐當 slave 到時候進行資料更新的時候﹐會比較這個號碼。如果發現在 master 上
面的號碼比原來的“大”﹐就進行更新﹐否則忽略。“Refresh”指定的是進行更新的
時間間隔。“Retry”呢﹐是如果更新失敗後進行重試的時間間隔。“Expire”是記錄
逾期時間。“Minimum”是最小預設 TTL 值﹐如果您不使用“$TTL”進行指定﹐就會以
此值為准。以上的數字都是以秒為單位﹐但您也可以 H(小時)、D(天)、W(星期)來做單
位﹐如﹕8H。

接下來的“IN”和“NS”已經介紹過了。

最後一行我們看到一個“PTR”記錄﹐它是“Pointer”的意思。 PTR 只會用於反查詢
記錄當中﹐它是將 IP 和 主機名稱對應起來(剛好和 A 記錄相反)。我們看這行句子﹕

1       IN      PTR     localhost.

所表示的意思是﹕127.0.0.1 所對應的主機名稱是 localhost 。句子開頭的“1”就是
該網域中的 Host ID(以完整的Otec為准)。因為我們用來反向查詢區域的 IP 順序是掉
過來寫的﹐所以這行記錄中的反查詢 IP 就是﹕“1.0.0.127”了。

好了﹐當我們了解這個記錄檔的內容之後﹐那麼﹐我們就可以著手一一建立起那些在
/etc/named.conf 裡面指定的記錄檔了。我這裡不打算將它們全部列出來了﹐我只把其
中最複雜的有關“切割子網”的兩個記錄檔列出來﹕

;File: /var/named/named.203.30.35
$TTL 86400
@       IN      SOA     redhat52.siyongc. webmaster.siyongc. (
                        1999092801      ; serial
                        8H              ; refresh
                        2H              ; retry
                        1W              ; expire
                        1D )            ; minimun
;
                NS      redhat52.siyongc.
;
128             NS      redhat52.siyongc.
134     IN      CNAME   134.128.35.30.203.in-addr.arpa.

在 DNS 記錄檔裡面﹐“;”是註解符號﹐以它開始到句子結尾都會被忽略。您會看到
30.35.203.in-addr.arpa. 這個記錄檔有兩個 NS 記錄﹐第一個是本身區域的名稱伺服
器﹐而第二個則指定了 128. 30.35.203.in-addr.arpa. 這個區域的 DNS 伺服器為﹕
“readhat52.siyongc.”(要留意最後的“.”哦﹗)。在這個檔案中﹐我們看到一個新
記錄﹕“CNAME”﹐它是一個別名記錄﹐也就是所有關於 CNAME 左面的名稱查詢﹐都會
轉向 CNAME 右面的名稱再進行查詢﹐一直追蹤到最後的 PTR 或 A 名稱查詢成功﹐才
會做出回應﹐否則失敗。例如﹐在正解查詢中﹐一個 IP 通常(當然也有例外)﹐只有一
個 A 記錄﹐但我們可以使用 CNAME 在 A 名稱之上賦予該 IP 更多的名稱。而在這個
特殊的“切割子網例子中”﹐因為 134 這個 IP 實際上是子網 203.30.35.128 裡面的
範圍﹐但您不能在 ineternet 上面使用 203.30.35.128.134 這樣的 IP 格式的。所
以﹐所有以 203.30.35 開頭的 IP﹐都會先向 203.30.35.0 這個網路查詢﹐然後再通
過 CNAME 轉向其子網路進行查詢。

因為我在這裡﹐只是引用這些設定來做例子﹐如果在實際的設定中﹐我們應該在“父
網”查詢中﹐建立其所有的 IP 對應﹐包括子網IP(NS)和主機IP(CNAME)。如果不想在
將來被動的等子網那邊新增主機後再來改動﹐倒可以考慮把 0 到 255 (在C 級網路中)
全部設定起來。反正﹐就算您現在在父網上設定了﹐如果子網那端沒有相應的記錄的話
(不見得它們的 IP 會全部都使用到)﹐其查詢也是會失敗的。

下面的內容﹐就是已經經過切割了的子網反查詢記錄﹕

;File: /var/named/named.203.30.35.128
$TTL 86400
@       IN      SOA     redhat52.siyongc. webmaster.siyongc. (
                        1999092811      ; serial
                        8H              ; refresh
                        2H              ; retry
                        1W              ; expire
                        1D )            ; minimun
;
                NS      redhat52.siyongc.
;
134             PTR     test.test.domain.

目前在此例子中﹐該個子網和父網的 DNS 都是同一台機器﹐所以它們的 NS 也就相同
了。

當您將 /etc/named.conf 中所有的反查詢記錄檔設定好之後﹐接下來﹐就應該進行正
解查詢記錄的設定了。同上﹐我也不一一將所有檔案內容列出來了。只挑選了
‘siyongc(192.168.0.0)’和‘test.domain(203.30.35.128)’這兩個區域進行說明一
下。因為 203.30.35.0 這個網路實際上沒有任何主機設定的(假設所有主機都由各自的
子網 DNS 負責了)﹐因而這裡我們無需建立這個區域的正解查詢記錄。

讓我們先看看 siyongc 這個區域的記錄檔內容吧﹕

; File﹕ /var/named/named.siyongc
;
; Zone file for domain﹕ 'siyongc.'
;
$TTL 86400
@       IN      SOA     redhat52.siyongc. webmaster.siyongc. (
                        1999092801      ; serial
                        8H              ; refresh
                        2H              ; retry
                        1W              ; expire
                        1D )            ; minimun
;
                TXT     "A test domain, siyongc., created by Netman"
                NS      redhat52
                NS      debian.home.
                MX      10      redhat52.siyongc.
                MX      20      debian.home.
;
localhost       A       127.0.0.1
;
gw              A       192.168.0.17
                HINFO   "Redhat" "MASQ"
                TXT     "The masquerade gateway for internet"
;
redhat52        A       192.168.0.17
                MX      10 redhat52.siyongc.
                MX      20 debian.home.
                HINFO   "Dell PII 266" "Linux RedHat"
www             CNAME   redhat52
mail            CNAME   redhat52
ftp             CNAME   redhat52
news            CNAME   redhat52
smtp            CNAME   redhat52
;
pii266          A       192.168.0.15
                HINFO   "CWindows 98"
;
slware36        A       192.168.0.18
                MX      10 redhat52.siyongc.
                MX      20 debian.home.
;
rhroute         A       192.168.0.4
                MX      10 redhat52.siyongc.
                MX      20 debian.home.

在這個檔裡面﹐我們發現了不少的新記錄名稱。首先是‘TXT’記錄﹐是‘Text
Information’的意思﹐它實際上不牽涉任何設定﹐只記錄一些環境說明而已﹔這和後
面的‘HINFO(Host Information)’差別多。然後﹐因為我這個區域的記錄分別由兩台
主機負責﹐所以我這裡指定了個 NS 記錄﹐不過﹐我在這裡偷了一個懶﹕正如我上面解
釋過﹐如果名稱後面不是以“.”結尾的話﹐該記錄的區域名稱就會自動的加在記錄名
稱後面。也就是﹕ “redhat52”沒有用點結尾﹐就成了“redhat52.siyongc”了﹐這
個名稱實際就是我所要的。雖然這並不省很多﹐但對於像我這樣的懶人來說﹐卻是方便
的。

接下來的 MX 記錄恐怕要花些時間解析。 MX 是‘Mail Exchange’的意思﹐它指定了
負責該區域的郵件伺服器名稱(必須使用全域名稱)﹐而且該名稱必須是一個 A 記錄(不
建議使用 CNAME)。在郵件系統中﹐只要郵件伺服器雙方都知道對方的 IP 就可以進行
郵件交換了。我們用 /etc/hosts 也可以做到名稱查詢的目的﹐但正如我們可以想像到
的﹕ineternet 這麼多郵件伺服器﹐我們不可能一一為它們建立好 IP 對應。就算﹐我
們可以這樣做﹐如果對方要更換郵件伺服器﹐要維護這樣一個對應殊非易事。既然﹐我
們可以用 DNS 來查詢主機和 IP﹐為什麼不使用這麼便利的系統呢﹖但問題是﹐各區域
的郵件伺服器名稱都不一樣﹐我們也不可能知道對方的郵件伺服器主機名稱是什麼(雖
然我們可以用 CNAME 建立一個‘mail’名稱記錄﹐但也不盡然)。就算知道﹐如果對方
以後更換名稱呢﹖

您看﹐即使我們使用了 DNS 系統來進行郵件路由﹐也不是這麼簡單的事情。但是﹐使
用 MX 記錄就大大發揮了 DNS 系統的功能了﹕我們只要為每一個區域建立其 MX 記
錄﹐指定出用 DNS 查詢得到的郵件伺服器名稱(郵件路由中﹐DNS 只是其中一種方
法)﹐這樣﹐當郵件伺服器要和對方的區域進行郵件傳遞的時候﹐就可以通過 MX 記錄
得到對方的郵件伺服器名稱了。以後﹐就算對方更換名稱﹐將 DNS 記錄改改就可以
了。而外面的郵件伺服器﹐根本無需認知到這個改變。

另外﹐使用 MX 還有一個功能﹕您可以用 MX 同時指定好幾台郵件伺服器名稱。在我這
個例子中﹐我就分別為‘siyongc’這個區域指定了兩個 MX 記錄﹕
‘redhat52.siyongc.’和‘debian.home.’。但您有沒有發現它們前面都有一個數字
呢﹖這數字有什麼作用啊﹖問得好﹗當外面的郵件伺服器通過 DNS 查詢到我們的郵件
伺服器﹐如果發現超過一台主機負責郵件交換的話﹐數值越低的就越先做出回應。但有
時候該主機太過繁忙呢﹖那麼就由下一個數值的主機負責了。這樣還有一個好處是﹐就
算第一台郵件伺服器出現故障﹐也不至於該區域的郵件交換功能癱瘓掉。雖然我們通常
喜歡用‘10’、‘20’、‘30’.... 這樣的數字來分配 MX 記錄﹐但只要您喜歡﹐用
‘1’、‘2’、‘3’... 這樣的順序一樣可以。

同時﹐您或許發現我也分別為下面的 linux 主機指定了 MX 記錄。因為在 Linux 機器
上面﹐各主機本身就具備郵件交換功能(除非您將之移除了)。這裡的設定是﹐從外面通
過 DNS 查詢寄往那些主機的郵件﹐也使用 MX 上面指定的郵件伺服器。

雖然前面我們不斷的提到過“A”記錄﹐或許您還以為會很複雜。但正如您看到的﹐‘A
’記錄其實最簡單不過了﹕“主機名稱”對“IP”﹗就是這麼簡單啦。如果您沒忘記反
解查詢記錄的話﹐‘A’記錄正好和‘PTR’記錄相反就是了。

至於‘CNAME’記錄相信不用我多解釋了吧﹖也就是說﹕所有關於‘www.siyongc’
ftp.siyongc’這些名稱查詢﹐實際上都會轉向查詢‘redhat52.siyongc’這個記
錄。

為了讓您更好的理解切割子網的 DNS 設定﹐下面﹐我將 203.30.35.128 這個子網區域
(test.domain)的記錄檔列在下面﹕

; File: /var/named/named.test.domain
;
; Zone file for domain: 'test.domain.'
;
;
$TTL 86400
@       IN      SOA     redhat52.siyongc. webmaster.siyongc. (
                        1999092801      ; serial
                        8H              ; refresh
                        2H              ; retry
                        1W              ; expire
                        1D )            ; minimun
;
                TXT     "A test domain, created by Netman"
                NS      redhat52.siyongc.
                MX      10      redhat52.siyongc.
;
localhost       A       127.0.0.1

test            A       203.30.35.134
                HINFO   "Kingmax" "TEST"
                TXT     "Kingmax for secondary NIC"
www             CNAME   test
mail            CNAME   test
ftp             CNAME   test
news            CNAME   test
smtp            CNAME   test


好不容易﹐我們就快要完成 DNS 的設定了。如果﹐您還有勇氣接受挑戰﹐請繼續往下
看﹐否則﹐請按這裡略過這部份。

我的討論是﹕在 DNS 系統中﹐每一個 zone 下面都可以包含有更多的 sub-zone ﹐但
通常﹐我們只需為 domain 所在的頂級 zone 進行註冊就可以了。現在﹐我想在
‘test.domain’下面劃分一個 sub-zone 叫做﹕‘sub.test.domain’﹐但我希望
sub.test.domain 管理自己的記錄﹐而無需勞動 test.domain 來管理。這裡﹐我們暫
時不進行 IP 子網劃分了﹐所以我們無需在 128.35.30.203.in-addr-arpa 這個反查詢
區域下面再建立 CNAME 對應了(現在﹐您應該知道怎麼樣為切割子網建立反解查詢了吧
﹖如果不會﹐參考前面的例子)。同時﹐我想指定 test1.sub.test.domain 這台主機用
203.30.35.144 這個 IP 負責該 sub-zone 的記錄查詢。您知道要怎樣設定麼﹖

下面就是我的設定步驟。不過﹐我想您先嘗試一下自己進行設定﹐再來對照我的方法﹐
看看是否一至。說不定您自己的方法更有效呢﹗當然﹐我也很歡迎您和我討論這個問
題。

首先﹐我在 /var/named/named.203.30.35.128 檔案下面建立起新主機的對應﹕

144             PTR     test1.sub.test.domain.

如果您還有其他機器要設定﹐請一一建立好記錄。正如我剛才提到﹐這裡我沒打算再切
割子網了﹐所以還是使用同一個反查詢記錄檔。如果您在實際情況下面需要進行切割的
話﹐希望您再進一步劃分。

接著﹐我在 /var/named/named.test.domain 檔案裡面新增這兩行﹕

sub             NS      test1.sub.test.domain.
test1.sub.test.domain.  A       203.30.35.144

第一行﹐我指定了 sub.test.domain 的 DNS 主機 IP 地址。第二行我使用了全域名稱
來指定 sub-zone 裡面的 DNS 主機。如果您了解 DNS 運作的話﹐應該知道要查詢
sub.test.domain 裡面的主機的話﹐會先從“.”那裡一直查詢到 test.domain 的 NS
主機﹐然後從該主機的記錄中(也就是目前這個檔案)裡面得到 sub.test.doamin 的 NS
主機﹐即﹕test1.sub.test.domain. ﹐然後再得到該主機的 IP 地址為
﹔203.30.35.144 ﹐有了 IP 就好辦事啦。

好了﹐然後我們轉到 test1.sub.test.domain 這台主機上﹐修改 /etc/named.conf 檔
案﹕

zone "sub.test.domain" {
        notify no;
        type master;
        file "named.sub.test.domain";
};

再次說明﹕因為反查詢已經由上級 zone 主機管理了﹐所以這裡無需再指定反查詢區域
了。

然後﹐我們在 /var/named 目錄下面建立 named.sub.test.domain 記錄檔﹕

; File: /var/named/named.sub.test.domain
;
; Zone file for sub-domain: 'sub.test.domain.' , parent domain is
'test.domain.'
;
$TTL 86400
@       IN      SOA     test1.sub.test.domain. webmaster.siyongc. (
                        1999092811      ; serial
                        8H              ; refresh
                        2H              ; retry
                        1W              ; expire
                        1D )            ; minimun
;
                TXT     "A test sub domain, created by Netman"
                NS      test1.sub.test.domain.
                MX      10      redhat52.siyongc.
;
localhost       A       127.0.0.1

test1           A       203.30.35.144
                TXT     "A sub test host"
www             CNAME   test1
mail            CNAME   test1
ftp             CNAME   test1
news            CNAME   test1
smtp            CNAME   test1

照這樣看來應該沒什麼問題了。由於我這裡的情形是虛構的﹐還沒進行過真正的測試
(在不同機器上)﹐如果您發現有問題﹐歡迎來信或到討論版上發言指教。

讓您的設定生效

當您以為所有設定檔都設定好之後﹐最想做的事情莫過於要測試一下啦﹐但在測試之
前﹐我們得要重新啟動 named ﹐否則﹐您測試出來的還是舊資料。聰明的您或許已經
知道使用 /etc/rc.d/init.d/named restart 來重新啟動DNS 服務﹐但﹐我這裡還有更
懶的方法哦﹕
輸入 ndc restart 即可﹗哈哈~~~ 是不是您最想要的呢﹖

測試 DNS

如果要測試我們的設定是否生效﹐我們可以使用的方法有很多﹐其中最常用的是
nslookup 命令。關於 nslookup 我已經在“網路基礎”中的“DNS 協定”有很詳細的
例子﹐這裡不再重複。

但如果我們在測試中失敗﹐例如 nslookup 回應說﹕

*** redhat52.siyongc can't find test1.test.domain: Non-existent host/domain

或停在某處不動了﹐您可以按 Ctrl + C 終止查詢﹐再打 exit 跳出來。您就要進行
debug 工作了﹐在我們動手查看設定檔和記錄檔之前﹐有一個地方很值得我去看看的。
在您輸入 ndc restart 之後﹐接著輸入﹕
vi /var/log/messages
然後按“G”鍵(大寫)跳到檔案末尾部份﹐如果您看到諸如這樣的敘述﹕
Nov 26 23:33:14 redhat52 named[3078]: named shutting down
Nov 26 23:33:14 redhat52 named[3078]: USAGE 943619594 943617695 CPU=0.02u/0s
CHI
LDCPU=0u/0s
Nov 26 23:33:14 redhat52 named[3078]: NSTATS 943619594
943617695A=13PTR=5MX=1ANY
=1
Nov 26 23:33:14 redhat52 named[3078]: XSTATS 943619594 943617695 RR=11
RNXD=3 RF
wdR=10 RDupR=0 RFail=0 RFErr=0 RErr=0 RAXFR=0 RLame=0 ROpts=0 SSysQ=1
SAns=13 SF
wdQ=6 SDupQ=8 SErr=0 RQ=20 RIQ=0 RFwdQ=0 RDupQ=1 RTCP=0 SFwdR=10 SFail=0
SFErr=0
 SNaAns=2 SNXD=5
Nov 26 23:33:14 redhat52 named[3476]: starting.  named 8.2 Wed Mar 31
10:57:12 E
ST 1999
^Iroot@porky.devel.redhat.com:/usr/src/bs/BUILD/bind-8.2/src/bin/named
Nov 26 23:33:14 redhat52 named[3476]: cache zone "" (IN) loaded (serial 0)
Nov 26 23:33:14 redhat52 named[3476]: master zone "0.0.127.in-addr.arpa"
(IN) lo
aded (serial 1997022700)
Nov 26 23:33:14 redhat52 named[3476]: master zone "0.168.192.in-addr.arpa"
(IN)
loaded (serial 1999092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone "1.168.192.in-addr.arpa" (
IN)
loaded (serial 1999092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone "35.30.203.in-addr.arpa"
(IN)
loaded (serial 1999092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone
"128.35.30.203.in-addr.arpa" (
IN) loaded (serial 1999092811)
Nov 26 23:33:14 redhat52 named[3476]: master zone "siyongc" (IN) loaded
(serial
1999092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone "home" (IN) loaded (serial
199
9092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone "virtual.test" (IN) loaded
(se
rial 1999092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone "test.domain" (IN) loaded
(ser
ial 1999092801)
Nov 26 23:33:14 redhat52 named[3476]: master zone "sub.test.domain" (IN)
loaded
(serial 1999092811)
Nov 26 23:33:14 redhat52 named[3476]: listening on [127.0.0.1].53 (lo)
Nov 26 23:33:14 redhat52 named[3476]: listening on [203.30.35.134].53 (eth0)
Nov 26 23:33:14 redhat52 named[3476]: listening on [192.168.0.17].53 (eth1)
Nov 26 23:33:14 redhat52 named[3476]: listening on [192.168.1.17].53
(eth1:0)
Nov 26 23:33:14 redhat52 named[3476]: listening on [206.17.104.179].53
(ppp0)
Nov 26 23:33:14 redhat52 named[3476]: Forwarding source address is
[0.0.0.0].103
9
Nov 26 23:33:14 redhat52 named[3477]: Ready to answer queries.

這裡的記錄沒有出現任何錯誤信息﹐那是最理想的事情﹐那真要恭喜您了﹗但有時候您
會看到有其他錯誤信息出現的﹐如﹕
Nov 26 23:43:07 redhat52 named[3615]: Zone "sub.test.domain" (file
named.sub.tes
t.domain): No default TTL set using SOA minimum instead
Nov 26 23:43:07 redhat52 named[3615]: named.sub.test.domain:8: SOA for
"localhos
t.sub.test.domain" not at zone top "sub.test.domain"
Nov 26 23:43:07 redhat52 named[3615]: Zone "sub.test.domain" (file
named.sub.tes
t.domain): no NS RRs found at zone top
Nov 26 23:43:07 redhat52 named[3615]: master zone "sub.test.domain" (IN)
rejecte
d due to errors (serial 1999092811)

第一個錯誤信息不是很重要﹐只是因為您沒有設定“$TTL”罷了﹐沒有它則使用
‘Minimum’指定的數值﹔第二個錯誤呢﹐可能是因為在 SOA 前面您設定了其他的記
錄﹐或是您根本沒設定 SOA﹔第三個錯誤﹐可能是因為您沒有設定 NS 記錄﹐或是設定
錯誤﹔最後一個信息是﹐告訴您"sub.test.domain" 這個 zone 被擋回來了﹐也就是
named 拒絕為之進行 DNS 服務。

當您發現這些錯誤信息之後﹐看看是關於那些記錄的﹐然後順藤摸瓜﹐留心一下檔案內
容﹐就比較容易找到錯誤的原因了。