HOWTO:DNS

作者: Nicolai Langfeldt [email protected]

最新版本:v9.0, 2001-12-20

轉為 Wiki: Ping (ping 'at' pingyeh 'dot' net), 2003 年 11 月 27 日


如何成為一個稱職的小型 DNS 管理者.



1. 前言

關鍵字: DNS, bind, named, dialup, ppp, slip, Internet, domain, name, hosts, resolving

1.1. 版權宣告

(C)opyright 1995 Nicolai Langfeldt. Do not modify without amending copyright, distribute freely but retain copyright message. 沒有修訂版權者請勿修改,可自由散佈但必須保留版權訊息.

1.2. 感謝與求助

我要向無數次閱讀這份文件的草稿並提供許多有用建議的 Arnt Gulbrandsen 表達感謝之意. 我也要感謝那些將建議寄給我的人.

這份文件將永遠不會有完成的一天,請把你的問題以及成功的經驗寄給我, 這可以使它成為一份更好的說明文件.所以請把錢,評論以及/或是問題寄給 [email protected]如果你寄信給我並希望得到回答請表現基本的禮貌,確定回信地址是正確而且可以運作的. 還有,寫信給我前請先閱讀 FAQ 一節.

如果你想翻譯這篇 HOWTO 請與我聯絡,這樣我才知道我的文章被變成何種語言 :-).

1.3. 題獻辭

謹以這份說明文件獻給 Anne Line Norheim Langfeldt.雖然她可能永遠都不會閱讀這份文件,因為她不是這類型的女孩.

2. 如何成為一個大型的 DNS 管理者

文件以及工具

存在真正的文件.在線上的或是印好的.要跨出由小型 DNS 到大型 DNS 管理者的一步閱讀幾份這些文件是必要的. 印好的標準參考書是 DNS and BIND by C. Liu and P. Albitz from O'Reilly Associates, Sebastopol, CA, ISBN 0-937175-82-X. 我讀過,它很棒.在另一本 TCP/IP Network Administration, by Craig Hunt from O'Reilly..., ISBN 0-937175-82-X 有一節是關於 DNS 的.另一本對管理 DNS 很好的(或者是對任何這一類工作都很好)書則是 Zen and the Art of Motorcycle Maintenance, 作者 Robert M. Prisig 書號 ISBN 0688052304.

線上的資料你可以在這裡找到 http://www.dns.net/dnsrd/, http://www.isc.org/bind.html; 常見問題集,參考手冊(BOG; Bind Operations Guide)是協定的定義以及 DNS 研究的文獻. 這些文件我大部分沒有閱讀過,但是因此我不是個大型 DNS 管理者. 另一方面 Arnt Gulbrandsen 已經讀過 BOG 而且對此很熟稔 :-). 網路新聞討論群 comp.protocols.tcp-ip.domains 是有關 DNS 的討論群. 此外還有好幾份關於 DNS 的 RFCs,最重要的可能是這些:

RFC 2052

A. Gulbrandsen, P. Vixie, A DNS RR for specifying the location of services (DNS SRV), October 1996

RFC 1918

Y. Rekhter, R. Moskowitz, D. Karrenberg, G. de Groot, E. Lear, Address Allocation for Private Internets, 02/29/1996.

RFC 1912

D. Barr, Common DNS Operational and Configuration Errors, 02/28/1996.

RFC 1713

A. Romao, Tools for DNS debugging, 11/03/1994.

RFC 1712

C. Farrell, M. Schulze, S. Pleitner, D. Baldoni, DNS Encoding of Geographical Location, 11/01/1994.

RFC 1183

R. Ullmann, P. Mockapetris, L. Mamakos, C. Everhart, New DNS RR Definitions, 10/08/1990.

RFC 1035

P. Mockapetris, Domain names - implementation and specification, 11/01/1987.

RFC 1034

P. Mockapetris, Domain names - concepts and facilities, 11/01/1987.

RFC 1033

M. Lottor, Domain administrators operations guide, 11/01/1987.

RFC 1032

M. Stahl, Domain administrators guide, 11/01/1987.

RFC 974

C. Partridge, Mail routing and the domain system, 01/01/1986.

3. 簡介

這是什麼以及這不是什麼

首先,DNS 就是領域名稱系統(Domain Name System). 為機器命名的規則以及將這些名稱轉換為 IP 數字的軟體. 這份 HOWTO 文件說明了如何用 Linux 定義這樣的對應. 對應指的是這兩件事的聯繫,機器名稱,像 ftp.linux.org, 以及機器的 IP 數字,像是 199.249.150.4.

DNS,對新手(你;-)而言,是網路管理中比較晦暗不明的地方之一. 這份說明文件將會試著讓幾件事情能清楚一點.它描述如何設立一個簡單的 DNS 名稱伺服器. 開始先說明暫存專用(caching only)伺服器,然後是為一領域設立主要(primary)名稱伺服器. 至於更複雜的設定你可以參考這份文件的 FAQ 一節. 不用說你將得閱讀真正的文件. 我將會在 最後一章 回過頭來說明這裡所謂真正的文件包含有哪些.

