原始文件:DNS HOWTO
Nicolai Langfeldt
Version 1.1, 30 June 1996
文件敘述:名字服務器說明文件
文件編號:LRG.LDTP.HOWTO.004
翻譯日期:1996/08/20
翻譯維護:
簡體中文版維護:dfbb,
------------------------------------------------------------------
如何成為一個能有完整了解的小型 DNS 管理者。
關鍵字: DNS, bind, named, dialup, ppp, slip, Internet, domain,
name, hosts, resolving
版權聲明:
(C)opyright 1995 Nicolai Langfeldt 。 沒有修訂版權者請勿修改,
可自由散布但必須保留版權訊息。作者希望能對無數次閱讀這份文件的
草稿并提供許多有用建議的 Arnt Gulbrandsen 表達感謝。
(C)opyright 1995 Nicolai Langfeldt. Do not modify without amending
copyright, distribute freely but retain copyright message. The
author
wishes to thank Arnt Gulbrandsen who read the drafts to this work
countless times and provided many useful suggestions.
其它聲明:
這份文件將永遠不會有完成的一天,請把你的問題以及成功的經驗寄給
我,這可以使它成為一份更好的說明文件。所以請把錢,評論以及/或
是問題寄給 。
謹以這份說明文件獻給 Anne Line Norheim 。 雖然她可能永遠都不會
閱讀這份文件,因為她不是這類型的女孩。
1. 簡介。
這是什麼以及這不是什麼。
DNS 是,對新手(你;-)而言,網路管理中比較晦暗不明的地方之一
。這份說明文件將會試著讓幾件事情能清楚一點。它描述如何設立一個
簡單的 DNS 名字服務器。至於更復雜的設定你將得閱讀真正的文件。
我將會在”最後一章”回過頭來說明這里所謂真正的文件包含有哪些。
在你可以開始進行這項工作之前你應該要先配置好你的機器以便可以從
遠程接入它以及由它對其它機器作遠程接入,并且使所有各種對網路的
連線(all kinds of connections to the net) 都能成功地進行,尤其
你應該要能夠對 127.0.0.1 進行遠程接入并且進入你自己的這臺機器
。同時你也需要一份良好的 /etc/host.conf, /etc/resolv.conf 以及
/etc/hosts 文件作為一個起始點。因為我將不會在這里解釋它們的功
能。如果你還沒有完成所有這些設定并使其運行那麼 the networking/
NET-2 HOWTO 會解釋如何設立它們。閱讀之。
如果你使用 SLIP 或者是 PPP 那麼你得要能讓它運行。若是它還不能
運行的話閱讀 PPP HOWTO 。
當我說‘你的機器’時我的意思是你正要嘗試在上面設立 DNS 的那臺
機器。不是任何可能在你網路環境里的其它機器。
我假設你并不是處於任何會阻礙名稱查詢的防火墻後面。如果你是那麼
你將會需要特別的配置,參見討論”防火墻以及其它特異的網路物體”
該節。
在 Unix 上的名稱服務是藉由一支稱為 named 的程式來執行的。這是
屬於 bind 套件的一部份,這個套件是由 Paul Vixie 為網際網路軟體
集團(Internet Software Consortium)所協調發展的。大部分的 Linux
發行套件都包含有 named 而且通常安裝於 /usr/sbin/named 。如果
你的系統有個 named 那麼你大概可以直接使用它;如果你的系統沒有
的話那麼你可以從某個 Linux ftp 站取回一份二進位執行碼,或是從
底下的 release 或者 testing 目錄里取得
最新最棒的原始程式碼,端視哪個種類的版本最能符合你的生活格調。
DNS 是個以整個網路為范圍的(net-wide)資料庫。要小心你放進里面的
資料。如果你放些廢物進去,你,以及其它人都將會從中取出些廢物。
保持你 DNS 的整齊一致那麼你將能從中取得良好的服務。學習去使用
它,管理它,偵查它的錯誤那麼你將會是另一個保持網路免於因為管理
不善而效率低落的好管理者。
在這份文件里我斷然地敘述幾件并不完全是真實的事情(然而它們至少
有一半是真的)。全都是為了簡化。如果你相信我所說的那麼這些大概
就能運行。
要訣: 如果你已經擁有我指示你去改變的文件,那所有這些文件都要做
備份,如此一來如果經歷這些過程之後沒有東西能運行的話你可以回復
到你舊的,可以運行的情形。
2. 暫存專用(caching only)名字服務器。
DNS 配置的首種嘗試,對撥接使用者非常有用。
一臺暫存專用名字服務器將會為名稱查詢找出答案并且在下一次你需要
該名稱的時候記得答案。
首先你需要一個稱為 /etc/named.boot 的文件。當 named 啟動時會
讀取這個文件。目前它應該單純地包含:
______________________________________________________________________
; Boot file for nicolais caching name server
;
directory /var/named
;
; type domain source file or host
cache . root.cache
primary 0.0.127.in-addr.arpa pz/127.0.0
______________________________________________________________________
`directory@# 這一行告訴 named 到哪里去找尋文件。所有其後命名的
文件都將是相對於此目錄的。根據 Linux 文件系統標準 (Filesystem
Standard) 這個 /var/named 是正確的目錄所在。就個人而言,我使用
的是 /local/named 但這是我的任性。
稱為 /var/named/root.cache 的這個文件是在此文件里命名的。這個
/var/named/root.cache 應該包含:
______________________________________________________________________
\&. 518400 NS D.ROOT-SERVERS.NET.
\&. 518400 NS E.ROOT-SERVERS.NET.
\&. 518400 NS I.ROOT-SERVERS.NET.
\&. 518400 NS F.ROOT-SERVERS.NET.
\&. 518400 NS G.ROOT-SERVERS.NET.
\&. 518400 NS A.ROOT-SERVERS.NET.
\&. 518400 NS H.ROOT-SERVERS.NET.
\&. 518400 NS B.ROOT-SERVERS.NET.
\&. 518400 NS C.ROOT-SERVERS.NET.
;
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
______________________________________________________________________
這個文件描述了在這個世界上的根名字服務器。這會隨時間而改變并且
必須加以維護。如何能保持它跟得上時代請參見”維護篇”。在 named
的線上使用手冊里有這個文件的描述,但是這,IMHO,最適合那些
已經了解 named 的人們。
在 named.boot 里的下一行是 primary 這一行。我將會在稍後的章節
里解釋它的用法,目前只要把它設為在 pz 子目錄下一個稱為 127.0.0
的文件即可:
______________________________________________________________________
@ IN SOA linux.bogus. hostmaster.linux.bogus.
(
1 ; Serial
28800 ; Refresh
7200 ; Retry
604800 ; Expire
86400) ; Minimum TTL
NS ns.linux.bogus.
1 PTR localhost.
______________________________________________________________________
接下來,你需要一份看起來像這樣的 /etc/resolv.conf 文件:
______________________________________________________________________
search subdomain.your-domain.edu your-domain.edu
nameserver 127.0.0.1
______________________________________________________________________
`search@# 這一行指出對於任何你想連往的主機名稱應該搜尋的領域。
`nameserver@# 這一行指出你的機器可以在哪個位址上找到一臺名稱伺
服器,在這個例子中是你自己的這臺機器,因為你在它上面執行 named
。(注意: Named 從不讀取這個文件,而是使用 named 的名稱解答器
會讀取。)
來簡介這個文件有什麼作用: 如果某個客戶端嘗試要找尋 foo 的話,
那麼首先嘗試的是 foo.subdomain.your-domain.edu 這個名稱,然後
接下來是 foo.your-domain.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 這行里:
______________________________________________________________________
search subdomain.your-domain.edu. your-domain.edu. other-domain.com.
______________________________________________________________________
依此類推。很明顯的是你得放入真實的領域名稱來取代這些名稱。
接下來,根據你 libc 版本的不同需要修正 /etc/nsswitch.conf 或者
是 /etc/host.conf 文件。
/etc/nsswitch.conf
這是個很長的文件,它指出到何處去取得各種不同的資料型態,從什麼
文件或是資料庫取得。它的頂端經常會包含一些有幫助的注解。找出以
`hosts:@# 作為開頭的那一行,它應該是這樣:
______________________________________________________________________
hosts: files dns
______________________________________________________________________
如果文件里沒有以 `hosts:@# 作為開頭的行那麼把上面這一行放進去。
它是說程式應該先在 /etc/hosts 文件里找尋,然後根據 resolv.conf
檢查 DNS 。
/etc/hosts.conf
它可能包含有數行,其中應該有一行以 order 作為開始而且它看起來
會像這樣:
______________________________________________________________________
order hosts,bind
______________________________________________________________________
如果文件里沒有 `order@# 這一行的話那麼你應該貼一份上去。它告訴
主機名稱解析函式先在 /etc/hosts 里找尋,然後查問名字服務器(在
resolv.conf 里你說在 127.0.0.1 這個地方)在大部分 Linux 發行
套件中最後這兩個文件的文件在 resolv(8) 的線上使用手冊中(執行
`man 8 resolv@# 即可)。這份線上用手冊IMHO可看,而每個人,
特別是 DNS 管理者,都應該要閱讀它?,F在就做,如果你對你自己說
”我稍後將會去做”你將永遠不會去接近它。
起始 named 。
這些全部完成後現在是起始 named 的時候了。如果你使用撥接連線的
話那麼請先連上網路。鍵入 `ndc start@# 并且按下 return 鍵,沒有
選項。如果它倒彈(back-fires)那麼試著使用 `/usr/sbin/ndc start@#
來取代?,F在你可以測試你的設定。當你在起始 named 的時候如果你
有觀察一下(使用 tail -f /var/adm/messages 指令)系統記錄訊息
文件(通常是稱為 /var/adm/messages 的文件)那麼你應該會看見像
樣的一些東西:
Jun 30 21:50:55 roke named[2258]: starting. named 4.9.4-REL
Sun Jun 30 21:29:0
3 MET DST 1996
Jun 30 21:50:55 roke named[2258]: cache zone "" loaded (serial
0)
Jun 30 21:50:55 roke named[2258]: primary zone
"0.0.127.in-addr.arpa" loaded (s
erial 1)
如果有任何關於錯誤的訊息那麼就是有個錯誤發生,named 將會指名有
錯誤的文件(我想是 named.boot 以及 root.cache 其中之一:)殺掉
named 程序并回頭檢查 named 的文件。
$ nslookup
Default Server: localhost
Address: 127.0.0.1
>
如果這是你所得到的回應那麼它已經能夠運行。我們希望是這樣。得到
任何其它回應都請回頭檢查每一件事。每一次你改變 named.boot 文件
之後你都得使用 ndc restart 這個指令重新起始 named 程式。
現在你可以輸入查詢。嘗試找尋某些靠近你的機器。pat.uio.no 離我
不遠,在奧斯陸的大學里:
> pat.uio.no
Server: localhost
Address: 127.0.0.1
Name: pat.uio.no
Address: 129.240.2.50
現在 nslookup 要求你的 named 找尋 pat.uio.no 這臺機器。然後它
(named) 聯系在你 root.cache 文件里所指名的名稱伺服機器其中一臺
,并且從那里查問它該如何繼續的路徑。在你取得結果之前可能得花費
一點時間,因為它搜尋你在 /etc/resolv.conf 里指名的所有領域。
如果你再試一次的話那麼你將會得到:
> pat.uio.no
Server: localhost
Address: 127.0.0.1
Non-authoritative answer:
Name: pat.uio.no
Address: 129.240.2.50
注意我們在這回合所得到的 `Non-authoritative answer:@# 這一行。
這代表 named 此次并未到網路外去查問,取而代之的是在它的暫存區
里找尋并且在那里發現答案。但是暫存的資訊可能會過時。所以它藉由
`Non-authorative answer:@# 來知會你有這個(很輕微的)危險性存在
。當 nslookup 說這是你第二次查問某臺主機時,這是 named 能暫存
該項資訊并且正常運行的一個訊號。你可以藉由使用 `exit@# 指令離開
nslookup 程式。
如果你是個撥接(ppp, slip) 使用者請閱讀”撥接連線專節”,里面有
一些給你的建議。
現在你知道如何設立一個能夠暫存的 named 系統。來杯啤酒,牛奶,
或是任何你喜歡的東西來慶祝吧。
3. 一個簡單的領域。
如何設立你自己的領域。
在我們真的開始進行這一節以前我將會提供你一些關於 DNS 如何運行
的理論。而你即將閱讀它因為這對你有益。如果你不‘想要’那麼至少
你也得很快地略讀一下。當你看到應該放進你 named.boot 文件里去的
內容時再停止這種略讀方式。
DNS 是一個階層式的系統。其頂端寫作 `.@# 而其發音為 `root@# 。在
. 之下有幾個頂層領域(TLDs),最知名的是 ORG, CPM, EDU 以及 NET
這幾個,但是還有更多。當你想要找出 prep.ai.mit.edu 的位址時你
的名字服務器必須找到服務 edu 的一臺名字服務器。這個問題它會去
查問 root.cache 文件,而 . 服務器會給它一份 edu 服務器列表。
我將會在這里對此加以介紹:
$ nslookup
Default Server: localhost
Address: 127.0.0.1
開始查問某臺根服務器。
> server c.root-servers.net.
Default Server: c.root-servers.net
Address: 192.33.4.12
設定查詢型態為 NS (名字服務器記錄 name server records)。
> set q=ns
查問關於 edu. 的資料。
> edu.
結尾的 . 在這里非常重要,它告訴該服務器我們所查問的 edu 是在
. 之下的那一個,這稍能縮小搜尋的□圍。
edu nameserver = A.ROOT-SERVERS.NET
edu nameserver = H.ROOT-SERVERS.NET
edu nameserver = B.ROOT-SERVERS.NET
edu nameserver = C.ROOT-SERVERS.NET
edu nameserver = D.ROOT-SERVERS.NET
edu nameserver = E.ROOT-SERVERS.NET
edu nameserver = I.ROOT-SERVERS.NET
edu nameserver = F.ROOT-SERVERS.NET
edu nameserver = G.ROOT-SERVERS.NET
A.ROOT-SERVERS.NET internet address = 198.41.0.4
H.ROOT-SERVERS.NET internet address = 128.63.2.53
B.ROOT-SERVERS.NET internet address = 128.9.0.107
C.ROOT-SERVERS.NET internet address = 192.33.4.12
D.ROOT-SERVERS.NET internet address = 128.8.10.90
E.ROOT-SERVERS.NET internet address = 192.203.230.10
I.ROOT-SERVERS.NET internet address = 192.36.148.17
F.ROOT-SERVERS.NET internet address = 192.5.5.241
G.ROOT-SERVERS.NET internet address = 192.112.36.4
這告訴我們 *.root-servers.net 服務 edu. 領域,所以我們可以藉此
繼續查問 c. 服務器?,F在我們想要知道是誰服務下一層的領域名稱:
mit.edu.:
> mit.edu.
Server: c.root-servers.net
Address: 192.33.4.12
Non-authoritative answer:
mit.edu nameserver = STRAWB.mit.edu
mit.edu nameserver = W20NS.mit.edu
mit.edu nameserver = BITSY.mit.edu
Authoritative answers can be found from:
STRAWB.mit.edu internet address = 18.71.0.151
W20NS.mit.edu internet address = 18.70.0.160
BITSY.mit.edu internet address = 18.72.0.3
steawb, w20ns 以及 bitsy 服務 mit 領域,選擇其中一個并且調查
ai.mit.edu:
> server W20NS.mit.edu.
主機名稱不分大小寫,但是我使用我的滑鼠來剪貼所以這些資料是螢幕
的拷貝。
Server: W20NS.mit.edu
Address: 18.70.0.160
> ai.mit.edu.
Server: W20NS.mit.edu
Address: 18.70.0.160
Non-authoritative answer:
ai.mit.edu nameserver = WHEATIES.AI.MIT.EDU
ai.mit.edu nameserver = ALPHA-BITS.AI.MIT.EDU
ai.mit.edu nameserver = GRAPE-NUTS.AI.MIT.EDU
ai.mit.edu nameserver = TRIX.AI.MIT.EDU
ai.mit.edu nameserver = MUESLI.AI.MIT.EDU
Authoritative answers can be found from:
AI.MIT.EDU nameserver = WHEATIES.AI.MIT.EDU
AI.MIT.EDU nameserver = ALPHA-BITS.AI.MIT.EDU
AI.MIT.EDU nameserver = GRAPE-NUTS.AI.MIT.EDU
AI.MIT.EDU nameserver = TRIX.AI.MIT.EDU
AI.MIT.EDU nameserver = MUESLI.AI.MIT.EDU
WHEATIES.AI.MIT.EDU internet address = 128.52.32.13
WHEATIES.AI.MIT.EDU internet address = 128.52.35.13
ALPHA-BITS.AI.MIT.EDU internet address = 128.52.32.5
ALPHA-BITS.AI.MIT.EDU internet address = 128.52.37.5
GRAPE-NUTS.AI.MIT.EDU internet address = 128.52.32.4
GRAPE-NUTS.AI.MIT.EDU internet address = 128.52.36.4
TRIX.AI.MIT.EDU internet address = 128.52.32.6
TRIX.AI.MIT.EDU internet address = 128.52.38.6
MUESLI.AI.MIT.EDU internet address = 128.52.32.7
MUESLI.AI.MIT.EDU internet address = 128.52.39.7
所以 weaties.ai.mit.edu 是 ai.mit.edu 的一臺名字服務器:
> server WHEATIES.AI.MIT.EDU.
Default Server: WHEATIES.AI.MIT.EDU
Addresses: 128.52.32.13, 128.52.35.13
現在我改變查詢的型態,我們已經找到該名字服務器所以現在我們將要
查問 wheaties 關於 prep.ai.mit.edu 它所知道的任何事情。
> set q=any
> prep.ai.mit.edu.
Server: WHEATIES.AI.MIT.EDU
Addresses: 128.52.32.13, 128.52.35.13
prep.ai.mit.edu CPU = dec/decstation-5000.25 OS = unix
prep.ai.mit.edu
inet address = 18.159.0.42, protocol = tcp
#21 #23 #25 #79
prep.ai.mit.edu preference = 1, mail exchanger =
life.ai.mit.edu
prep.ai.mit.edu internet address = 18.159.0.42
ai.mit.edu nameserver = alpha-bits.ai.mit.edu
ai.mit.edu nameserver = wheaties.ai.mit.edu
ai.mit.edu nameserver = grape-nuts.ai.mit.edu
ai.mit.edu nameserver = mini-wheats.ai.mit.edu
ai.mit.edu nameserver = trix.ai.mit.edu
ai.mit.edu nameserver = muesli.ai.mit.edu
ai.mit.edu nameserver = count-chocula.ai.mit.edu
ai.mit.edu nameserver = life.ai.mit.edu
ai.mit.edu nameserver = mintaka.lcs.mit.edu
life.ai.mit.edu internet address = 128.52.32.80
alpha-bits.ai.mit.edu internet address = 128.52.32.5
wheaties.ai.mit.edu internet address = 128.52.35.13
wheaties.ai.mit.edu internet address = 128.52.32.13
grape-nuts.ai.mit.edu internet address = 128.52.36.4
grape-nuts.ai.mit.edu internet address = 128.52.32.4
mini-wheats.ai.mit.edu internet address = 128.52.32.11
mini-wheats.ai.mit.edu internet address = 128.52.54.11
mintaka.lcs.mit.edu internet address = 18.26.0.36
所以我們從 . 開始連續找出在領域名稱里的下一層名字服務器。如果
你使用你自己的 DNS 服務器取代使用所有這些個其它的服務器,你的
named 當然會暫存所有這些在為你尋找這個答案時所找到的資訊,而且
在一段時間內它不必再次查問。
一個比較起來很少被論及,但是同樣重要的是 in-addr.arpa 領域。它
也像‘正常的’領域一樣是巢狀的。in-addr.arpa 讓我們可以在擁有
主機位址的時候得知該主機的名稱。在這里有件重要的事情是要注意在
in-addr.arpa 這個領域中 ip#s 是以反向順序書寫的。如果你有某臺
機器的位址: 192.128.52.43 那麼 named 會以像是 prep.ai.mit.edu
這個示例的方式來處理: 找出 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 并非完完全全地像我告訴你的這樣運行。但是
這已經夠接近的了。
我們自己的領域。
現在來定義我們自己的領域。我們將會創造出 linux.bogus 這個領域
并且定義其中的機器。我使用一個完全是虛擬出來的領域名稱以便確定
我們不會擾亂到網路上的其它地方。
我們早就已經以 named.boot 里的這一行開始了這個部份的設定:
______________________________________________________________________
primary 0.0.127.in-addr.arpa pz/127.0.0
______________________________________________________________________
請注意在這個文件里的領域名稱結尾并沒有加上 `.@# 符號。第一行把
定義 0.0.127.in-addr.arpa 的文件命名為 pz/127.0.0 。我們早已經
設立了這個文件,它是這樣的:
______________________________________________________________________
@ IN SOA linux.bogus. hostmaster.linux.bogus.
(
1 ; Serial
28800 ; Refresh
7200 ; Retry
604800 ; Expire
86400) ; Minimum TTL
NS ns.linux.bogus.
1 PTR localhost.
______________________________________________________________________
請注意在這個文件里所有的完整領域名稱結尾的 `.@# 符號,這與上面
提到的 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.arps 所以
第一行實際上是說
0.0.127.IN-ADDR.ARPA. IN SOA ...
NS 是名字服務器資源記錄,它告訴 DNS 什麼機器是這個領域的名稱
服務器。而最後的 PTR 記錄說 1(等於是 1.0.0.127.IN-ADDR.ARPA,
ie. 127.0.0.1 )的名稱是 localhosts 。
SOA 這個記錄是所有區域文件的序文,而且在每一個區域文件里都應該
有唯一的一個,最開頭的記錄。它描述該區域,它從何而來(一臺稱為
linux.bogus 的機器),誰負責其內容(),這
個區域文件是什麼版本(serial: 1) ,以及其它必須做的,有關暫存與
次要 DNS 服務器的事。剩下的欄位如 refresh, retry, expire 以及
minimum 可以使用這份說明文件里所用的數字而且你應該不會出問題。
NS 這個記錄告訴我們誰為 0.0.127.in-addr.arpa 提供 DNS 服務,
是 ns.linux.bogus 這臺機器。PTR 這個記錄告訴我們 1.0.0.127.in-
addr.arpa (aka 127.0.0.1) 也稱為 localhost 。
現在重新起始你的 named(使用 ndc restart 指令)并使用 nslookup
來檢驗我們做了什麼:
$ nslookup
Default Server: localhost
Address: 127.0.0.1
> 127.0.0.1
Server: localhost
Address: 127.0.0.1
Name: localhost
Address: 127.0.0.1
所以它管理從 127.0.0.1 得到 localhost 的過程,很好。不要急。
現在開始我們的主要任務,linux.bogus 這個領域,在 named.boot 里
插入新的一行 primary 指令:
______________________________________________________________________
primary linux.bogus pz/linux.bogus
______________________________________________________________________
注意,在 named.boot 文件里領域名稱的結尾還是沒有 @#.@# 符號。
在這個 linux.bogus 區域文件里我們將會放入一些完全虛擬的資料:
______________________________________________________________________
;
; Zone file for linux.bogus
;
; Mandatory minimum for a working domain
;
@ IN SOA linux.bogus. hostmaster.linux.bogus. (
199511301 ; serial, todays date +
todays serial #
28800 ; refresh, seconds
7200 ; retry, seconds
3600000 ; expire, seconds
86400 ) ; minimum, seconds
NS ns.linux.bogus.
NS ns.friend.bogus.
MX 10 mail.linux.bogus ; Primary Mail
Exchanger
MX 20 mail.friend.bogus. ; Secondary Mail
Exchanger
localhost A 127.0.0.1
ns A 127.0.0.2
mail A 127.0.0.4
______________________________________________________________________
在這個文件里有一種新的資源記錄型態,即 MX 型態,或是郵件交換者
資源記錄(Mail eXchanger RR) 。這種資源記錄型態告訴郵遞系統地址
的郵件要寄送到哪里,換句話說也就是應該寄送
到 mail.linux.bogus 或是 mail.friend.bogus。在每個機器名稱前面
的數字是 MX 資源記錄的優先權,數字比較低 (10) 的資源記錄是郵件
主要應該寄往的機器。如果失敗可以把它寄往數字比較高的機器,一臺
次要的郵件處理者,如在這里具有優先權 20 的 mail.friend.bogus。
藉由執行 ndc restart 重新起始 named 。以 nslookup 檢驗結果:
$ nslookup
> set q=any
> linux.bogus
Server: localhost
Address: 127.0.0.1
linux.bogus
origin = linux.bogus
mail addr = hostmaster.linux.bogus
serial = 199511301
refresh = 28800 (8 hours)
retry = 7200 (2 hours)
expire = 604800 (7 days)
minimum ttl = 86400 (1 day)
linux.bogus nameserver = ns.linux.bogus
linux.bogus nameserver = ns.friend.bogus
linux.bogus preference = 10, mail exchanger =
mail.linux.bogus.linux.bogus
linux.bogus preference = 20, mail exchanger =
mail.friend.bogus
linux.bogus nameserver = ns.linux.bogus
linux.bogus nameserver = ns.friend.bogus
ns.linux.bogus internet address = 127.0.0.2
mail.linux.bogus internet address = 127.0.0.4
由小心地檢驗你將會發現一個錯誤。這一行
linux.bogus preference = 10, mail exchanger =
mail.linux.bogus.linux.bogus
全都錯了。它應該是
linux.bogus preference = 10, mail exchanger =
mail.linux.bogus
我故意犯了個錯誤所以你可以藉此學習:-)仔細看看該區域文件我們
會發現這一行
@ MX 10 mail.linux.bogus ; Primary Mail
Exchanger
遺漏了一個句點?;蚴钦f多了個 `linux.bogus@# 。在區域文件里如果
一個機器名稱不是以句點結尾那麼會在其結尾加入基點。所以不論是
______________________________________________________________________
@ MX 10 mail.linux.bogus. ; Primary Mail
Exchanger
______________________________________________________________________
或者是
______________________________________________________________________
@ MX 10 mail ; Primary Mail
Exchanger
______________________________________________________________________
都是正確的。我比較喜歡後面這種形式,它需要的打字比較少。在一個
區域文件里領域名稱應該要不就是寫出來并以 `.@# 結尾或者就是一點
都不要包含進去,而在這種情況下其領域預設為基點。我必須強調的是
在 named.boot 文件里領域名稱後面不應該有 `.@# 的存在。你不知道
有多少次因為多了或少了一個 `.@# 而砸鍋并且對許多人造成困擾。
所以在加入我強調的重點後這里是一份新的區域文件,其中還包含一些
額外的資訊:
______________________________________________________________________
;
; Zone file for linux.bogus
;
; Mandatory minimum for a working domain
;
@ IN SOA linux.bogus. hostmaster.linux.bogus. (
199511301 ; serial, todays date +
todays serial #
28800 ; refresh, seconds
7200 ; retry, seconds
604800 ; expire, seconds
86400 ) ; minimum, seconds
NS ns ; Inet Address of name
server
NS ns.friend.bogus.
MX 10 mail ; Primary Mail Exchanger
MX 20 mail.friend.bogus. ; Secondary Mail
Exchanger
localhost A 127.0.0.1
ns A 127.0.0.2
mail A 127.0.0.4
;
; Extras
;
@ TXT "Linux.Bogus, your DNS consultants"
ns MX 10 mail
MX 20 mail.friend.bogus.
HINFO "Pentium" "Linux 1.2"
TXT "RMS"
richard CNAME ns
www CNAME ns
donald A 127.0.0.3
MX 10 mail
MX 20 mail.friend.bogus.
HINFO "i486" "Linux 1.2"
TXT "DEK"
mail MX 10 mail
MX 20 mail.friend.bogus.
HINFO "386sx" "Linux 1.0.9"
ftp A 127.0.0.5
MX 10 mail
MX 20 mail.friend.bogus.
HINFO "P6" "Linux 1.3.59"
______________________________________________________________________
你也許會想要移動前面三個 A 記錄以便讓它們鄰近於它們其它的相關
記錄,而不是像這樣放在最前端。
這里有幾個新的資源記錄: 主機資訊(HINFO: Host INFOrmation) 包括
兩個部份,使用引號涵括每個部份是個好習慣。第一個部份是機器上的
硬體或是中央處理單元,而第二個部份是機器上的軟體或是作業系統。
ns 有一顆 Pentium CPU 并且執行 Linux 1.2 系統。TXT 記錄是個
自由的文字記錄,你可以用它來做任何你想做的事。正式名稱(CNAME:
Canonical NAME) 可以用來給每臺機器數個名稱。所以 richard 以及
www 都是 ns 的一個別名。很重要的一點是 A, MX, CNAME, 以及 SOA
記錄永遠不該參照 CNAME 記錄設定的別名,它們只應該參照 A 記錄
所設定的名稱,所以這樣的記錄是錯的
______________________________________________________________________
foobar CNAME richard ; NO!
______________________________________________________________________
但是這樣是對的
______________________________________________________________________
foobar CNAME ns ; Yes!
______________________________________________________________________
還有一點也很重要的是注意正式名稱所設定的對電子郵遞位址而言不是
合法主機名稱: 以上面的設定而言是一個
不合法的電子郵遞位址。即使它在你的系統上可以運行,可以預料的是
很少有電子郵件管理者會去實行這項規則。避免這個問題的方法是使用
A 記錄(或者也可能是一些其它的,像是 MX 記錄)來取代之:
______________________________________________________________________
www A 127.0.0.2
______________________________________________________________________
Paul Vixie, 主要的 named 專家,建議不要使用正式名稱這個設定。
所以應該考慮不要很認真地去使用它。
藉由執行 ndc reload 載入新的資料庫,這會使 named 再一次讀取其
文件。
$ nslookup
Default Server: localhost
Address: 127.0.0.1
> ls -d linux.bogus
這意指應該列出所有的記錄。
[localhost]
linux.bogus. SOA linux.bogus
hostmaster.linux.bogus. (1995
11301 28800 7200 604800 86400)
linux.bogus. NS ns.linux.bogus
linux.bogus. NS ns.friend.bogus
linux.bogus. MX 10 mail.linux.bogus
linux.bogus. MX 20 mail.friend.bogus
linux.bogus. TXT "Linux.Bogus, your DNS
consultants"
localhost A 127.0.0.1
mail A 127.0.0.4
mail MX 10 mail.linux.bogus
mail MX 20 mail.friend.bogus
mail HINFO 386sx Linux 1.0.9
donald A 127.0.0.3
donald MX 10 mail.linux.bogus
donald MX 20 mail.friend.bogus
donald HINFO i486 Linux 1.2
donald TXT "DEK"
www CNAME ns.linux.bogus
richard CNAME ns.linux.bogus
ftp A 127.0.0.5
ftp MX 10 mail.linux.bogus
ftp MX 20 mail.friend.bogus
ftp HINFO P6 Linux 1.3.59
ns A 127.0.0.2
ns MX 10 mail.linux.bogus
ns MX 20 mail.friend.bogus
ns HINFO Pentium Linux 1.2
ns TXT "RMS"
linux.bogus. SOA linux.bogus
hostmaster.linux.bogus. (1995
11301 28800 7200 604800 86400)
很好。讓我們檢查它對於單獨的 www 會說什麼:
> set q=any
> .
Server: localhost
Address: 127.0.0.1
canonical name = ns.linux.bogus
ns.linux.bogus
linux.bogus nameserver = ns.linux.bogus
linux.bogus nameserver = ns.friend.bogus
ns.linux.bogus internet address = 127.0.0.2
而 ns.linux.bogus 擁有 127.0.0.2 這個位址??雌饋硪埠芎?。
繼續深入
當然,這個領域是高度虛擬的,里面所有的位址也都是。真正的領域要
在其中插入真正的領域名稱和位址以及所有其它的資訊。這些工作完成
時你需要一個反向找尋用的區域文件,它應該會是像 127.0.0 這樣的
文件并且為每個其中所使的位址包含唯一的一個 PTR 資源記錄,像是
127.0.0.2 PTR ns.linux.bogus.
127.0.0.3 PTR donald.linux.bogus.
127.0.0.4 PTR mail.linux.bogus.
127.0.0.5 PTR .
對於作為我們示例的領域(當然是附加於 SOA 資源記錄的)。該文件
的領域名稱(基點)應該要是反向的,這個情況正如同 127.0.0 之於
0.0.127.in-addr.arpa 一樣。
現在是你開始操作并設立你的領域的時候了。當你玩夠了 linux.bogus
領域的操作後從你的 named.boot 文件里把它移除。
4. 防火墻以及其它特異的網路物體
問: 如何從防火墻里面使用 DNS 呢? 答: 有幾個提示: `forwarders@#
`slave@#, 并詳閱在這份說明文見後面所列舉的文獻。
問: 我該如何使 DNS 能夠為某種服務輪回切換可以使用的位址,例如
回應 這個名稱不同的位址以便能取得平衡負載的功效
,或者類似的功用? 答: 為 設定幾個 A 記錄,如此
bind 4.9.3 或更晚的版本將會每次更替答案。這在較早的 bind 版本
是無法運行的。
5. 維護
維持它的運行。
維持它們的繼續執行之外,對於 named 你還有個維護的任務得要做。
那就是維持 root.cache 文件的更新。最簡單的方法是使用 dig 程式
,首先不加任何參數執行 dig 程式,你將會取得根據你自己服務器的
root.cache 。然後以 dig @rootserver 查問所列出的根服務器其中
之一。你將會注意到這份輸出看起來非常地像一個 root.cache 文件,
除了一堆額外的數字以外。這些數字不會有什麼妨礙。把它存放到文件
里(dig > root.cache.new)并且用它來取代原本
舊的 root.cache 文件。
取代了原先的 cache 文件之後要記得重新啟動 named 程式。
Al Longyear 寄給我這個指令稿,它可以自動執行來更新 named.cache
為它安裝個 crontab 項目然後忘了它。這個指令稿假設你的電子郵件
可以運行而且 `hostmaster@# 這個郵件別名有定義。你應該修訂它以便
符合你的設定。
______________________________________________________________________
#!/bin/sh
#
# Update the nameserver cache information file once per month.
# This is run automatically by a cron entry.
#
(
echo "To: hostmaster "
echo "From: system "
echo "Subject: Automatic update of the named.boot file"
echo
export PATH=/sbin:/usr/sbin:/bin:/usr/bin:
cd /var/named
dig . @rs.internic.net >named.cache.new
echo "The named.boot file has been updated to contain the following
information:"
echo
cat named.boot.new
chown root.root named.cache.new
chmod 444 named.cache.new
rm -f named.cache.old
mv named.cache named.cache.old
mv named.cache.new named.cache
ndc restart
echo
echo "The nameserver has been restarted to ensure that the update
is complete.
"
echo "The previous named.cache file is now called
/var/named/named.cache.old."
) 2>&1 | /usr/lib/sendmail -t
exit 0
______________________________________________________________________
6. 撥接連線的自動設定
這一節解釋我如何設定以便自動化每個過程。我的方法可能一點都不適
合你,但是你可能從我所作的一些事情里得到一些點子。同時,我使用
ppp 撥接,然而有許多人使用 slip 或是 cslip 連線方式,所以你的
設定里幾乎某個地方都可能跟我的不同。但是 slip 使用的 dip 程式
應該能夠完成我所作的許多事情。
一般來說,當我沒有連上網路時我的 resolv.conf 文件單純地包含這
一行
domain uio.no
這確保我不必等待主機名稱解析函式庫去嘗試聯系某臺不可能幫助我的
名字服務器。但是當我連上線的時候我想要起始我的 named 并且擁有
一個看起來像前面所描述的 resolv.conf 文件。我藉由保持兩份名為
resolv.conf.local 以及 resolv.conf.connected 的文件以便作為該
resolv.conf 的‘樣板’文件來解決這個問題。後面這一個看起來像在
這份文件前面所描述過的 resolv.conf 文件。
要自動化連線到網路的過程我執行一個稱為 `ppp-on@# 的指令稿:
______________________________________________________________________
#!/bin/sh
echo calling...
pppd
______________________________________________________________________
pppd 有個稱為 options 的文件,這告訴它關於如何取得連線的一些
特殊事項。一旦我的 ppp 連線完成後 pppd 起始一個稱為 ip-up 的
指令(這在 pppd 的線上使用手冊里有描述)。這里是該指令稿里面的
一部份:
______________________________________________________________________
#!/bin/sh
interface="$1"
device="$2"
speed="$3"
myip="$4"
upip="$5"
cp -v /etc/resolv.conf.connected /etc/resolv.conf
/usr/sbin/named
______________________________________________________________________
I.e. 我在這里起始我的 named 程式。當 ppp 離線時 pppd 執行一
個稱為 ip-down 的指令稿:
______________________________________________________________________
#!/bin/sh
cp /etc/resolv.conf.local /etc/resolv.conf
read namedpid kill $namedpid
______________________________________________________________________
所以這在連線時配置并設定相關事宜并且在離線時解除該配置并結束相
關程式。
Some programs, irc and talk come to mind, make a few too many
assumptions, and for irc the dcc features and talk to work right you
have to fix your hosts file. I insert have this in my ip-up script:
______________________________________________________________________
cp /etc/hosts.ppp /etc/hosts
echo $myip roke >>/etc/hosts
______________________________________________________________________
hosts.ppp simply contains
______________________________________________________________________
127.0.0.1 localhost
______________________________________________________________________
and the echo thing inserts the ip# i have received for my host name
(roke). You should use the name your host knows itself by instead.
This can be found with the hostname command.
當你沒有連線到網路上時執行 named 可能并不聰明,這是因為 named
將會嘗試送出查詢到網路上而且其終止時限(timeout) 很長,而每次有
某些個程式嘗試解析一個名稱的時候你就得等待到這個終止時限。如果
你使用撥接的話你應該在連上網時起始 named 并且在離線時殺掉它。
我已經接到一些郵件說不是這樣的,但是我不能使它能夠等待這麼長的
時間。如果你有更好的資訊請寄給我所有的細節。
某些人喜歡在慢速的連線上使用 forwarders 指令。如果你的網際網路
提供者在 1.2.3.4 以及 1.2.3.5 設有 DNS 服務器那麼你可以插入
這麼一行
______________________________________________________________________
forwarders 1.2.3.4 1.2.3.5
______________________________________________________________________
到 named.boot 文件里去。同時也讓 named.cache 文件保持為空白。
這將會減低源自你主機的 IP 流量,任何可能提升的速度。如果你是依
線路的資料量付費的話這特別重要。這還有個附加價值,讓你脫離作為
一個暫存的 named 維護者所應負起的責任: 你不需要去更新一個空的
named.cache 文件。
7. 如何成為一個大型的 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 by Robert M. Prisig :-) ISBN 0688052304
and others.
線上的資料你可以在這里找到 ,
; 常見問題集,參考手冊(BOG;
Bind Operations Guide)是協訂定義以及 DNS 研究的文獻。這些文件
我大部分沒有閱讀過,但是因此我不是個大型 DNS 管理者。另一方面
Arnt Gulbrandsen 已經讀過 BOG 而且對此很熟稔:-)。
網路新聞討論群 comp.protocol.rcpip.domains 是有關 DNS 的討論
群。此外還有好幾份關於 DNS 的 RFCs, 最重要的可能是這些:
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.