莱西淘宝:架設 DNS(DNS终结篇)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 19:22:12
来源: 互联网 时间: 2008-12-15 作者: 网友提供
这次终于再次把RH8的DNS搞定,其实是很简单,很多地方都不要动,只要动三个地方,一是/etc/named.conf指明路径和zone,另一个是zone文件,要特别主意"("第一个括号不能单独放在一行的开头,其次是需要加一个@ IN A 192.168.2.2(好多地方我发现不需要也可以,但是我不知道为什么我就不可以,如果呢知道是怎么回事请告诉我),相关文件在这里下载(我的已经配置好的) mydnsRH8.rar
--------------------------------------------------------------------------------
前面所介紹的伺服器服務大多是用在內部網路環境中的﹐不過﹐以現代的情況和未來的趨勢來看﹐每個網路或多或少都需要 Internet 連線以及向 Internet 提供服務。從這一章開始﹐我們將為大家陸續介紹一些在 Internet 環境中常用到的伺服器之架設技巧。就算您目前還沒真的需要架設 Internet 相關的伺服器﹐但許多企業的 Intranet 環境中﹐也需要相類似的伺服器來為企業內部網路提供服務。
前提條件
在眾多 Internet 伺服器當中﹐有一種服務是所有服務的基礎﹐就是 DNS 服務。DNS 可以說是一個不容易弄清楚的概念﹐尤其是其運作原理。如果您看過“學習網路”中的“ DNS 協定”(我強烈建議您看看這篇文章﹗)﹐相信應該有一定概念了﹐否則﹐您在如下的閱讀中可能難以理解﹐也浪費您的時間。
無論如何﹐在您進一步閱讀下面文章之前﹐請您先確定能正確回答如下的問題﹕
什麼是 DNS 的授權模式﹖是怎樣進行的﹖
請解釋 zone 和 domain 的差別。
什麼是 DNS 正解和反解﹖
什麼是 DNS 的查詢模式﹖查詢過程是怎樣進行的﹖
請解釋 DNS cache 的作用和它對查詢流程的影響。
如果您未能從上面的聯結網頁找到答案﹐那我再推薦您多看一篇文章﹕
http://turtle.ee.ncku.edu.tw/~tung/dns/dnsintro.html
忠告﹕請不必急著知道怎樣設定 DNS﹐花點時間將 DNS 的原理弄明白非常重要﹐尤其是授權模式和查詢模式的正確理解。在日後的 DNS 架設和管理中﹐是否能正確理解這些 DNS 原理﹐往往是成敗的關鍵所在﹗
如果您在 NT 或 Win2K 下面設定過 DNS 伺服器﹐相信您會覺得在 Linux 下面難多了。除了概念上要比較清楚外﹐另外對檔案的關聯也要有清晰的追蹤能力﹐這對於進行 debug 尤為重要。因為在 Windows 系統上面﹐您的所有設定都透過圖形界面進行﹐方便是方便﹐但也因為這個圖形界面﹐限制了您的設定靈活性﹐同時也阻隔了您對 DNS 系統的深入了解。當您完成了這章的學習﹐而且成功在 Linux 架設出複雜的 DNS 環境之後﹐歡迎您再回到 Win2K 上嘗試做同樣的事情。或許﹐您就會認同我這裡的觀點了...
好了﹐閒話休提﹑言歸正傳﹐聽百遍不如做一遍﹐那就讓我們開始動手吧﹗
探索 NAMED
在 Linux 上面﹐提供 DNS 服務的套件是叫 bind﹐ 但執行服務程式名稱則是 named 。請您確定系統上裝有 bind﹑bind-utils﹑以及 caching-nameserver 這幾個套件﹐同時用 ntsysv 確定 named 被選擇為開機服務。
首先﹐讓我們設定一個最重要的 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 設定﹐首先用 directory 指定了 named 的資源記錄( RR - Resource Record )檔案目錄所在位置為﹕“/var/named”﹔也就是說﹐它會到這個目錄下面尋找 DNS 記錄檔案。所以﹐我們在這個檔案後面部份所指定的檔案﹐就無需使用絕對路徑了﹐但它們一定要放在這個目錄下面。
接下來﹐有一段文字﹐如果您仔細閱讀一下﹐它大致是說﹕如果您要設定的 DNS 伺服器和 client 之間是隔著火牆的話﹐要將“// query-source address * port 53;”前面的註解符號“ // ”拿掉(當然﹐您也必須要設定好您的火牆啦)。不過﹐這只對早期的版本有影響﹐而在 bind 8.1 之後則無需擔心這個設定。
接下來再讓我們看下一段句子﹕
//
// a caching only nameserver config
//
zone "." IN {
type hint;
file "named.ca";
};
透過這幾行﹐我們為 named 定義了 DNS 系統中的根區域“ . ”(root zone) 的設定﹐同時它是一個 internet ( IN ) 的區域類別( class )。這裡還指定了root zone 的伺服器種類( type ) 為“hint”(也只有這個 zone 會使用這樣的種類)。最後﹐用 file 指定這個區域記錄檔為﹕“named.ca”﹐也就是“/var/named/named.ca”檔案。雖然 named.ca 這個檔案中的‘ca’是 cache 的意思﹔但如果您了解 DNS 的運作﹐就應該知道這個暫存檔的作用﹐同時﹐為什麼我們會把 root zone 放在這裡。(嗯﹖想想看﹖尤其是查詢非本機區域的時候﹖)
在 root zone 後面﹐您應該還會看到如下這兩段﹕
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
這裡是定義出關於本機名稱的 DNS 解釋﹕第一個 zone 是 localhost 的正解 zone﹐其伺服器種類是 master﹐記錄檔名稱是 localhost.zone (在 /var/named 目錄下面)﹐但這個 zone 不允許客戶主機(或伺服器)自行更新 DNS 的記錄(當然﹐client 主機必須能支援 DNS submit 功能才行)。
而第二個 zone 則是本機區域的反解 zone ﹐不過﹐這部份的解釋我想留到後面的真實例子中再作說明﹐請您留意就是了。
上面的句子﹐當您安裝好 caching-nameserver 套件之後就被建立起來的﹐相信您不用勞什麼心力。在檔案最後﹐您或許還看到下面這段設定﹕
key "key" {
algorithm hmac-md5;
secret "coqJswFdBMdNAItnLOpkmGgmJtccFsoNZZciWqxlGZBMUTOUxb0geYMFRyTT";
};
這是 bind 9.x 版本的新功能﹐用來進行區域轉移或 DNS 更新所用的加密處理。這個我們暫時不必理會﹐除非您有興趣進行這個研究。
現在﹐我們暫時不要修改 named.conf 設定檔﹐請退出它﹐然後轉到 /var/named 目錄﹐看看裡面有些什麼東東﹖最起碼﹐您會看到如下三個檔案﹕
named.ca
localhost.zone
named.local
不知道您是否有靈感了﹖沒錯﹕剛纔在 named.conf 裡面﹐每一個 zone 所指定的 file 都出現在這裡﹗先讓我們看看 root zone 的檔案內容吧﹕
; This file holds the inFORMation on root name servers needed to
; initialize cache of Internet domain name servers
; (e.g. reference this file in the "cache . "
; configuration file of BIND domain name servers).
;
; This file is made available by InterNIC registration services
; under anonymous FTP as
; file /domain/named.root
; on server FTP.RS.INTERNIC.NET
; -OR- under Gopher at RS.INTERNIC.NET
; under menu InterNIC Registration Services (NSI)
; submenu InterNIC Registration Archives
; file named.root
;
; last update: Aug 22, 1997
; related version of root zone: 1997082200
;
;
; FORMerly NS.INTERNIC.NET
;
.3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.3600000 A 198.41.0.4
;
; FORMerly NS1.ISI.EDU
;
.3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.3600000 A 128.9.0.107
;
; FORMerly C.PSI.NET
;
.3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.3600000 A 192.33.4.12
;
; FORMerly TERP.UMD.EDU
;
.3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.3600000 A 128.8.10.90
;
; FORMerly NS.NASA.GOV
;
.3600000 NS E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.3600000 A 192.203.230.10
;
; FORMerly NS.ISC.ORG
;
.3600000 NS F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.3600000 A 192.5.5.241
;
; FORMerly NS.NIC.DDN.MIL
;
.3600000 NS G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.3600000 A 192.112.36.4
;
; FORMerly AOS.ARL.ARMY.MIL
;
.3600000 NS H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.3600000 A 128.63.2.53
;
; FORMerly NIC.NORDU.NET
;
.3600000 NS I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.3600000 A 192.36.148.17
;
; temporarily housed at NSI (InterNIC)
;
.3600000 NS J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.3600000 A 198.41.0.10
;
; housed in LINX, operated by RIPE NCC
;
.3600000 NS K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.3600000 A 193.0.14.129
;
; temporarily housed at ISI (IANA)
;
.3600000 NS L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.3600000 A 198.32.64.12
;
; housed in Japan, operated by WIDE
;
.3600000 NS M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.3600000 A 202.12.27.33
; End of File
在 /var/named 中的 RR 記錄檔裡面的註解符號﹐和 /etc/named.conf 的註解符號不一樣哦﹕在 named.conf 中是用雙斜線“ // ”﹔而在這裡則使用 “ ﹔”符號。無論如何﹐您都不能用 “ # ”來做註解符號就是了。(好混亂哦~~~ 這就是電腦﹗^_^ )
在上面這個 named.ca 檔案裡面﹐您如果將所有的註解行拿掉﹐您會發現一共有 13 行是以‘ . ’開頭的﹐那就是所謂的 root zone 了﹗然後﹐第二欄都是‘3600000 ’﹐這是 TTL (Time To Live) 設定﹐也就是在 cache 中保留的時間﹐以秒為單位(所以這裡是 100 小時)。其後的‘ NS ’是“Name Server”的意思﹐是 DNS 記錄名稱之一﹐也就是負責這個記錄的 name server 是哪一台主機(這裡一共由 13 台主機共同負責 root zone 的 NS 服務)。
雖然我們這裡用 NS 指定了 name server 的主機名稱﹐但對電腦系統來說﹐這些名稱必須能解釋為 IP 位址才有用(呵~~ 這個正是 DNS 系統的功能)﹐所以﹐這裡分別用 13 個‘ A ’記錄﹐也就是 Address 的意思﹐解釋 [A-M].ROOT-SERVER.NET. 這些主機各自的 IP 位址所在。
如果您了解 DNS 的查詢模式﹐您會知道 DNS 伺服器在查詢非自己管轄的 zone 的時候﹐首先會向 root 查詢下一級的 zone 在哪裡﹐然後逐級查詢下去。但問題是﹕當 named 剛啟動的時候﹐在 cache 裡面一片空白﹐它怎麼知道 root zone 的 servers 在哪裡呢﹖這不是一個矛盾嗎﹖所以﹐就必須靠這個檔案告訴 named 關於 root zone 的 servers 有哪些﹖以及在哪裡﹖ --- 明白了嗎﹖
因為這個檔是以靜態的方式維護的﹐很難保證這個檔的內容永遠都正確﹐如果 root zone 的記錄發生改變了怎麼辦(雖然這機會不大)﹖或許﹐您已經在檔案的開頭註解那裡得知﹐您可以在任何時候透過 ftp 或 gopher 取得這個檔案的最新版本。如果您還沒讀過那些註解﹐那就請帶著字典讀一下吧。如果您真的有需要更新這個 named.ca 檔﹐那可以按如下步驟進行﹕
ftp FTP.RS.INTERNIC.NET
anonymous
your_account@your.mail.server
cd domain
get named.root
bye
cp /var/named/named.ca /var/named/named.ca.bak
cat named.root > /var/named/named.ca
除了剛才的 named.ca 之外﹐第二個 zone 的記錄檔是 localhost.zone ﹐從 named.conf 中您應該知道它是 zone "localhost" 的記錄檔﹐它的內容如下﹕
$TTL 86400
$ORIGIN localhost.
@1D IN SOA @ root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
1D IN NS @
1D IN A 127.0.0.1
內容很簡單﹐但您是否真的了解每一行的設定意思呢﹖如果不清楚或不確定﹐那就讓我們一起探討探討吧。
首先﹐第一行是一個 TTL 設定﹐目前是定義出這個記錄檔裡面的各項記錄的預設 TTL 值為 86400 秒(剛好是一天)。您的記錄檔或許沒有這行﹐事實上沒什麼關係﹐您可以自己補上﹐否則﹐在啟動 named 的時候會碰到一些警告﹐無傷大雅的﹔但如果您的確在意那些警告﹐那就加上這行。您要知道﹐在記錄檔中宣告的所有資源記錄(RR - Resource Record)﹐都一定有一個 TTL 設定﹐如果沒有﹐則使用這裡預設的值。
第二行是一個 ORIGIN 設定﹐說明下面的記錄源出何處(這裡是源出 localhost. 的記錄)。請您加倍留意最後的一個小數點“ .”﹐少了它或多了它﹐記錄名稱完全不一樣﹗在 DNS 記錄中﹐我們稱這樣以小數點結尾的名稱為“ 全域名稱 ”即 FQDN ( Fully Qualified Domain Name ) 。如果缺少了這個點會怎樣呢﹖就會將所屬的 ORIGIN ( @ ) 附加在記錄名稱後面﹔而這 ORIGIN 就是上一個 $ORIGIN 宣告之後的名稱﹐如果在前面找不到 $ORIGIN 宣告﹐那就以 /etc/named.conf 中定義的 zone 名稱為基準。以目前的例子來說﹐如果沒有這個小數點的話﹐“localhost”會變成“localhost.localhost”﹔但如果有小數點的話“localhost.”就只能是“localhost.”。所以﹐這個小點“.”非常重要﹐在以後設定中一定要非常留神﹗﹗(這也初學者最常犯的錯誤之一)
然後﹐第三行﹐是一個 SOA 記錄的設定﹐在這裡我們看到一個特殊字符“ @ ”﹐它就是 ORIGIN 的意思﹐也就是剛纔所定義的 $ORIGIN localhost. 內容﹐您可以寫成 localhost. 也可以用 @ 來代替。假如這個檔前面沒有定義 $ORIGIN 的話﹐那這個 @ 的值就以 named.conf 裡的 zone 為準。既然這樣﹐當然是使用“@”啦﹐尤其對於像我這樣的懶惰鬼來說﹐巴不得少打一串字﹐同時還能避免因打字不準所造成的失誤﹐何樂不為﹖
在 @ 之後﹐是 TTL 的設定﹐這裡是 1D﹐也就是一天的意思﹐如果您喜歡﹐可以用 86400 (秒) 來設定﹐如果這裡的 TTL 沒有設定﹐則參考前面的 $TTL 值﹐如果前面沒有定義 $TTL﹐那就參考其後介紹的 minium ttl 設定。
Tips﹕事實上﹐您可以為每一個 RR 記錄設定其自己的 TTL ﹐只要將數字寫在第二個欄位﹐也就是‘IN’前面就可以了。
在 TTL 之後是一個 IN﹐定義出目前的記錄類型是屬於 internet class 的 (奇怪﹐目前的 DNS 還有其它 class 嗎﹖)。
在 IN 之後就是這行 RR 的記錄類別名稱﹐這裡是 SOA ﹐也就是“Start Of Authority”的意思﹐表示目前區域的授權記錄開始。每一個記錄檔只能有一個 SOA ﹐不得重複﹐而且必須是所負責的 zone 中第一個“記錄”。
緊接 SOA 後面﹐指定了這個區域的授權主機和管理者的信箱﹐這裡分別是“ @ ”和“ root ”﹐也就是 localhost. 主機和 root 信箱。這裡要注意的是﹕SOA 的主機名稱必須能夠在 DNS 系統中找到一個 A 記錄 (以後會提到)﹔另外﹐我們平時使用的信箱通常是“user@host”這樣的格式﹐但因為“@”在 DNS 記錄中是個保留字符(剛才已經提過)﹐所以在 SOA 中就用“.”來代替了“ @ ”。目前這個信箱是 root (並沒有主機位址)﹐也就是本機﹐您可以寫成 “root.localhost.”但不能寫成“root@localhost.”。
接下來的 SOA 設定﹐是被括在“( )”之間的 5 組數字﹐主要作為和 slave 伺服器同步 DNS 資料所使用的數據﹕
Serial﹕其格式通常會是“年月日 修改次序”(但也不一定如此﹐您自己能夠記得就行)。當 slave 要進行資料同步的時候﹐會比較這個號碼。如果發現在這裡的號碼比它那邊的數值“大”﹐就進行更新﹐否則忽略。不過設 serial 有一個地方您要留意﹕不能超過 10 位數字﹗
Refresh﹕這裡是是告訴 slave 要隔多久要進行資料同步(是否同步要看 Serial 的比較結果)。
Retry﹕如果 slave 在進行更新失敗後﹐要隔多久再進行重試。
Expire﹕這是記錄逾期時間﹕當 slave 一直未能成功與 master 取得聯絡﹐那到這裡就放棄 retry﹐同時這裡的資料也將標識為過期( expired )。
Minimum﹕這是最小預設 TTL 值﹐如果您在前面沒有用“$TTL”來定義﹐就會以此值為准。
以上的數字都是以秒為單位﹐但您也可以用 H(小時)﹑D(天)﹑W(星期)來做單位﹐如﹕3H 和 259200 是一樣的。但要值得一提的是﹕我在 RH6.2 版本中曾測試過使用 netconf 這工具來設定 DNS ﹐發現只能使用“秒”來設定。否則 netconf 會自動的把英文字母刪除掉﹐那就不是我所預期的設定值了。無論您用什麼單位來設定﹐都要遵守下面的規則﹕
expire >= refresh retry
expire >= 10 * retry
Tips﹕請注意﹕SOA 記錄中這對 “ ( ) ”符號之第一個 “ (”括號一定要和 SOA 寫在同一行﹐而不能用 Enter 斷行到下一行去(有時候您在書本的範例中看到這個符號排在下一行去了﹐那是因為版面的關係而已)﹐而且其左邊最好有一個空白鍵或 tab 建。而最後一個 “ )”括號也不能寫在註解符號 “ ﹔”的右邊。
設定 DNS 的 RR 記錄檔﹐其格式要求非常嚴格﹐我們絲毫不能掉以輕心。比方說﹕如果句子不是以空白鍵﹑Tab 鍵﹑ 或註解符號 ( ; )開頭﹐也不在 SOA 的 “ ( ) ”之內﹐ 則表示要定義一個“新記錄項 (Entry) ”﹔如果句子是以空白鍵或 tab 鍵開始的話﹐其設定被視為上一個“記錄項”的內容。所以﹐如果您要為“同一個記錄項”定義多個記錄設定﹐而不想重複打字﹐您倒可以偷懶﹕在接著它的後面幾行用空白或 Tab 來縮排就可以了。所以﹐最後這兩行還是關於 localhost. 的設定﹐因為上一個“資料項”為 “ @ ”﹐也就是 localhost. 。當然﹐您如不喜歡﹐這兩行句子也可以這樣寫﹕
;; 修改前﹕
1D IN NS @
1D IN A 127.0.0.1
;; 修改後﹕
@1D IN NS @
@1D IN A 127.0.0.1
;; 或﹕
localhost.1D IN NS localhost.
localhost.1D IN A 127.0.0.1
這兩行的意思是說﹕負責 localhost. 這個記錄的 name server ( NS ) 是 localhost. 這台機器﹔而 localhost. 的 IP Address ( A ) 是 127.0.0.1 。DNS 裡面的 A 記錄應該是最常見的記錄類型之一﹐如果在 IPv6 版本中﹐位址記錄名稱則改為 AAAA 。
Tips﹕關於更多的記錄名稱﹐請參閱“學習網路”中的“DNS 協定”。
最後﹐讓我們檢查剩下的 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.
前面的部份應該不用多解釋了(如果您還不清楚﹐那就必須重讀前面的文章)。最後一行我們看到一個“ PTR ”記錄﹐它是“Pointer”的意思。 PTR 通常用於反記錄當中﹐將 IP 指向主機名稱(剛好和 A 記錄相反)。您或許還不是很清楚這個句子為什麼是這樣設定的吧﹖或許您會這樣問﹕您不是說 PTR 是從 IP 反查詢主機名稱的嗎﹖為什麼這裡是 1 而不是 127.0.0.1 ?
哦﹐如果您有這樣的問題﹐那證明您對 DNS 的查詢模式還不是了解得很透徹﹐不過也不用緊張﹐在後面的實作例子中﹐您將獲得更進一步的感性認識。這裡﹐我暫時簡單解釋上面這行就是了﹕
我們知道 127.0.0.1 所對應的主機名稱就是 localhost ﹐因為這裡是反向查詢﹐所以 IP 順序是掉過來寫的﹐於是這個反查詢 IP 就是﹕“ 1.0.0.127.in-addr.arpa. ”﹐由於我們這裡的 ORIGIN ( @ ) 是“ 0.0.127.in-addr.arpa." ”﹐因為在記錄檔中﹐如果名稱不帶小數點﹐則被補上 $ORIGIN 或 zone 的名稱﹐所以這個 “ 1 ”就成了 1.0.0.127.in-addr.arpa. ”。同樣道理﹐後面的“ localhost. ”如果漏了最後的小點的話﹐則會成為“ localhost.0.0.127.in-addr.arpa. ”﹐這顯然是不對的。假如您喜歡﹐可以將這行句子修改成為下面的樣子﹕
﹔﹔修改前﹕
1 IN PTR localhost.
﹔﹔修改後﹕
1.0.0.127.in-addr.arpa. IN PTR localhost.
嗯~~ DNS 的設定看起來真的蠻傷腦筋的﹐或許您到這裡已經被搞得亂七八糟了。假如真的如此﹐我建議您先休息一下﹐然後回來重讀上面的內容﹐直到您能理解之後﹐才繼續下面的。否則﹐越往後﹐您的問題越像滾雪球那樣越來越大﹐這更浪費時間啦~~~ Okay? Take it easy ...
前面所看到的設定﹐事實上已經足夠讓您的 DNS 主機跑起來了﹗因為它能夠透過 root 查詢其他 DNS 的緣故﹐您無須在再加設任何設定﹐您就可以利用這台主機為大家提供 Internet 的 DNS 查詢服務。只是﹐這樣的 DNS 主機﹐我們稱之為 cache only name server 而已。如果您了解 DNS 的查詢流程﹐您應該知道 DNS 的 cache 作用和它的效益。所以﹐就算您不打算設定自己的 domain name 服務 ﹐我也建議您至少可以將 cache only NS 跑起來。
設定 NAMED
當您對 /etc/named.conf 檔案和 /var/named 目錄的設定有初步了解之後﹐下面﹐讓我們用一個實際例子來看看如何設定自己的 domain name 服務吧。我個人的習慣是先將網域和主機的資料整理出來﹐並列成一個表格﹕
Domain 名稱 IP 位址
rh71.siyongc.domain 192.168.100.23
acer.siyongc.domain 192.168.100.20
mdk.siyongc.domain 192.168.100.24
emilie.siyongc.domain 192.168.100.11
rh71.dmz.domain 10.0.1.131
lp64.dmz.domain 10.0.1.130
當所有的主機名稱和 IP 整理出來之後﹐再看看我們這裡需要設定哪些 domain ﹖ 從上面的資料中﹐我們不難發現有兩個正解 zone 和兩個反解 zone 需要設定﹐分別是﹕
區域名稱 記錄項名稱
siyongc.domain emilie﹑acer﹑rh71﹑mdk
dmz.domain lp64﹑rh71
100.168.192.in-addr.arpa 11﹑20﹑23﹑24
1.0.10.in-addr.arpa 130﹑131
因為這些 IP 和 domain 都在內部網路使用﹐所以我們省卻了註冊這關﹐同時也不必擔心授權的問題。但這些資訊也只能在內部網路使用﹐無論如何是不能設定在對外的 DNS 上面的 (為什麼﹖除了安全的考量之外﹐private IP 的使用本來就有這樣的規定﹐就算您真的對外散佈這些 DNS 資訊﹐在 IP 的路由上還是有問題﹐所以﹐內部的資訊﹐只能內部使用)。
一般來說﹐我會先設定“反查詢區域(revers zone)”﹐當然﹐這是個人習慣而已。所以﹐我首先在 /etc/named.conf 上面補上兩個反解 zone 的設定﹕
zone "100.168.192.in-addr.arpa" IN {// 定義反解區域名稱
type master;// 定義伺服器類型
file "192.168.100.rev";// 指定記錄檔名稱
};// 結束區域設定
zone "1.0.10.in-addr.arpa" IN {
type master;
file "10.0.1.rev";
};
注意哦﹕如果您要設定外部 DNS 的反解﹐那就先獲得 ISP 的授權才能自己設定﹔否則反解部份就不用自己擔心了﹐但一定要請 ISP 幫忙。
Tips﹕假如您是 hinet 的固定制 ADSL 用戶﹐可以到 hinet 的網站填寫表格﹐請他們幫忙設定反解﹕
http://hidomain.hinet.net/rever.html
其它 ISP 的用戶﹐請自行接洽 ISP 的客服部門。無論如何﹐如果沒有取得授權﹐那就不要自己設﹗
這裡﹐我們再一次碰到反解區域的識別標誌﹕“ .in-addr.arpa ”﹐同時﹐我們解釋一下上次關於本機反解還沒說明的地方﹕如果您了解 DNS 的授權和查詢過程(這章一開始的時候﹐我就已要求您一定要學習的)﹐您會知道反解查詢是先從 root 開始(正解也是一樣)﹐然後到 arpa ﹑到 in-addr ﹑到第一組 IP ﹑到第二組 IP ﹑...... 這樣查詢下來的。所以﹐在設定反區域的時候﹐您一定要將您的 net ID 部份反過來寫﹐例如﹕我的網路為 192.168.100.0/24﹐它的反查詢區域名則是﹕“100.168.192.in-addr.arpa”﹔假如我將 netmask 改為 16 bit ﹐即變成 192.168.0.0/16﹐它的反解區域名就會變成﹕“168.192.in-addr.arpa”。如果您還搞不懂如何區分 Net ID 和 Host ID﹐請立即去看一看“學習網路”中的“IP 基礎”。
同時﹐我將這些 zone 都設定為“主 DNS 伺服器”(即﹕master﹐也有人稱之為 primary dns )。
在每個 zone 的最後部份﹐我分別指定了它們各自的記錄檔名稱。它們都存放在 /var/named 這個目錄下面(也就是前面 options 指定的 directory 啦)。檔案的名稱隨您喜歡﹐不致做成混亂則可。
完成上面的設定之後﹐我們就可以到 /var/named 目錄去建立相應的記錄檔案了。說實在﹐在 named.conf 裡面如何定義檔案名稱沒一定的標準﹐只要您能正確指定哪個記錄檔給哪個 zone 使用﹐而且檔案名稱能夠一致就行。首先﹐根據第一個 zone 的 file 設定﹐我要建立一個 /var/named/192.168.100.rev 檔案﹐其內容如下﹕
$TTL 86400
@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
2001111601 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
@ IN NS rh71.siyongc.domain.
@ IN NS lp64.dmz.domain.
11 IN PTR emilie.siyongc.domain.
20 IN PTR acer.siyongc.domain.
23 IN PTR rh71.siyongc.domain.
24 IN PTR mdk.siyongc.domain.
而另外一個反解設定檔是 /var/named/10.0.1.rev ﹐我們依樣畫葫蘆就行了﹕
$TTL 86400
@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
2001111601 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
@ IN NS rh71.siyongc.domain.
@ IN NS lp64.dmz.domain.
130 IN PTR lp64.dmz.domain.
131 IN PTR rh71.dmz.domain.
就這樣﹐反解 DNS 就設定完成了﹗是否很簡單呢﹖如果您回答“ Yes ”的話﹐那就讓我們繼續正解區域的設定吧。同樣的﹐先在 /etc/named.conf 裡面加上兩個 zone﹕
zone "siyongc.domain" IN {
type master;
file "siyongc.domain";
};
zone "dmz.domain" IN {
type master;
file "dmz.domain";
};
完成後﹐再建立 /var/named/siyongc.domain 這個檔案﹕
$TTL 86400
$ORIGIN siyongc.domain.
@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
2001111601 28800 144003600000 86400 )
IN NS rh71.siyongc.domain.
IN NS lp64.dmz.domain.
IN MX 10 rh71.siyongc.domain.
IN MX 20 lp64.dmz.domain.
;; -- default address
@ IN A 192.168.100.23
;; -- linux servers --
rh71 IN A 192.168.100.23
IN MX 0 rh71.siyongc.domain.
IN MX 10 lp64.dmz.domain.
IN HINFO "Petium II 266""Redhat 7.1"
IN TXT "The internet gateway."
mdk IN A 192.168.100.24
IN MX 0 mdk.siyongc.domain.
IN MX 10 rh71.siyongc.domain.
IN HINFO "Petium II 266 dell""Mandrak 8.0"
;; -- Windows desktops --
acer IN A 192.168.100.20
IN MX 0 mdk.siyongc.domain.
IN HINFO "Petium III 800 acer""Windows ME"
emilie IN A 192.168.100.11
IN MX 0 mdk.siyongc.domain.
IN HINFO "Petium II 300""Windows 98"
;; -- cnames --
gw IN CNAME rh71
www IN CNAME rh71
ftp IN CNAME rh71
mail IN CNAME rh71
這裡﹐我們在正解記錄檔裡面看到幾個新的記錄類別﹐或許需要進一步講解一下的﹕
因為我這個區域的記錄分別由兩台主機負責﹐所以我這裡指定了兩個 NS 記錄。這裡﹐如果您確定上一個 ORIGIN 是正確的話﹐那也可以偷懶﹕正如我上面解釋過﹐如果名稱後面不是以“.”結尾的話﹐它所屬的 ORIGIN ( @ ) 就會自動的加在該記錄名稱後面﹔所以﹐您可以只寫“ rh71 ”而不帶小數點結尾﹐就會變成“rh71.siyongc.domain.”了﹐這個名稱實際就是我所要的。不過﹐我建議您在設定 NS 的時候還是儘量使用 FQDN 為好。
接下來的 ‘ MX ’ 記錄恐怕要花些時間解析﹕
MX 記錄
MX 是‘Mail eXchange’的意思﹐它指定了負責該記錄項(可以為 domain 也可以是 host )的郵件伺服器名稱(最好使用 FQDN )﹐而且該名稱必須是一個 A 記錄(不建議使用 CNAME )。
在郵件系統中﹐只要郵件伺服器雙方都知道對方的 IP 就可以進行郵件交換了。我們用 /etc/hosts 也可以做到名稱查詢的目的﹐但正如我們可以想像的﹕ineternet 有那麼多郵件伺服器﹐我們不可能一一為它們建立好 IP 對應。就算﹐我們可以這樣做﹐如果對方要更換郵件伺服器呢﹖要維護這樣一個對應殊非易事。既然﹐我們可以用 DNS 來查詢主機和 IP﹐為什麼不使用這麼便利的系統呢﹖這也是 DNS 系統的應用原因啊~~~ 但問題是﹐各區域的郵件伺服器名稱都不一樣﹐我們不可能知道對方的郵件伺服器主機名稱是什麼﹖就算知道﹐如果對方以後更換名稱呢﹖
您看﹐即使我們使用了 DNS 系統來進行郵件路由﹐也不是這麼簡單的事情。但是﹐使用 MX 記錄就大大發揮了 DNS 系統的功能了﹕我們只要為每一個區域建立起 MX 記錄﹐利用 DNS 查詢得到的郵件伺服器名稱(郵件路由查詢中﹐DNS 只是其中一種方法)﹐這樣﹐當郵件伺服器要和對方的區域進行郵件傳遞的時候﹐就可以通過 MX 記錄得到對方的郵件伺服器名稱﹐而不需預先知道要和哪台郵件主機溝通。在日後﹐就算對方更換名稱﹐將 DNS 記錄改改就可以﹐完全無需知會其它郵件主機﹔而外面的郵件伺服器也根本無需認知到這個改變。
這樣的設計﹐無疑是非常靈活便利的﹗另外﹐使用 MX 還有一個功能﹕您可以用多個 MX 同時指定好幾台郵件伺服器名稱﹐從而提供備援或平行處理服務。在我這個例子中﹐我就分別為‘siyongc.domain’這個區域指定了兩個 MX 記錄﹕‘rh71.siyongc.domain.’和‘lp64.dmz.domain.’。但您有沒有發現它們前面都有一個數字呢﹖這數字有什麼作用啊﹖
問得好﹗當外面的郵件伺服器通過 DNS 查詢到我們的郵件伺服器﹐如果發現超過一台主機負責郵件交換的話﹐數值越低的就越先被查詢。但有時候該主機沒有回應呢﹖那麼就由下一個數值的主機負責了。這樣有一個好處就是﹕就算第一台郵件伺服器出現故障﹐也不至於導致郵件交換功能癱瘓掉。我們通常會將各自的 MX 主機儘量分佈在不同的位置上(例如別的城市或國家的分公司主機)﹐假如萬一發生專線﹑甚至 ISP 的問題﹐我們還能將郵件轉往下一台 MX 主機。然而﹐在設計上﹐由於帳號和 client 端的設定因素﹐我們的郵件並非真的完全轉到下一個 MX 主機接收﹐而是先將郵件暫時佇列( queue ) 在那台機器上﹐當原來的 MX 主機恢復連線之後﹐郵件會自動的從佇列主機那邊送回來﹐這樣就能避免郵件丟失或被退信。
Tips﹕雖然﹐我們通常喜歡用‘10’﹑‘20’﹑‘30’.... 這樣的偏好值( preference ) 來分配 MX 記錄﹐但只要您喜歡﹐用‘1’﹑‘2’﹑‘3’... 這樣的順序一樣可以。不過﹐我建議您還是使用慣例啦。
現在很多大型郵件系統﹐都可以同時使用多台郵件主機來提供郵件交換服務﹐這時候您可以將 MX 的 preference 設為相同﹐然後利用 NIS 和 NFS 服務﹐將郵件同步到相同的帳號去。您已經在前面的章節裡面學會了 NIS 和 NFS﹐等日後學習郵件主機架設的時候﹐不妨玩玩看﹗
或許﹐您還發現我這裡為所有主機指定了 MX 記錄﹐有些直接指向自己(如 rh71﹑mdk 等)﹐而有些則指向別的機器(如 lp64﹑acer 等)。在 Linux 機器上面﹐各主機本身就具備郵件交換功能(除非您將之移除了)﹐而 Windows 則除非額外加裝﹐否則本身是沒有郵件交換功能的。這裡的設定是﹐從外面通過 DNS 查詢而寄往那些主機的郵件﹐都會轉到 MX 上面指定的郵件伺服器。這在實際的網路環境中很常見﹐尤其您接觸過“ mail hub ”這個概念。無論如何﹐我建議您應該幫負責 domain 的郵件伺服器本身設定一個偏好值最低的 MX 記錄指向自己(但這不是硬性必須如此的)。
Tips﹕事實上﹐我當初對 MX 的理解一直存在著錯誤﹐直到有一次在新聞組上和大家討論﹐才糾正過來。如果您對這個故事感興趣的話﹐或是想更進一步了解 MX 的實際運作原理﹐請參考 << Sendmail 與 MX >> 一文。
在過去﹐有些人並不知道如何正確的運用 MX 記錄﹐但相對的﹐他們會為 domain 名稱本身設定一個 A 記錄 (@ IN A 192.168.100.23 )。這樣的做法雖然不是正統的﹐但也行之有年了。而且﹐在許多網站的 URL 上﹐這樣的設定﹐也能讓您少輸入“ www. ”這四個鍵~~~
另外﹐在這個檔裡面﹐您或許還發現‘ TXT ’這樣的記錄類別﹐它是‘Text InFORMation’的意思﹐它實際上不牽涉任何設定﹐只記錄一些環境說明而已﹔這和‘ HINFO(Host InFORMation) ’差不多﹐但 HINFO 一定要有兩項記錄(分別用引號分開)﹐其中第一項是關於 CPU 的訊息﹐第二項則是作業系統。然而﹐TXT 和 HINFO 這些資訊僅能在一個信任的環境中提供﹐如果您架設的 DNS 是對外提供服務的﹐那麼﹐就不要設定這些資訊了。要不然﹐入侵者可非常感謝您哦﹐因為您幫他們省卻了很多主機系統的探測手續~~~ 所以﹐這裡僅做範例﹐供您參考而已。
而最後您所看到的‘CNAME’記錄又是怎樣的呢﹖CNAME 也是一個常見的記錄類別﹐它是一個別名記錄( Canonical Name )。當 DNS 系統在查詢 CNAME 左面的名稱的時候﹐都會轉向 CNAME 右面的名稱再進行查詢﹐一直追蹤到最後的 PTR 或 A 名稱﹐成功查詢後才會做出回應﹐否則失敗。例如﹐在正解查詢中﹐一個 IP 通常(當然也有例外)﹐只會對應一個 A 記錄﹐但我們可以使用 CNAME 在 A 名稱之上賦予該 IP 更多的名稱。也就是說﹕所有關於‘www.siyongc.domain’﹑‘ftp.siyongc.domain’﹑‘mail.siyongc.domain’這些名稱的查詢﹐實際上都會再查詢一次‘rh71.siyongc.domain.’這個記錄﹐直到找到它的 IP 位址為止。有些朋友或許會設定多層的 CNAME 查詢﹐例如﹕
C CNAME B
B CNAME A
這樣的話﹐會一層一層的逐級 CNAME 下去... 但是﹐這很浪費 DNS 資源﹗因為每一個 CNAME 都一定會產生另外一個查詢動作﹐如果層級越多﹐那就產生越多的重複查詢。所以﹐精明的 DNS 管理員﹐都會儘量的減少查詢次數的發生﹐他會將 CNAME 變成這樣子﹕
C CNAME A
B CNAME A
這樣就用心多了﹗
基本上﹐我們在正解設定上所使用到的記錄大概就前面所看到的。哦﹐對了~~ 還有另外一個 /var/named/dmz.domain 檔案也不要忘記了﹕
$TTL 86400
$ORIGIN dmz.domain.
@ IN SOA rh71.siyongc.domain. root.rh71.siyongc.domain. (
2001111601 28800 144003600000 86400 )
IN NS rh71.siyongc.domain.
IN NS lp64.dmz.domain.
IN MX 10 rh71.dmz.domain.
;; -- linux servers --
rh71 IN A 10.0.1.131
IN MX 0 rh71.dmz.domain.
IN HINFO "Petium II 266""Redhat 7.1"
IN TXT "The internet gateway."
lp64 IN A 10.0.1.130
IN MX 0 rh71.dmz.domain.
IN HINFO "Pentium 90""Linpus 6.4"
;; -- cnames --
gw IN CNAME lp64
www IN CNAME lp64
ftp IN CNAME lp64
mail IN CNAME lp64
您看﹗就這樣﹐我們的 DNS 就已經設定好了﹐包括反解和正解哦~~~
重新啟動 named
當您以為所有設定檔都設定好之後﹐最想做的事情莫過於要測試一下啦。但在測試之前﹐我們還要重新啟動 named ﹐否則﹐您查詢出來的還是舊資料。聰明的您或許已經知道使用如下命令來重新啟動DNS 服務了吧﹕
service named restart
然而﹐作為一個有經驗的 DNS 管理員﹐在重新啟動 named 服務之後﹐他一定會檢查一個檔案﹐就是 /var/log/messages 。因為﹐許多時候﹐當您執行 service named restart 之後您看到的都是綠色的 OK ﹐但事實上是否真的 OK 呢﹖誰也不敢保證﹐除非您在 log 檔中沒發現錯誤信息。所以﹐我也強烈建議您每次重新啟動 named 之後﹐一定一定要做如下動作﹕
vi /var/log/messages
然後按“G”鍵(大寫)跳到檔案末尾部份(事實上﹐您也可以用 tail 命令)。您或許會看到如下這樣的記錄﹕
Nov 16 14:54:10 rh71 named[2211]: starting BIND 9.1.0 -u named
Nov 16 14:54:10 rh71 named[2211]: using 1 CPU
Nov 16 14:54:10 rh71 named: named startup succeeded
Nov 16 14:54:10 rh71 named[2215]: loading configuration from '/etc/named.conf'
Nov 16 14:54:10 rh71 named[2215]: the default for the 'auth-nxdomain' option is now 'no'
Nov 16 14:54:10 rh71 named[2215]: no IPv6 interfaces found
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface lo, 127.0.0.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth0, 192.168.100.23#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth1, 10.0.1.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface eth2, 10.0.1.131#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet1, 172.16.233.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface vmnet8, 192.168.183.1#53
Nov 16 14:54:10 rh71 named[2215]: listening on IPv4 interface ppp0, 211.74.244.213#53
Nov 16 14:54:10 rh71 named[2215]: running
上面雖然有 'auth-nxdomain' 和 IPV6 的提示﹐但那是正常的(除非您有設定相關的功能)。如果沒有其它錯誤信息的話﹐那真要恭喜您了﹗
但有時候您或許會看到有其他錯誤信息的﹐例如﹕
Nov 16 15:01:49 rh71 named[2287]: loading configuration from '/etc/named.conf'
Nov 16 15:01:49 rh71 named[2287]: /etc/named.conf:41: parse error near zone
Nov 16 15:01:49 rh71 named[2287]: loading configuration: failure
Nov 16 15:01:49 rh71 named[2287]: exiting (due to fatal error)
這個錯誤信息明顯指出了是 /etc/named.conf 的問題﹐而且很可能在 41 行附近。根據我個人的經驗﹐這通常是您漏了 “ ﹔”符號的原因而已。
如果您碰到如下信息﹐那是沒有為所有 RR 記錄項設定 TTL 而已﹐您可以為每一個記錄項補上 TTL (在 IN 前面)﹐也可以在記錄檔的前面用 $TTL 來設定﹕
Nov 16 15:04:47 rh71 named[2395]: master.c:1172: unexpected error:
Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:3: no TTL specified.
THIS ZONE WILL NO LONGER WORK IN FUTURE VERSIONS. Add a TTL.
Nov 16 15:04:47 rh71 named[2395]: dns_master_load: siyongc:5: using
RFC 1035 TTL semantics
如果您碰到下面這樣的信息﹐那多是因為您打字錯誤的關係﹐輸入了 named 不認識的記錄類別名稱(例如漏了記錄名稱或打錯了)﹕
Nov 16 15:07:44 rh71 named[2422]: dns_master_load: siyongc:2: unknown RR
type 'siyongc.domain.'
Nov 16 15:07:44 rh71 named[2422]: dns_zone_load: zone siyongc.domain/IN: loading
master file siyongc: unknown class/type
如下的問題﹐那可能是您沒有定義 SOA 記錄﹐或設定有錯誤﹕
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could
not find NS and/or SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has
0 SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no
NS records
下面的問題可能是您的 SOA 記錄中多輸入了一組數字﹐或少輸入了一組數字﹐或數字格式有錯誤﹕
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: could not
find NS and/or SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: has
0 SOA records
Nov 16 15:14:33 rh71 named[2506]: dns_zone_load: zone siyongc.domain/IN: no
NS records
Nov 16 15:18:24 rh71 named[2562]: dns_rdata_fromtext: siyongc:4: near eol: unexpected
end of input
Nov 16 15:18:24 rh71 named[2562]: dns_zone_load: zone siyongc.domain/IN: loading
master file siyongc: unexpected end of input
Nov 16 15:19:34 rh71 named[2640]: dns_rdata_fromtext:
siyongc:4: near '14B400':
syntax error
Nov 16 15:19:34 rh71 named[2640]: dns_zone_load: zone
siyongc.domain/IN: loading
master file siyongc: syntax error
以下問題可能是 SOA 的 “ ( ) ”符號有問題﹐要麼是“ ( ” 給斷到下一行了﹐要麼是“ ) ”給註解掉了﹕
Nov 16 15:22:08 rh71 named[2669]: dns_rdata_fromtext: siyongc:3: near eol: unexpected
end of input
Nov 16 15:22:08 rh71 named[2669]: dns_zone_load: zone siyongc.domain/IN: loading
master file siyongc: unexpected end of input
Nov 16 15:22:52 rh71 named[2696]: dns_rdata_fromtext: siyongc:4:
near 'IN': extra input text
Nov 16 15:22:52 rh71 named[2696]: dns_zone_load: zone siyongc.domain/IN:
loading master file siyongc: extra input text
以下是您沒有設定 NS 記錄或 NS 記錄設定有錯誤﹕
Nov 16 15:25:30 rh71 named[2801]: dns_zone_load: zone siyongc.domain/IN: no NS records
下面的錯誤可能是您設定了一個記錄項超出了當前 ORIGIN 的範圍﹐例如 localhost. 或 siyongc. (也就是錯誤使用 FQDN )﹔或是錯誤的使用了 $ORIGIN 設定﹔或是在 named.conf 中有多個 zone 在分享同一份記錄檔﹕
Nov 16 15:31:20 rh71 named[2920]: dns_master_load: siyongc:16:
ignoring out-of-zone data
下面的錯誤﹐有可能您在設定多個 $ORIGIN 並同時嘗試設定多個 SOA 時出現的錯誤﹕
Nov 16 15:28:31 rh71 named[2855]: dns_master_load: siyongc:26:
not at top of zone
許多許多問題﹐事實上您都可以在 /var/log/messages 中找到﹐當您發現這些錯誤信息之後﹐看看是關於什麼記錄的﹐然後順藤摸瓜﹐留心一下檔案內容﹐就比較容易找到錯誤的原因了。
有時候﹐您想簡化您的 DNS 設定工作﹐您可以使用 netconf 來做。不過﹐根據我的經驗是﹕netconf 未必能夠完全幫您正確的設定起來。當您重新啟動 named 之後﹐別忘了看一下 /var/log/messages ﹐確定沒有錯誤發生。如果您使用工具來設定 DNS 而碰到問題﹐這就需要您有手工設定的能力了。
設定 DNS Client
DNS 系統是一個典型的 Client/Server 架構﹐前面介紹的動作僅是確保 DNS 的 server 成功啟動起來而已﹐如果您要測試它﹐還必須設定好 client 端才行。
不知道您會不會設定 linux 的 dns client 呢﹖如果忘記了要打屁屁了哦~~~ 事實上我們在第一章的“網路設定”那裡就設定過了﹐也就是修改 /etc/resolv.conf 這個檔案﹐將您剛設定好的 DNS 主機 IP 放在檔案的前排位置﹐如﹕
nameserver192.168.100.23
nameserver168.95.1.1
nameserver139.175.10.20
domainsiyongc.domain
searchsiyongc.domain dmz.domain test.com
假如您的 client 和 server 在同一台機器上﹐那可以將第一個 name server 設定為 0.0.0.0 或 127.0.0.1 。
要是您使用 Windows ﹐但不是透過 DHCP 來指定 DNS 的話﹐那您或許需要手工設定了﹕控制台 --> 網路 --> TCP/IP (-> 網路卡) --> 內容 --> DNS 組態 ﹕
請注意﹕如果您修改了這裡的設定﹐就算您的 Windows 是透過 DHCP 取得 IP 設定的話﹐也會以這裡的設定為準。如果您想使用 DHCP 的設定﹐那就選擇“關閉 DNS”吧。
測試 DNS
要測試我們的設定是否生效﹐我們可以使用的方法有很多﹐其中最簡單的莫過於 ping 命令了。直接 ping 一下您所預期的 dns 名稱就知道結果了。
不過﹐ping 畢竟很有限﹐例如﹕您不能查詢 MX 和 NS 等記錄。實作上﹐我們最最常使用的 DNS 查詢工具是 nslookup 命令。關於 nslookup ﹐在“學習網路”的“DNS 協定”文章中有很詳細的例子﹐這裡不再重複。如果我們在測試中失敗﹐例如 nslookup 回應說﹕
*** rh71.siyongc.domain can't find XXX.XXXX.XXXX:
Non-existent host/domain
這通常是反解記錄沒設定好的緣故﹐請確定 DNS 主機本身的反解有設定起來﹐而且可以被 DNS 追查得到。如果反解沒有授權下來﹐那就請上游 ISP 幫忙設定。不過﹐我發現這個錯誤信息似乎在新版的 nslookup 中不會出現﹐anyway ﹐請您自己留意吧。
有時候 nslookup 會停在某處一動也不動﹐其實它不是當掉了﹐而是在查詢沒結果之後等 time out 而已。您可以按 Ctrl C 終止查詢﹐再打 exit 跳出來。不過﹐如果您在按了 Ctrl C 之後接著再輸入一個無結果的查詢﹐那就好可能將 nslookup 當掉。這樣您可能要登錄進另外一個 terminal ﹐然後用 kill 將 PID 殺掉。同上﹐新版的 nslookup 沒有這個困繞﹐但如果按 Ctrl C 的話﹐則會直接跳離 nslookup 程式。
然而﹐nslookup 似乎在以後的版本中不再維護了﹐取而代之的﹐就是 dig 命令﹐所以﹐當您在 Redhat 7.1 上輸入 nslookup﹐您會看到如下這樣的信息﹕
Note: nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead. Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
這段文字不用解釋了吧﹖真的不知道說什麼就查字典吧~~ 這裡﹐我們不妨學習一下如何用 dig 來查詢和測試 DNS 服務。
基本上﹐dig 命令的語法如下﹕
dig [@server] domain [] [] [ ]
[-] [%comment]
看起來蠻複雜的﹐恐怕要 man dig 才知道怎麼使用。不過﹐我們平時只用它來查詢 dns 資料的話﹐要使用到的選項也不會太多啦﹐如果您會得在 nslookup 中設定 type=XXX 的話﹐那您也可以用 dig 來查詢不同的記錄類別資料。例如﹕
# dig siyongc.domain mx
; <<>> DiG 9.1.0 <<>> siyongc.domain mx
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8198
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;siyongc.domain. IN MX
;; ANSWER SECTION:
siyongc.domain. 86400 IN MX 20 lp64.dmz.domain.
siyongc.domain. 86400 IN MX 10 rh71.siyongc.domain.
;; AUTHORITY SECTION:
siyongc.domain. 86400 IN NS lp64.dmz.domain.
siyongc.domain. 86400 IN NS rh71.siyongc.domain.
;; ADDITIONAL SECTION:
rh71.siyongc.domain. 86400 IN A 192.168.100.23
lp64.dmz.domain. 86400 IN A 10.0.1.130
;; Query time: 8 msec
;; SERVER: 192.168.100.23#53(192.168.100.23)
;; WHEN: Fri Nov 16 21:13:18 2001
;; MSG SIZE rcvd: 138
上面是的命令是使用預設的 name server 來查詢 siyongc.domain 的 mx 記錄。當然﹐您也可以用 @ 來指定用某一台 name server 來查詢其它的資訊。例如﹐我要用 hinet 的 dns 來查詢負責 com.tw 的 NS 有哪些﹕
# dig @168.95.1.1 com.tw ns
; <<>> DiG 9.1.0 <<>> @168.95.1.1 com.tw ns
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33339
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4
;; QUESTION SECTION:
;com.tw. IN NS
;; ANSWER SECTION:
com.tw. 518400 IN NS b.twnic.net.tw.
com.tw. 518400 IN NS c.twnic.net.tw.
com.tw. 518400 IN NS a.twnic.net.tw.
;; ADDITIONAL SECTION:
b.twnic.net.tw. 159497 IN A 192.72.81.20