在你可以開始進行這項工作之前你應該要先配置好你的機器以便可以從遠端簽入它以及由它對其它機器作遠端簽入, 並且使所有各種對網路的連線都能成功地進行,尤其你應該要能夠對 127.0.0.1 進行遠端簽入並且進入你自己的這台機器(現在就試試!). 同時你也需要一份運作良好的 /etc/host.conf, /etc/resolv.conf 以及 /etc/hosts 檔案作為開始. 因為我將不會在這裡解釋它們的功能.如果你還沒有完成所有這些設定並使其運作那麼 the networking/NET-2 HOWTO 會解釋如何設立它們.閱讀之.

如果你使用 SLIP 或者是 PPP 那麼你得要能讓它運作.若是它還不能運作的話閱讀 [PPP-HOWTO.html PPP HOWTO].

當我說‘你的機器’時我的意思是你正要嘗試在上面設立 DNS 的那台機器. 不是任何可能在你網路環境裡的其它機器.

我假設你並不是處於任何會阻礙名稱查詢的防火牆後面.如果你是那麼你將會需要特別的設定, 參見 FAQ 一節.

在 Unix 上的名稱服務是藉由一支稱為 named 的程式來執行的. 這是屬於 bind 套件的一部份,這個套件是由 Paul Vixie 為網際網路軟體集團(Internet Software Consortium)所協調發展的. 大部分的 Linux 發行套件都包含有 named,而且通常安裝於 /usr/sbin/named. 如果你的系統有個 named 那麼你大概可以直接使用它;如果沒有的話那麼你可以從某個 Linux ftp 站取回一份二進位執行檔,或是從 ftp.isc.org:/isc/bind/src/cur/ 目錄裡取得最新最棒的原始程式碼. 本文件是說明 bind version 4 的.如果你安裝 version 8 你要自己想辦法.稍後有一節可能會對你有些幫助.

DNS 是個以整個網路為範圍的(net-wide)資料庫.要小心你放進裡面的資料. 如果你放些廢物進去,你,以及其它人都將會從中取出些廢物. 保持你 DNS 的整齊一致那麼你將能從中取得良好的服務. 學習去使用它,管理它,追查它的錯誤那麼你將會是另一個保持網路免於因為管理不善而效率低落的好管理者.

在這份文件裡我斷然地敘述幾件並不完全是真實的事情(雖然它們至少有一半是真的). 這全都是為了簡化.如果你相信我所說的那麼這些大概就能運作.

要訣: 如果你已經擁有我要你去改變的檔案,那麼所有這些檔案都要先做備份, 這樣一來如果經歷這些改變之後沒有東西會動的話你可以回復到你舊的,可以運作的情形.

4. 暫存專用名稱伺服器

DNS 配置的首種嘗試,對撥接使用者非常有用.

一台暫存專用名稱伺服器將會為名稱查詢找出答案並且在下一次你需要那個名稱的時候記得答案.

首先你需要一個稱為 /etc/named.boot 的檔案.當 named 啟動時會讀取這個檔案. 目前它應該單純地包含:

非常重要: 在這文件的某些版本中這個檔案的這份列表會在第一個非空白字元前包含一些空格或 tab 鍵. 這些不應該出現在檔案中.如果你從這份 HOWTO 剪貼下來,記得刪除任何前面的空白.

`directory' 這一行告訴 named 到哪裡去找尋檔案.所有其後命名的檔案都將是相對於此目錄的. 根據 Linux 檔案系統標準正確的目錄應該是在 /var/named. 因此 pz 是位於 /var/named 之下的,也就是,/var/named/pz.

稱為 /var/named/root.cache 的這個檔案是在此命名的. 這個 /var/named/root.cache 應該包含:

記住我說過要去掉空白字元!

這個檔案描述了在這個世界上的根名稱伺服器.這會隨時間而改變並且必須加以維護. 如何能保持它隨時更新請參見 維護篇在 named 的線上使用手冊裡有這個檔案的描述,但是這,以我看來,最適合那些已經了解 named 的人們.

在 named.boot 裡的下一行是 primary 這一行. 我將會在稍後的章節裡解釋它的用法,目前只要把它設為在 pz 子目錄下一個稱為 127.0.0 的檔案:

接下來,你需要一份看起來像這樣的 /etc/resolv.conf 檔案:

`search' 這一行指出對於任何你想連往的主機名稱應該搜尋的領域. `nameserver' 這一行指出你的機器可以在哪個位址上找到一台名稱伺服器, 在這個例子中是你自己的這台機器,因為你在它上面執行 named. 如果你想列出好幾個名稱伺服器把它們都放在一行 `nameserver' 裡,用空格隔開. (注意: named 從不讀取這個檔案,而是使用 named 的名稱解答器會讀取.)

來說明一下這個檔案有什麼作用: 如果某個客戶端嘗試要找尋 foo 的話, 那麼首先嘗試的是 foo.subdomain.your-domain.edu 這個名稱, 然後接下來是 foo.your-fomain.edu 這個名稱,最後則是 foo 這個名稱. 如果有某個客戶端嘗試要找尋 sunsite.unc.edu 的話, 那首先嘗試的是 sunsite.unc.edu.subdomain.your-domain.edu 這個名稱(沒錯,它真笨! 不過它就是這麼做), 然後接下來是 sunsite.unc.edu.your-domain.edu 這個名稱,最後則會是 sunsite.unc.edu 這個名稱. 你可能不會想放太多領域到 search 該行裡去,搜尋它們會多花時間.

這個範例假設你屬於 subdomain.your-domain.edu 這個領域, 那麼你的機器,可能會稱為 your-machine.subdomain.your-domain.edu. 在 search 這行裡不應該包含你的 TLD (頂層領域 Top Level Domain,在這個例子中是 edu 這個領域). 如果你經常需要連線到在另外一個領域裡的主機你麼你可以把該領域像這樣地加進 search 這行裡:

依此類推.很明顯的是你得放入真實的領域名稱來取代這些名稱.請注意在領域名稱的最後面並沒有句號 '.'.

接下來,根據你 libc 版本的不同需要修正 /etc/nsswitch.conf 或者是 /etc/host.conf 檔案.

/etc/nsswitch.conf

這是一個很長的檔案,它指出到何處去取得各種不同的資料型態,從什麼檔案或是資料庫取得. 它的頂端經常會包含一些有用的註解.找出以 `hosts:' 作為開頭的那一行,它應該是這樣:

如果檔案裡沒有以 `hosts:' 作為開頭的行那麼把上面這一行加上去. 它是說程式應該先在 /etc/hosts 檔案裡找尋,然後根據 resolv.conf 詢問 DNS.

/etc/host.conf

它可能包含有數行,其中應該有一行以 order 作為開始而且它看起來會像這樣:

如果檔案裡沒有 `order' 這一行的話那麼你應該貼一份上去. 它告訴主機名稱解析函式先在 /etc/hosts 裡找尋,然後查問名稱伺服器 (在 resolv.conf 裡你說在 127.0.0.1 這個地方). 在大部分 Linux 發行套件中最後這兩個檔案的文件在 resolv(8) 的線上使用手冊中(執行 `man 8 resolv' 即可). 這份線上用手冊我覺得可看,而且每個人,特別是 DNS 管理者,都應該要閱讀它. 現在就做,如果你對你自己說我稍後將會去做,你將永遠不會去接近它.

4.1. 起始 named

這些全部完成後就可以起始 named 了.如果你使用撥接連線的話那麼請先連上網路. 鍵入 `ndc start' 並且按下 RETURN 鍵,沒有選項. 如果它不行的話那麼試著使用 `/usr/sbin/ndc start' 來取代. 再不行的話請參考 FAQ 一節. 現在你可以測試你的設定.當你在起始 named 的時候如果你觀察一下 (使用 tail -f /var/adm/messages 指令)系統記錄訊息檔案 (通常是稱為 /var/adm/messages 的檔案,但也可能在 /var/log 下,或是叫 syslog 的檔案) 那麼你應該會看見像樣的一些東西:

如果有任何關於錯誤的訊息那麼就是有個錯誤發生, named 將會指名有錯誤的檔案(我想是 named.boot 以及 root.cache 其中之一:-). 殺掉 named 程序並回頭檢查那些檔案.

現在可以用 nslookup 來檢查一下你的工作:

如果這是你所得到的回應那麼它已經能夠運作.我們希望是這樣.得到任何其它回應都請回頭檢查每一件事. 每一次你改變 named.boot 檔案之後你都得使用 ndc restart 這個指令重新起始 named 程式.

現在你可以輸入查詢.嘗試找尋某些靠近你的機器.pat.uio.no 離我不遠,在 Oslo 的大學裡:

現在 nslookup 要求你的 named 找尋 pat.uio.no 這台機器. 然後它(named)聯繫在你 root.cache 檔案裡所指名的名稱伺服機器其中一台, 並且從那裡查問它該如何繼續下去.在你取得結果之前可能得花費一點時間, 因為它搜尋你在 /etc/resolv.conf 裡指名的所有領域.

如果你再試一次的話那麼你將會得到:

注意這回我們所得到的 `Non-authoritative answer:' 這一行. 這代表 named 此次並未到網路外去查問,取而代之的是在它的暫存區裡找尋並且在那裡找到答案. 但是暫存的資訊可能會過時.所以它藉由 `Non-authorative answer:' 來知會你有這個(很輕微的)危險性存在. 當 nslookup 說這是你第二次查問某台主機時,這是 named 能暫存該項資訊並且正常運作的一個訊息. 你可以使用 `exit' 指令離開 nslookup 程式.

如果你是個撥接(ppp, slip) 使用者請閱讀 撥接連線專節,裡面有一些給你的建議.

現在你知道如何設立一個能夠暫存的 named 系統.來杯啤酒,牛奶,或是任何你喜歡的東西來慶祝吧.

5. 一個簡單的領域

如何建立你自己的領域

5.1. 先來一點純理論

在我們真的開始進行這一節以前我將會提供你一些關於 DNS 如何運作的理論. 而你應該閱讀它因為這對你有益.如果你不‘想要’那麼至少你也得很快地略讀一下. 當你看到應該放進 named.boot 檔案裡去的內容時再停止這種略讀方式.

DNS 是一個階層式的系統.其頂端寫作 .' 而其發音為 root' . 在 . 之下有幾個頂層領域(TLDs),最知名的是 ORG, COM, EDU 以及 NET 這幾個,但是還有更多.

在尋找一台機器名稱時查詢會以遞迴方法從頂端開始. 當你想要找出 prep.ai.mit.edu 的位址時你的名稱伺服器必須找到負責 edu 的一台名稱伺服器. 這個問題它會去查問 root.cache 檔案,而 . 伺服器會給它一份 edu 伺服器列表.

開始查問某台根伺服器.

設定查詢型態為 NS (名稱伺服器記錄 name server records).

查問關於 edu. 的資料.

結尾的 . 在這裡非常重要,它告訴該伺服器我們所查問的 edu 是在 . 之下的那一個, 這稍能縮小搜尋的範圍.

這告訴我們 *.root-servers.net 服務 edu. 領域,所以我們可以藉此繼續查問 c 伺服器. 現在我們想要知道是誰負責下一層 mit.edu. 的領域名稱:

steawb, w20ns 以及 bitsy 負責 mit 領域,選擇其中一個並且查詢 ai.mit.edu:

主機名稱不分大小寫,但是我使用滑鼠來剪貼所以這些資料是螢幕的拷貝.

所以 weaties.ai.mit.edu 是 ai.mit.edu 的一台名稱伺服器:

現在我改變查詢的型態,我們已經找到該名稱伺服器所以現在我們將要詢問 wheaties 關於 prep.ai.mit.edu 它所知道的任何事情.

所以我們從 . 開始連續找出在領域名稱裡的下一層名稱伺服器. 如果你使用你自己的 DNS 伺服器而不是所有這些個其它的伺服器, 你的 named 當然會暫存所有這些在為你尋找這個答案時所找到的資訊, 而且在一段時間內它不必再次查問.

一個比較起來很少被論及,但是同樣重要的是 in-addr.arpa 領域.它也像‘正常的’領域一樣是巢狀的. in-addr.arpa 讓我們可以在擁有主機位址的時候得知該主機的名稱. 在這裡有件重要的事情要注意的是在 in-addr.arpa 這個領域中 ip 數字是以反向順序書寫的. 如果你有某台機器的位址: 192.128.52.43 那麼 named 會以類似 prep.ai.mit.edu 這個範例的方式來處理: 找出 arpa. 的伺服器,找出 in-addr.arpa. 的伺服器,然後再找出 192.in-addr.arpa. 的伺服器, 找出 128.192.in-addr.arpa. 的伺服器,接著找出 52.128.192.in-addr.arpa. 的伺服器, 最後再找出所需之 43.52.128.192.in-addr.arpa. 的記錄.聰明乎? (說‘是的’). 頭兩年這反向的數字也引起過一些困擾.

其實我是騙你的.DNS 並非完完全全地像我告訴你的這樣運作.但是這已經夠接近的了.

5.2. 我們自己的領域

現在來定義我們自己的領域.我們將會創造出 linux.bogus 這個領域並且定義其中的機器. 我使用一個完全是虛擬出來的領域名稱以便確定我們不會擾亂到網路上的其它地方.

我們早就已經以 named.boot 裡的這一行開始了這個部份的設定:

請注意在這個檔案裡的領域名稱結尾並沒有加上 `.' 符號. 第一行把定義 0.0.127.in-addr.arpa 的檔案命名為 pz/127.0.0. 我們早已經建立了這個檔案,它是這樣的:

請注意在這個檔案裡所有的完整領域名稱結尾的 `.' 符號,這與上面提到的 named.boot 檔案形成對比. 有些人喜歡以 $ORIGIN 指令啟始每個區域檔案,但這是不必要的. 一個區域檔案的基點(就是其所屬的 DNS 階層架構位置)是在 named.boot 檔案的‘領域’行裡指定的, 在這個例子裡是 0.0.127.in-addr.arpa.

這個‘區域檔案’中包含三種‘資源記錄’(resource records, RRs): 一個是 SOA 資源記錄.一個是 NS 資源記錄以及一個 PTR 記錄. SOA 是授權起始(Start Of Authority)的縮寫.`@' 是個意思為基點的特殊標記, 而因為這個檔案的‘領域’行說是 0.0.127.in-addr.arpa 所以第一行實際上是指

NS 是名稱伺服器資源記錄,它告訴 DNS 什麼機器是這個領域 0.0.127.in-addr.arpa 的名稱伺服器,也就是 ns.linux.bogus. 而最後的 PTR 記錄說 1 (等於是 1.0.0.127.IN-ADDR.ARPA, 也就是 127.0.0.1)的名稱是 localhost.

SOA 這個記錄是所有區域檔案的序文,而且在每一個區域檔案裡都應該有這唯一的一個,最開頭的記錄. 它描述該區域,它從何而來(一台稱為 linux.bogus 的機器),誰負責其內容([email protected]), 這個區域檔案是什麼版本(serial: 1),以及其它必須做的,有關暫存與次要名稱伺服器的事. 剩下的欄位如 refresh, retry, expire 以及 minimum 你可以使用這份文件裡所用的數字而且應該不會出問題.

現在重新起始你的 named(使用 ndc restart 指令)並使用 nslookup 來檢驗我們做了什麼:

所以它管理從 127.0.0.1 得到 localhost 的過程,很好. 現在開始我們的主要任務,linux.bogus 這個領域, 在 named.boot 裡 插入新的一行 primary 指令:

注意,在 named.boot 檔案裡領域名稱的結尾還是沒有 '.' 符號.

在這個 linux.bogus 區域檔案裡我們將會放入一些完全虛擬的資料:

關於 SOA 記錄有兩件事需要注意.首先 ns.linux.bogus 必須 是一台具有 A 記錄的真正機器. 在 SOA 記錄中用 CNAME 記錄為名稱的機器是不合法的.它的名字不一定要是 ns,它可以是任何合法的主機名稱. 再來,hostmaster.linux.bogus 應該被視為 [email protected],這應該是一個郵件位址或別名, 是維護這個 DNS 的人經常讀信的位址.任何關於此領域的信件會被送到這個位址. 它的名字不一定要是 hostmaster,它可以是任何合法的電子郵件位址,然而這個位址 `hostmaster' 應該能工作正常.

在這個檔案裡有一種新的資源記錄型態,即 MX 型態,或是郵件交換者資源記錄(Mail eXchanger RR). 這種資源記錄型態告訴郵遞系統地址 [email protected] 的郵件要寄送到哪裡, 換句話說也就是應該寄送到 mail.linux.bogus 或是 mail.friend.bogus. 在每個機器名稱前面的數字是 MX 資源記錄的優先權,數字比較低 (10) 的資源記錄是郵件主要應該寄往的機器. 如果失敗可以把它寄往數字比較高的機器,一台次要的郵件處理者,也就是在這裡具有優先權 20 的 mail.friend.bogus.

用 ndc restart 重新起始 named.以 nslookup 檢驗結果:

小心地檢驗你將會發現一個錯誤.這一行

全都錯了.它應該是

我故意犯了個錯誤所以你可以藉此學習:-) 仔細看看該區域檔案我們會發現這一行

遺漏了一個句點.或是說多了個 `linux.bogus'. 在區域檔案裡如果一個機器名稱不是以句點結尾那麼會在其結尾加入基點.所以不論是

或是

都是正確的.我比較喜歡後面這種形式,它需要的打字比較少. 在一個區域檔案裡領域名稱應該要不就是寫出來並以 `.' 結尾或者就是一點都不要包含進去, 而在這種情況下其領域預設為基點.其它人也許喜歡採用另一種方式.

我必須強調的是在 named.boot 檔案裡領域名稱後面不應該有 `.' 的存在. 你不知道有多少次因為多了或少了一個 `.' 而搞砸了並且對許多人造成困擾.

所以在加入我強調的重點後得到一份新的區域檔案,其中還包含一些額外的資訊:

你也許會想要移動前面三個 A 記錄以便讓它們靠近其它的相關記錄,而不是像這樣放在最前端.

這裡有幾個新的資源記錄: 主機資訊(HINFO: Host INFOrmation) 包括兩個部份, 使用引號涵括每個部份是個好習慣.第一個部份是機器上的硬體或是中央處理單元, 而第二個部份是機器上的軟體或是作業系統.ns 有一顆 Pentium CPU 並且執行 Linux 1.2 系統. TXT 記錄是個隨意的文字記錄,你可以用它來記錄任何事情. 正式名稱(CNAME: Canonical NAME)可以用來給每台機器數個名稱. 所以 richard 以及 www 都是 ns 的一個別名. 很重要的一點是 A, MX, CNAME, 以及 SOA 記錄永遠不該參照 CNAME 記錄設定的別名, 它們只應該參照 A 記錄所設定的名稱,所以像這樣的記錄是錯的

不過這樣是對的

還有一點也很重要的是注意正式名稱所設定的對電子郵遞位址而言不是合法主機名稱: [email protected] 以上面的設定而言是一個不合法的電子郵遞位址. 即使它在你的系統上可以運作,可以預料的是很少有電子郵件管理者會去實行這項規則. 避免這個問題的方法是使用 A 記錄(或者也可能是一些其它的,像是 MX 記錄)來取代之:

Paul Vixie, 主要的 named 專家,建議不要使用 CNAME 這個設定. 所以應該考慮不要很認真地去使用它.

藉由執行 ndc reload 載入新的資料庫,這會使 named 再一次讀取其檔案.

這意指應該列出所有的記錄

很好.讓我們檢查它對於單獨的 www 會說什麼:

...換句話說,www.linux.bogus 真正的名稱是 ns.linux.bogus.

而 ns.linux.bogus 擁有 127.0.0.2 這個位址.看起來也很好.

5.3. 繼續深入

當然,這個領域是高度虛擬的,裡面所有的位址也都是,而這或許會讓你有些混淆. 真實領域的一個真實例子請見下一節.

6. 真實領域的例子

這裡我們列出一些真正的區域檔案

使用者建議我加上一個可以運作的真實例子,因為我對真正可運作的領域及虛擬範例之間差別解釋的不夠清楚.

關於這個例子有件事必須聲明: 千萬不要把它放到你的名稱伺服器上! 把它當作參考資料來閱讀就好.如果你想做實驗,用上面虛擬的例子. 我經過 LAND-5 的 David Bullock 的同意才使用這個例子.這些檔案的日期是 1996 年九月二十日, 因此如果你現在查詢 LAND-5 的名稱伺服器可能會發現有所不同. 還有,請記住,刪去前面的空白 :-)

6.1. /etc/named.boot (或 /var/named/named.boot)

我們發現需要兩行 primary 的反向區域: 一個是 127.0.0,另一個是 LAND-5 的子網路 206.6.177. 還有一行給 land-5.com 的正向區域.還有一點要注意的是不像我在這篇文章裡將檔案放在 pz 目錄裡, 他將它們放到叫做 zone 的目錄.

6.2. /var/named/root.cache

記住這個檔案是動態的,這邊列出來的是舊的.你最好自己用 dig 產生一個新的.

6.3. /var/named/zone/127.0.0

不過是基本的,不能省略的 SOA 記錄,以及將 127.0.0.1 指向 localhost 的記錄. 兩者都是必須的.不應有其它的東西在此檔案中.這個檔案可能永遠不必更新,除非你的名稱伺服器或管理人地址改變.

6.4. /var/named/zone/land-5.com

在這裡我們看到這個必須的 SOA 記錄,必要的 NS 記錄. 我們可以看到它有一個次要的名稱伺服器於 ns2.psi.net. 這也應該是必要的,總是保有一個次要的伺服器做為備份. 我們還看到做為 LAND-5 負責所有不同服務的主機,它以許多的 CNAME 記錄做到這點 (另一個做法是用 A 記錄).

就像你從 SOA 記錄看到的一樣,區域檔案以 land-5.com 開始,管理人是 [email protected]序號(serial)以 yyyymmdd 的格式加上當天的號碼; 它可能是 1996 年九月二十號那天的第六個版本的區域檔案. 請記住序號必須單調地遞增,這裡它只用一位數字表示當天的號碼, 因此在編輯九次之後他必須等到明天才能再編輯這個檔案.[譯註] 因此應該考慮用兩位數字.

[譯註]

讀者可能會奇怪為什麼不能用 1996092010 ? 這個數字也是遞增的,所以當然可以. 但到了明天第一次編檔案時該用什麼呢? 如果用 199609211,那麼這個數字就比 1996092010 要小了. 這樣會有麻煩.因此作者建議應用兩位數字,如 1996092006.

另一件值得注意的事所有的工作站都沒有個別的名稱,而是用一開頭加上最後兩位的 IP 數字. 用這樣的慣例可以大量地簡化維護工作,但可能有點不方便,而且,事實上可能是你的客戶不滿的來源.

6.5. /var/named/zone/206.6.177

我將在後面說明這個檔案.

反向區域似乎是整個設定中最讓人頭痛的部份.它是在你有機器的 IP 數字時查詢機器名稱用的. 例如: 你有一部 irc 伺服器接受 irc 客戶端的連線. 但你是挪威的伺服器因此你只希望接受來自挪威及其它斯堪地那維亞國家的連線. 當你接到來自客戶端的連線時 C 程式庫能夠告訴你連線機器的 IP 位址,因為客戶端的 IP 數字是包含在傳入的網路封包中的. 然後你可以呼叫一函式 gethostbyaddr 以給定的 IP 查詢機器名稱. gethostbyaddr 函式會向 DNS 詢問,DNS 就會出去查詢這台機器名稱. 假設客戶端來自 ws_177200.land-5.com,C 程式庫提供給 irc 伺服器的 IP 是 206.6.177.200. 為找出機器的名稱我們要查詢 200.177.6.206.in-addr.arpa.DNS 伺服器首先找到負責 arpa. 的伺服器. 然後找到 in-addr.arpa. 的伺服器,再來是反過來的 206,然後是 6, 最後找到在 LAND-5 負責 177.6.206.in-addr.arpa 區域的伺服器. 由此我們得到 200.177.6.206.in-addr.arpa 的答案是 'PTR ws_177200.land-5.com' 記錄, 意指擁有 IP 206.6.177.200 的名稱是 ws_177200.land-5.com. 不過就像在解釋 prep.ai.mit.edu 如何查詢時所說,這過程稍微有點不對.

回到 irc 伺服器的例子.irc 伺服器只接再來自斯堪地那維亞國家的連線,也就是, *.no, *.se, *.dk.ws_177200.land-5.com 這個名字顯然並不符合任何這些. 因此伺服器會拒絕連線.如果沒有經由 in-addr.arpa 區域到 206.2.177.200 的反向對應, 伺服器將無法查到機器名稱而將會拿 206.2.177.200 來和 *.no, *.se 及 *.dk 比較,當然找不到符合的.

有些人會告訴你反向對應查詢只對伺服器重要,或是一點也不重要. 當然不是: 許多 ftp, news, irc 甚至 http 伺服器將不接受無法查到名稱的機器連線. 因此事實上機器的反向名稱對應是必須的.

7. 維護工作

維持它的運作.

維持它們的繼續執行之外,對於 named 你還有個維護的任務得要做. 那就是維持 root.cache 檔案的更新.最簡單的方法是使用 dig 程式, 首先不加任何參數執行 dig 程式,你將會取得從你自己伺服器得到的 root.cache. 然後以 dig @rootserver . ns 查問所列出的根伺服器其中之一. 你將會注意到這份輸出看起來非常地像一個 root.cache 檔案,除了一堆額外的數字以外.這些數字不會有什麼妨礙. 把它存放到檔案裡(dig @e.root-servers.net . ns root.cache.new)並且用它來取代原本舊的 root.cache 檔案.

取代了原先的檔案之後要記得重新啟動 named 程式.

Al Longyear 寄給我這個指令稿,它可以自動執行來更新 named.cache,為它安裝個 crontab 項目然後忘了它. 這個指令稿假設你的電子郵件可以運作而且 `hostmaster' 這個郵件別名有定義.你應該修訂它以便符合你的設定.

有些人可能用 ftp 從 Internic 得到 root.cache 檔案. 請不要用 ftp 來更新 root.cache,上面提到的方法更為便利.

8. Bind version 8

Bind version 8 是最新的 bind 技術.我還沒有嘗試使用,但 David E. Smith [email protected] 有.他寫了這小節的其餘部份.

沒有太多的不同.除了使用 named.conf 而不是 named.boot, 其餘都相同. 而且 bind 8 包含了一個 perl 指令稿來將舊格式的檔案轉換成新的. 例如一份暫存專用名稱伺服器的 named.boot (舊格式):

在指令列下,於 bind8/src/bin/named 目錄中鍵入:

這會產生 named.conf:

它將 named.boot 中的每樣東西都轉換過來,然而它並未加入所有 bind 8 所允許的新強化及配置選項. 這裡有份較完整的 named.conf 做同樣的事,但是效率更好一點.

bind8/src/bin/named/test 裡有這個範例,以及領域檔案的拷貝,許多人可以直接拿來修改使用.

領域檔案及 root.hint (root.cache) 完全相同,更新它們的指令也是.

9. 撥接連線的自動設定

這一節解釋我如何設定以便讓每個過程自動化. 我的方法可能一點都不適合你,但是你可能從我所作的一些事情裡得到一些點子. 同時,我使用 PPP 撥接,然而有許多人使用 slip 或是 cslip 連線方式, 所以你的設定裡幾乎每個地方都可能跟我的不同. 但是 slip 使用的 dip 程式應該能夠完成我所作的許多事情.

一般來說,當我沒有連上網路時我的 resolv.conf 檔案單純地包含這一行

這確保我不必等待主機名稱解析函式庫去嘗試聯繫某台不可能幫助我的名稱伺服器. 但是當我連上線的時候我想要起始我的 named 並且擁有一個看起來像前面所描述的 resolv.conf 檔案. 我藉由保持兩份 resolv.conf 的‘樣板’檔案,resolv.conf.local 以及 resolv.conf.connected 來解決問題. 後面這一個看起來像前面所描述過的 resolv.conf 檔案.

要自動化連線到網路的過程我執行一個稱為 `ppp-on' 的指令稿:

pppd 有個稱為 options 的檔案,它告訴 pppd 如何取得連線的一些特殊事項. 一旦我的 ppp 連線完成後 pppd 起始一個稱為 ip-up 的指令(這在 pppd 的線上使用手冊裡有描述). 這裡是該指令稿裡面的一部份

換句話說,我在這裡起始我的 named 程式.當 ppp 離線時 pppd 執行一個稱為 ip-down 的指令稿:

所以這在連線時配置並設定相關事宜並且在離線時解除該配置並結束相關程式.

某些程式,例如我想起 irc 與 talk,做了過多的假定,為了讓其工作正常你必須修改你的 hosts 檔案. 我在 ip-up 上加入

hosts.ppp 是簡單地包含了

而 echo 指令插入了我收到的 IP 號碼做為我機器的名稱(roke). 你應該改用你自己機器的名稱,可以用 hostname 指令查出.

當你沒有連線到網路上時執行 named 可能並不聰明, 這是因為 named 將會嘗試送出查詢到網路上而且其終止時限(timeout)很長, 而每次有某些個程式嘗試解析一個名稱的時候你就得等待到這個終止時限. 如果你使用撥接的話你應該在連上網時起始 named 並且在離線時殺掉它. 不過請參考 FAQ 一節的提示.

某些人喜歡在慢速的連線上使用 forwarders 指令. 如果你的網際網路提供者在 1.2.3.4 以及 1.2.3.5 設有 DNS 伺服器那麼你可以插入這麼一行

到 named.boot 檔案裡去. 這將會減低源自你主機的 IP 流量,可能稍微提昇速度.如果你是依線路的資料量付費的話這點特別重要. 這還有個附加價值,讓你脫離作為一個暫存的 named 維護者所應負起的責任: 你不需要去更新一個空的 root.cache 檔案.

10. 常見問題解答

本節中我將列出一些關於 DNS 以及本文件最常被提出的問題.還有解答 :-) 在寫信給我前請先閱讀過本節.

  1. 如何在防火牆之內使用 DNS ?

    一些提示:  forwarders ',  slave ', 以及參考本文件最後面的文獻列表.

  2. 如何利用 DNS 提供的可用位址於某一服務,如 www.busy.site , 以獲得負荷平衡或類似的效果? 為 www.busy.site 加上許多 A 記錄,而且使用 bind 4.9.3 或以後的版本. 這樣 bind 會使用 round-robin 演算法找尋答案.這不能在更早版本的 bind 上工作.
  3. 我想在一封閉的 Intranet 上架設 DNS.我該怎麼做? 把暫存檔案丟掉只留區域檔案.這也表示你將不需要更新暫存檔案.
  4. 我的系統沒有 ndc 程式.我該怎麼辦? 你的系統安裝過一舊的,可能過期的 bind 程式. 如果安全性對你很重要: 立刻將 bind 升級.如果不是,你也可以用這舊的. 你可直接執行 named 而不是 ndc start .
    • ndc reload 變成 named.reload 而 ndc restart 變成 named.restart .
    所有這些程式可能都在 /usr/sbin 裡.
  5. 如何建立次要名稱伺服器? 如果主要名稱伺服器的地址是 127.0.0.1 , 在你的次要名稱伺服器的 named.boot 檔案中放一行:
    •  secondary     linux.bogus             127.0.0.1       sz/linux.bogus
       
        
  6. 我希望離線時 bind 仍繼續執行.

    我收到來自 Ian Clark [email protected] 的信件解釋他如何辦到這點.

    •  I run named on my 'Masquerading' machine here. I have 
       two root.cache files, one called root.cache.real which contains 
       the real root server names and the other called root.cache.fake 
       which contains...
       --------------
       ; root.cache.fake
       ; this file contains no information
       --------------
       When I go off line I copy the root.cache.fake file to root.cache and
       restart named.
       When I go online I copy root.cache.real to root.cache and restart
       named.
       This is done from ip-down   ip-up respectively.
       The first time I do a query off line on a domain name named doesn't
       have details for it puts an entry like this in messages..
       Jan 28 20:10:11 hazchem named[10147]: No root nameserver for class IN
       which I can live with.
       It certainly seems to work for me. I can use the nameserver for
       local machines while off the 'net without the timeout delay for
       external domain names and I while on the 'net queries for external
       domains work normally
       
        
  7. 名稱伺服器將暫存資料保存在那兒? 有任何方法可以控制它的大小嗎? 所有的暫存資料都保存在記憶體中,任何時刻它都不會被寫入磁碟中. 每次你殺掉 named 時這些暫存資料就沒有了.沒有任何方法可以控制暫存資料.
    • named 用一些簡單的法則來管理它.你不能用任何理由任何方法控制暫存資料或其大小. 如果你希望如此你可以自己去改 named
    的程式.不過最好別這麼做.
  8. 如何在重新起始 named 之間保存暫存資料? 我可以把它存下來嗎? 不! named 被殺掉時不會保留暫存資料. 這就是說暫存資料必須在每次你殺掉並重新起始 named 後重新建立. 沒有辦法讓 named 將暫存資料存到檔案裡. 如果你希望如此你可以自己去改 named 的程式.不過最好別這麼做.

DNSHowto (last edited 2004-12-25 08:45:55 by PingYeh)