全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:933
推到 Plurk!
推到 Facebook!

Linux 架站文件_ 5

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-21 23:57:26 IP:61.64.xxx.xxx 未訂閱
http://www.adj.idv.tw/server/linux_dns.htm 架設 DNS DNS可以說不是一個容易弄清楚的概念﹐尤其是其運作原理。如果您看過“網路基礎”之“ 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;”前面的註解符號“//”拿掉。當然﹐您也必須要設定好您的火牆啦。 接下來的句子﹕ // // 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" { type master; notify no; file "named.192.168.0"; }; zone "1.168.192.in-addr.arpa" { type master; notify no; file "named.192.168.1"; }; 這裡﹐我一共指定了三個反查詢區域﹐它們都有一個識別標誌﹕“ .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基礎”。 或許您還發現我為上面的 zone 加入了“ notify no ”這個敘述。為什麼呢﹖因為﹐我這裡設定的 DNS 是沒有向 InterNIC 註冊的﹐而且大部份使用私有IP位址。這行則會禁止我這裡設定的 DNS (主動)向外面散播 DNS 信息。 同時﹐我將這些 zone 都設定為“主 DNS 伺服器”(即﹕master﹐也有人稱之為 primary)。事實上﹐如果有別的 slave DNS 指向該這台 master 的話﹐雖然將 notify 設為 no ﹐slave 主機還是可以用 pull 的方法來進行區域轉移 (zone transfer)。當然﹐您也可以用 push 的方式進行轉移﹕ notify yes; also-notify { 203.30.35.161; }; 在每個 zone 的最後部份﹐我分別指定了它們各自的記錄檔名稱。它們都存放在 /var/named 這個目錄下面﹐也就是前面 options 指定的 directory 啦。檔案的名稱隨您喜歡﹐不致做成混亂則可。 當反解 DNS 指定好之後﹐我們就要設定正解 DNS 了﹕ zone "siyongc.domain" { type master; notify no; file "named.siyongc.domain"; }; zone "home" { type master; notify no; file "named.home"; }; zone "virtual.test" { type master; notify no; file "named.virtual.test"; }; zone "test.domain" { type master; notify no; file "named.test.domain"; }; zone "siyongc.domain.nt" in { type slave; file "slave.siyongc.domain.nt"; masters { 192.168.0.20; }; }; 和反向查詢區域一樣﹐它們也有著各自的記錄檔。另外﹐您或許已經發現﹕最後一個 zone 類別為 “ slave ” ﹐另外我還為之指定了它的 master DNS主機的 IP 地址。Slave 主機也有人稱之為 secondary DNS。當您有一個很大的網路需要 slave 來分擔 master 服務﹐或是需要多台 DNS 提供備份服務 (如申請 domain name 時就需要提供兩台 DNS)﹐使用 slave 就非常方便了。 好了﹐現在﹐請回顧一下 /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(Time To Live) ﹐也就是在快取中保留的時間。‘ 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 691200 ; Expire 86400 ) ; Minimum IN NS localhost. ;負責0.0.127.in-addr.arpa.的DNS主機是localhost. 1 IN PTR localhost. ;1.0.0.127.in-addr.arpa.的主機是localhost. 這裡﹐我們看到“ $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 記錄中是個保留字符(剛才已經提過)﹐所以這裡就用“.”來代替了。 請留心觀察記錄檔中的主機名稱﹐它們最後都是用一個“ . ”結尾的﹐在 DNS 記錄中﹐這樣的名稱我們稱為“ 全域名稱 ”即 FQDN(Fully Qualified Domain Name) 。如果缺少了這個點會怎樣呢﹖就會將所屬的“ 區域名稱 ”(取值於 @ 或 $ORIGIN)附加在記錄名稱後面了。也就是說﹕“localhost”會變成“localhost.0.0.127.in-addr.arpa”﹔而“localhost.”就只能是“localhost.”。所以﹐這個小點“.”非常重要﹐在以後設定中一定要非常留神﹗ 還有一點我們也不能忽略﹐就是﹕記錄檔中的每一列都會被視一個輸入單位, 如果句子不是以空白﹑Tab﹑ 或註解符號 (;)開頭﹐ 則表示要定義一個新資料項。所以﹐如果您要為一個名稱定義好幾個記錄﹐而不想重複打字﹐您倒可以偷懶﹕在接著它的後面幾行用空白或 Tab 來縮排就可以了。您將會在後面看到好多這樣的例子﹐但您一定要知道為什麼。 接下來在“( )”之間的數字﹐是用來和 slave 伺服器更新 DNS 資料使用的數據﹕“ Serial ”的格式通常會是“年月日 修改次序”(但也不一定如此﹐您自己能夠記得就行)﹐當 slave 到時候進行資料更新的話﹐會比較這個號碼。如果發現在 master 上面的號碼比原來的“大”﹐就進行更新﹐否則忽略。不過設 serial 一定要留意的地方是﹕不能超過 10 位數字﹗“ Refresh ”指定的是進行更新的時間間隔。“ Retry ”呢﹐是如果更新失敗後進行重試的時間間隔。“ Expire ”是記錄逾期時間。“ Minimum ”是最小預設 TTL 值﹐如果您不使用“$TTL”進行指定﹐就會以此值為准。另外﹐您也可以另行為每一行記錄設定 TTL﹐只要將數字寫在‘IN’前面就可以了。以上的數字都是以秒為單位﹐但您也可以用 H(小時)﹑D(天)﹑W(星期)來做單位﹐如﹕8H 和 28800 是一樣的。(但要格外注意的是﹕如果您日後使用 netconf 這工具來設定 DNS 的話﹐就只能使用數字了。否則 netconf 會自動的把英文字母刪除掉﹐那就不是您所預期的設定值了)。如果用秒來設定的話﹐這些規則要遵守﹕ expire >= refresh retry expire >= 10 * retry 接下來的“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.in-addr.arpa.”了。 好了﹐當我們了解這個記錄檔的內容之後﹐那麼﹐我們就可以著手一一建立起那些在 /etc/named.conf 裡面指定的記錄檔了。讓我們看看其中一個 zone 吧﹕ zone "0.168.192.in-addr.arpa" { type master; notify no; file "named.192.168.0"; }; 這是關於 192.168.0.0/24 這個 IP 網路的反解區域﹐從倒數第二行的 file 我們得知這個設定檔的名稱是 named.192.168.0。也就是說﹐我們現在要在 /var/named 這個目錄下面建立起這個檔案。我這裡的設定是這樣的﹕ ; File: /var/named/named.192.168.0 ; This is the master sub-net for siyongc.domain, but not the only one. $TTL 86400 @ IN SOA redhat52.siyongc.domain. netman.siyongc.domain. ( 2000032701 ; Serial 28800 ; Refresh 14400 ; Retry 691200 ; Expire 86400 ; Minimum ) @ IN NS redhat52.siyongc.domain. ; $ORIGIN 0.168.192.in-addr.arpa. ; 11 IN PTR emilie.siyongc.domain. 15 IN PTR pii266.siyongc.domain. 16 IN PTR w2000ad.siyongc.domain. 17 IN PTR gw.siyongc.domain. 17 IN PTR redhat52.siyongc.domain. 19 IN PTR redhat62.test.domain. 20 IN PTR dellnt266.siyongc.domain. 21 IN PTR xlinux.siyongc.domain. 21 IN PTR alias01.test.domain. 在 DNS 記錄檔裡面﹐“ ; ”是註解符號﹐以它開始到句子結尾都會被忽略。我們可以用之為檔案作些說明。 除了 $TTL 這個 option 我們剛才已經接觸過﹐另外一個 $ORIGIN 也是一個 option ﹐前面也略略提到過了。緊接其後宣告的是一個全域名稱的 domain name (帶 “ . ”的)。如果其後的記錄中﹐沒有使用 FQDN 的話﹐則這個 domain name 就會附加上去﹔其值會直到下一個 $OROGIN 才改變。這行不是必須的﹐但如果您這台 DNS 機器上同時管理多個 zone 就最好加上去。(看您自己意思辦吧) 從上面﹐您會看到管理 0.168.192.in-addr.arpa. 這個區的 NS 伺服器是 redhat52.siyongc.domain. 。在 PTR 左邊是各機器的 IP ﹐在 PTR 右邊則是機器的全域名稱。 如果您機器有多個名稱的話﹐那麼﹐在反解那裡是容許一個 IP 有多個 PTR 記錄的。不過﹐如果您用 nslookup 的正常模式查詢的話﹐卻只能看到最後一個記錄﹐您要經過 set q=ptr 之後才可以看到全部記錄。 當我們將 /etc/named.conf 中所有的反查詢記錄檔設定好之後﹐接下來﹐就應該進行正解查詢記錄的設定了。不過﹐您可能很喜歡知道的一件事情是﹕ slave 的記錄檔不用設定哦~~~ ﹐只要您的機器能連得上 master 且 master 的 DNS 工作正常就可以了﹐然後記錄檔會自動由 named 產生。 和反解一樣﹐我這裡不一一將所有檔案內容列出來了。只挑選了‘siyongc.domain’這個區域進行說明一下﹕ ; File﹕ /var/named/named.siyongc.domain ; ; Zone file for domain﹕ 'siyongc.domain.' ; $TTL 86400 @ IN SOA redhat52.siyongc.domain. webmaster.siyongc.domain. ( 2000032702 ; Serial 28800 ; Refresh 14400 ; Retry 691200 ; Expire 86400 ) ; Minimum ; IN TXT "A test domain, siyongc.domain., created by Netman" IN NS redhat52 ;Note: the trailing dot is missing! IN NS debian.home. IN MX 10 redhat52.siyongc.domain. IN MX 20 debian.home. IN A 192.168.0.17 ; The default IP for domain ; $ORIGIN siyongc.domain. ; localhost IN A 127.0.0.1 ; gw IN A 192.168.0.17 IN HINFO "Redhat" "MASQ" IN TXT "The masquerade gateway for internet." ; redhat52 IN A 192.168.0.17 redhat52 IN A 203.30.35.137 IN MX 0 redhat52.siyongc.domain. ;pointing to itself! IN MX 20 debian.home. IN HINFO "Dell PII 266" "Linux RedHat" www IN CNAME redhat52 ftp IN CNAME redhat52.siyongc.domain. ;same CNAME news IN CNAME redhat52 mail IN CNAME redhat52 pop IN CNAME redhat52 smtp IN CNAME redhat52 ; pii266 IN A 192.168.0.15 IN HINFO "PII266" "CWin 98" ; slware36 IN A 192.168.0.18 IN MX 10 redhat52.siyongc.domain. IN MX 20 debian.home. ; rhroute IN A 192.168.0.4 IN MX 10 redhat52.siyongc.domain. IN MX 20 debian.home. 在這個檔裡面﹐‘ TXT ’記錄﹐是‘Text Information’的意思﹐它實際上不牽涉任何設定﹐只記錄一些環境說明而已﹔這和後面的‘ HINFO(Host Information) ’差不多﹐但後者一定要有兩項記錄(可以分別用引號分開)﹐其中第一項是關於 CPU 的訊息﹐第二項則是操作系統。 然後﹐因為我這個區域的記錄分別由兩台主機負責﹐所以我這裡指定了兩個 NS 記錄。不過﹐我在這裡偷了一個懶﹕正如我上面解釋過﹐如果名稱後面不是以“.”結尾的話﹐它所屬的區域名稱就會自動的加在該記錄名稱後面。也就是﹕ “redhat52”沒有用點結尾﹐就成了“redhat52.siyongc.domain.”了﹐這個名稱實際就是我所要的。雖然這並不省很多﹐但對於像我這樣的懶人來說﹐卻是方便的。 MX 記錄 接下來的 ‘ MX ’ 記錄恐怕要花些時間解析。 MX 是‘Mail Exchange’的意思﹐它指定了負責該區域的郵件伺服器名稱(最好使用全域名稱)﹐而且該名稱必須是一個 A 記錄(不建議使用 CNAME)。在郵件系統中﹐只要郵件伺服器雙方都知道對方的 IP 就可以進行郵件交換了。我們用 /etc/hosts 也可以做到名稱查詢的目的﹐但正如我們可以想像到的﹕ineternet 這麼多郵件伺服器﹐我們不可能一一為它們建立好 IP 對應。就算﹐我們可以這樣做﹐如果對方要更換郵件伺服器呢﹖要維護這樣一個對應殊非易事。既然﹐我們可以用 DNS 來查詢主機和 IP﹐為什麼不使用這麼便利的系統呢﹖但問題是﹐各區域的郵件伺服器名稱都不一樣﹐我們也不可能知道對方的郵件伺服器主機名稱是什麼(雖然我們可以用 CNAME 為每一個 zone 建立一個‘mail’名稱記錄﹐但也不盡然)。就算知道﹐如果對方以後更換名稱呢﹖ 您看﹐即使我們使用了 DNS 系統來進行郵件路由﹐也不是這麼簡單的事情。但是﹐使用 MX 記錄就大大發揮了 DNS 系統的功能了﹕我們只要為每一個區域建立起 MX 記錄﹐指定出用 DNS 查詢得到的郵件伺服器名稱(郵件路由中﹐DNS 只是其中一種方法)﹐這樣﹐當郵件伺服器要和對方的區域進行郵件傳遞的時候﹐就可以通過 MX 記錄得到對方的郵件伺服器名稱了。以後﹐就算對方更換名稱﹐將 DNS 記錄改改就可以了。而外面的郵件伺服器﹐根本無需認知到這個改變。 另外﹐使用 MX 還有一個功能﹕您可以用 MX 同時指定好幾台郵件伺服器名稱。在我這個例子中﹐我就分別為‘siyongc.domain’這個區域指定了兩個 MX 記錄﹕‘redhat52.siyongc.domain.’和‘debian.home.’。但您有沒有發現它們前面都有一個數字呢﹖這數字有什麼作用啊﹖問得好﹗當外面的郵件伺服器通過 DNS 查詢到我們的郵件伺服器﹐如果發現超過一台主機負責郵件交換的話﹐數值越低的就越先被查詢。但有時候該主機沒有回應呢﹖那麼就由下一個數值的主機負責了。這樣還有一個好處是﹐就算第一台郵件伺服器出現故障﹐也不至於令到郵件交換功能癱瘓掉。雖然我們通常喜歡用‘10’﹑‘20’﹑‘30’.... 這樣的偏好值(preference)來分配 MX 記錄﹐但只要您喜歡﹐用‘1’﹑‘2’﹑‘3’... 這樣的順序一樣可以。 同時﹐您或許發現我也分別為所有 linux 主機指定了 MX 記錄。因為在 Linux 機器上面﹐各主機本身就具備郵件交換功能(除非您將之移除了)。這裡的設定是﹐從外面通過 DNS 查詢寄往那些主機的郵件﹐會轉向 MX 上面指定的郵件伺服器。注意﹕請不要忽略了這個設定﹐尤其是負責該 domain 的郵件伺服器﹐本身一定要有一個偏好值最低的 MX 記錄指向自己﹐否則﹐會很容易得到‘loopback’的錯誤。 雖然前面我們不斷的提到過“A”記錄﹐或許您還以為會很複雜。但正如您看到的﹐‘A’記錄其實最簡單不過了﹕“主機名稱”對“IP”﹗就是這麼簡單啦。如果您沒忘記反解查詢記錄的話﹐‘A’記錄正好和‘PTR’記錄相反就是了。如果您的主機有超過一個 IP 地址﹐您也可以為它指定多個 A 記錄。 至於‘CNAME’記錄呢﹖它是一個別名記錄﹐也就是所有關於 CNAME 左面的名稱查詢﹐都會轉向 CNAME 右面的名稱再進行查詢﹐一直追蹤到最後的 PTR 或 A 名稱查詢成功﹐才會做出回應﹐否則失敗。例如﹐在正解查詢中﹐一個 IP 通常(當然也有例外)﹐只會對應一個 A 記錄﹐但我們可以使用 CNAME 在 A 名稱之上賦予該 IP 更多的名稱。也就是說﹕所有關於‘www.siyongc.domain’或‘ftp.siyongc.domain’這些名稱查詢﹐實際上都會轉向查詢‘redhat52.siyongc.domain.’這個記錄。 您看﹗這樣我們就已經設定好一個 DNS 了﹐包括反解和正解哦~~~ ^_^。 如果﹐您打算使用 DNS forwarder 的話 (也就是 DNS 可以將有關外部的 DNS 查詢轉遞給另外的機器﹐例如上一級的 DNS)﹐您可以在 /etc/named 的 options { }裡面加入這樣的句子﹕ forward first; forwarders { 203.56.8.1; 203.56.8.2; }; 但是﹐對於剛開始接觸 DNS 的朋友來說﹐常常會“硬性的”將反解和正解聯繫起來。其實在實際的設定中是非常多樣化的﹐反解和正解在許多情形下是未必一致對應的。比如我有一組 192.168.0.* 的 C Class IP ﹐我並非只能分配給 siyongc.domain 這一個 domain 。如果我喜歡﹐可以將裡面的 IP 分配給好幾個 domain 來使用。同理﹐我的 siyongc.domain 下面﹐也未必只能用 192.168.0.* 裡面的 IP﹐事實上我還可以使用其它的 IP 。很簡單一個例子是﹕我的 redhat52 這台主機﹐就有兩個網路卡﹐它們是分別屬於不同的 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’的查詢而已。 對於切割子網的 DNS 設定﹐是非常難懂的﹐您一定要對 IP 地址劃分有很清晰的了解。在以後的敘述裡﹐務必留神﹗如果您不想弄那麼複雜﹐最簡單莫過於在“父網”上面做好﹑所有子網的記錄設定。但問題是﹐如果子網那裡要進行變更﹐就一定要勞煩上級網路管理員﹐網路的靈活性當然就大打折扣了。 或許﹐在一開始弄 DNS 的時候就把子網帶進來﹐會顯得過於艱難。我這裡建議您大可先將關於子網的部份略過﹐等對 named 有一定的經驗了﹐隨時歡迎回來再看﹐也很歡迎和網中人討論心得﹗ 無論如何﹐我先得在 /etc/named.conf 為父網建立起反查詢區域﹐如下﹕ zone "35.30.203.in-addr.arpa" { type master; notify no; file "named.203.30.35"; }; 然後﹐讓我們轉到 /var/named 去建立相應的檔案﹕ ;File: /var/named/named.203.30.35 ; ; This network has been devided by 3-bit sub-net mask. ; All requests will be redirected to the coresponding sub-net NS. ; $TTL 86400 @ IN SOA redhat52.siyongc.domain webmaster.siyongc.domain. ( 2000032703 28800 14400 691200 86400 ) ; ;負責35.30.203.in-addr.arpa.(目前反解)的DNS主機是redhat52.siyongc.domain. @ IN NS redhat52.siyongc.domain. ; $ORIGIN 35.30.203.in-addr.arpa. ;設定屬於當前網路範圍 ; ;負責子網128 (27 bit mask)的DNS主機是redhat52.siyongc.domain. 128-27 IN NS redhat52.siyongc.domain. ; ;子網中的整組可用 IP 需要轉向負責該子網的 DNS 查詢 $GENERATE 129-158 $ CNAME $.128-27 ; ; ;------------------------------------------------ ;如果還有其它子網的話﹐也請一一建立好轉向.... ;------------------------------------------------ ; ;例如﹕另一子網(也是27 bit) 160.35.30.203.in-addr.arpa. 的設定﹕ 160-27 IN NS dns.sub.siyongc.domain. $GENERATE 161-190 $ CNAME $.160-27 ; ; ;[以下略...] ; 這個例子有三個 NS 記錄﹐第一個是本身區域的名稱伺服器﹔而第二個則指定了 128. 30.35.203.in-addr.arpa. 這個子網區域的 DNS 伺服器為﹕“readhat52.siyongc.domain.”(要留意最後的“.”哦﹗)﹔第三個則屬於子網 160 的 NS 。如果還有其它子網目前是運作的﹐各子網的 NS 記錄都必須在這個檔案裡面指定好﹐(就算有些子網使用相同的 DNS 主機﹐也必須如此。) 在這個特殊的“切割子網例子中”﹐因為 134 這個 IP 實際上是子網 203.30.35.128 裡面的範圍﹐但您不能在 ineternet 上面使用 203.30.35.128.134 這樣的 IP 格式的。所以﹐所有以 203.30.35 開頭的 IP﹐都會先向 203.30.35.0 這個網路查詢﹐然後再通過 CNAME 轉向其子網路 203.30.35.128 進行查詢﹐直至找到 134 為止。注意﹕在 A 和 B class 網路中的子網劃分﹐只要不超過 24bit mask 且使用完整 otec 的話﹐應該無需使用這樣的手段。 下面﹐讓我們用已經經過切割了的子網 160 來示範一下﹕ 首先﹐修改負責該子網的 DNS 主機 203.30.35.161 上面的 /etc/named.conf ﹕ options { directory "/var/named"; }; zone "35.30.203.in-addr.arpa" { type forward; forwarders { 203.30.35.137; }; }; zone "160-27.35.30.203.in-addr.arpa" { type master; notify no; file "named.203.30.35.160"; }; 這裡﹐您或許發現了一個新的 DNS 主機類型﹕forward 。因為子網主機和負責父網的主機不是同一台機器﹐所以我們就將關於父網的查詢全部 forward 到父網主機去。除非該子網有直接的 internet 連線﹐換句話說﹐它的 NS 主機可以從 root 反查詢下來﹐否則的話﹐它就查詢不到其它子網的記錄了。當然﹐您直接在 options 裡面指定 forwarders 也可以。另外還有一個方法是﹕用 slave 來做父網的 DNS 次主機。 方法很多﹐任選其一則可。您也可以參考下面例子﹐用 $ORIGIN 指定父網的 NS。 接下來﹐是 /var/named 下面的記錄檔內容﹐首先是反解﹕ ;File: /var/named/named.203.30.35.160 ; ;This is a sub-net born from 203.30.35.0 ; $TTL 86400 @ IN SOA dns.sub.siyongc.domain. root.dns.sub.siyongc.domain. ( 2000060404 28800 14400 691200 86400 ) ; @ IN NS dns.sub.siyongc.domain. ;這應該和父網指定的一致 ; $ORIGIN 35.30.203.in-addr.arpa. ;關於父網的查詢設定 IN NS redhat52.siyongc.domain. ; $ORIGIN 160-27.35.30.203.in-addr.arpa. ;關於當前子網的設定 ; 161 IN PTR dns.sub.siyongc.domain. 164 IN PTR host164.sub.siyongc.domain. ; ;其它 IP 如果沒有分配出去的話﹐可以不設。 ; 這樣﹐我們已經成功地為切割子網建立起反解查詢了。您應該知道怎麼為子網 128 設定反解了吧﹖雖然它和父網的 DNS 主機都是同一台﹐相信也難不倒您的。 接下來讓我們完成正解部份 在 DNS 系統中﹐每一個 zone 下面都可以包含有更多的 sub-zone ﹐但通常﹐我們只需為 domain 所在的第一級網域進行註冊就可以了。從前面的反解設定中﹐我們已經知道在‘siyongc.domain.’下面有一個 sub-zone 叫做﹕‘sub.siyongc.domain.’。並且有一台 IP 為 203.30.35.161 的 dns.sub.siyongc.domain 主機負責該 sub-zone 自己的記錄﹐而無需勞動上級 siyongc.domain 來管理其下的主機。 這是非常靈活的設定﹐您知道如何建立這個正解子區域嗎﹖ 下面就是我的步驟。不過﹐我想請您自己先嘗試一下設定﹐再來對照我的方法﹐看看是否一至。說不定您自己的方法更有效呢﹗當然﹐我也很歡迎您和我討論這個有趣的話題。 首先﹐我在上級主機的 /var/named/named.siyongc.domain 檔案裡面新增這幾行﹕ sub IN NS dns.sub.siyongc.domain. IN MX 10 dns.sub.siyongc.domain. $ORIGIN sub.siyongc.domain. dns IN A 203.30.35.161 IN NS dns.sub.siyongc.domain. IN MX 10 dns.sub.siyongc.domain. 第一行﹐我在 parent zone 指定了 zub zone:‘ sub.siyogc.domain.’的 DNS 主機名稱﹔第二行是該 sub-zone 的 MX 記錄﹔第三行﹐我宣告下面的設定屬於 sub.siyongc.domain 的﹔第四行指定 sub-zone 的 DNS 主機之 IP 位址。如果您不使用 $ORIGIN 這個 option的話﹐dns 應該改成 dns.sub ﹐或干脆使用 FQDN (帶點“ . ”結尾)來設定 A 記錄。 如果您了解 DNS 運作的話﹐應該知道要由其它 DNS 查詢 sub.siyongc.domain. 裡面的主機﹐會先從“.”那裡一直查詢到 siyongc.domain. 的 NS 主機﹐然後從該主機的記錄中(也就是目前這個檔案)裡面得到 sub.siyongc.doamin. 的 NS 主機﹐即﹕dns.sub.siyongc.domain. ﹐然後再從 A 記錄得到該主機的 IP 地址為﹕203.30.35.161 。有了 IP 之後﹐一切都好辦事啦。 好了﹐然後我們移師到 dns.sub.siyongc.domain 這台主機上﹐修改 /etc/named.conf 檔案﹐增加﹕ zone "siyongc.domain" { type forward; forwarders { 192.168.0.17; }; }; zone "sub.siyongc.domain" { type master; notify no; file "named.sub.siyongc.domain"; }; 接下來﹐我們在 /var/named 目錄下面建立 named.sub.siyongc.domain 記錄檔﹕ ; File: /var/named/named.sub.siyongc.domain ; ; Sub-Zone file for domain: 'sub.siyongc.domain.' ; ; $TTL 86400 @ IN SOA dns.sub.siyongc.domain. root.dns.sub.siyongc.domain. ( 2000060404 28800 14400 691200 86400 ) IN TXT "A test sub-domain, created by Netman" IN NS dns.sub.siyongc.domain. IN MX 10 dns.sub.siyongc.domain. ; $ORIGIN sub.siyongc.domain. ; localhost IN A 127.0.0.1 ; dns IN A 203.30.35.161 IN HINFO "K6-233" "RH6.2 Linux" IN TXT "A test host for sub.siyongc.domain." IN MX 10 dns.sub.siyongc.domain. www IN CNAME dns ftp IN CNAME dns news IN CNAME dns mail IN CNAME dns smtp IN CNAME dns pop IN CNAME dns ; host164 IN A 203.30.35.164 IN MX 10 dns.sub.siyongc.domain. 在當前環境來說﹐能順利申請到完整的一組 class IP 的情況實在非常少見了。這時候您很可能要需要上游 ISP 幫您做反解﹐要驚動他們是在所難免的。如果他們肯受權下來﹐那麼您自己的設計彈性就比較高﹐日後要修改也容易得多。但如果上游沒有受權的時候﹐您可千萬不要越俎代庖﹐因為設了也等於白設﹕別人還是不能從外面反查詢得到的。但是﹐如果在上游沒有授權的情況之下﹐您日後的每次修改﹐都必須要通知上游﹐才能保持資料的準確性﹐卻是十分的不方便。下面的這個方法是是一個折衷的辦法﹐您只需到上游註冊一次﹐日後的變動則完全雖您自己的意思﹕ 假設您是一個 ADSL 的用戶﹐獲得 5 個可用 IP﹐分別從 211.2.3.113 到 211.2.3.118。然後您為您目前的 domain 註冊為 my.domain。這樣﹐您首先要到上游完成反解的註冊﹐這樣設就可以了﹕ $ORIGIN 3.2.211.in-addr.arpa. ...... 114 IN CNAME 114.my.domain. 115 IN CNAME 115.my.domain. 116 IN CNAME 116.my.domain. 117 IN CNAME 117.my.domain. 118 IN CNAME 118.my.domain. ...... 然後您也無需在自己的 DNS 上面設反解﹐全部都在 my.domain 的記錄檔上面設就可以了﹕ ...... $ORIGIN my.domain. 114 IN PTR dns.my.domain. dns IN A 211.2.3.114 115 IN PTR www.my.domain. www IN A 211.2.3.115 116 IN PTR ftp.my.domain. ftp IN A 211.2.3.116 117 IN PTR pop.my.domain. pop IN A 211.2.3.117 118 IN PTR smtp.my.domain. smtp IN A 211.2.3.118 ...... 照這樣看來應該沒什麼問題了。假如您對子網劃分有些地方不理解﹐歡迎參考一篇我與網友的討論信件 (注意﹕內容是引用舊版的文章﹐所以設定上和目前的方法有所不同﹐但原理還是一樣的)。 如果子網授權有誤﹐則很容易做成 lame server 的問題。您可以參考 DNS/bind-4.9.x Lame Server 訊息所代表的意義 ( 理論篇 ) 這篇文章認識問題產生的理論﹐然後進行修正。 關於 DNS 的安全問題 DNS 系統在網路溝通上面提供了非常便利的途徑﹐一個設定完整的 DNS 系統﹐無論在管理或除錯方面都是非常有效的。然而﹐在許多網路入侵案例中﹐往往因為 DNS 提供的信息過多﹐而讓入侵者省卻了許多步驟和時間﹐這也減少了檢測到入侵的機會。 所以﹐如果有條件的話﹐最好設定多台 DNS 服務器﹐只讓其中一或二台對外(internet)提供服務。在這些對外服務的機器上﹐我們只設定最少的必須記錄就可以了﹐千萬不要把 HINFO 等一些關於主機和網路環境的記錄寫進去。同時﹐任何不必要對外提供的 IP 和主機記錄﹐一概刪除就是了。而其它的僅為內部網路提供服務的主機﹐則無論如何也不要讓過多的 DNS 信息流出 internet。您可以通過火牆過濾來保護內部的 DNS 資訊。 為獲得更好的安全效果﹐您可以在 /etc/named.conf 檔案中設定一些限制﹐讓 DNS 僅對那些信任的網路或主機提供服務。下面﹐讓我們看一下安全設定的例子﹕ //---File: /etc/named.conf // //---首先定義各安全群組---// acl TRUSTED_net { localhost; 192.168.0.0/24; 203.30.35.160/27; }; acl DMZ_net { 203.30.35.128/27; }; acl TRUSTED_host { 192.168.0.17/32; 203.30.35.161/32; }; acl BAD_Guys { 38.38.38.38; 44.44.44.44; 110.110.110.110; }; //-注﹕ip 僅作例子﹗-// //---然後在 options 中設定預設原則---// options { directory "/var/named"; allow-transfer { none; }; allow-query { none; }; blackhole { BAD_Guys; }; }; //---在各區域中另行設定安全原則---// zone "." { type hint; file "named.ca"; }; zone "0.0.127.in-addr.arpa" { type master; file "named.local"; allow-query { any; }; }; zone "0.168.192.in-addr.arpa" { type master; file "named.192.168.0"; allow-query { TRUSTED_net; }; allow-transfer { TRUSTED_host; }; notify yes; also-notify { 192.168.0.20; }; }; zone "35.30.203.in-addr.arpa" { type master; file "named.203.30.35"; allow-query { TRUSTED_net; DMZ_net; }; allow-transfer { TRUSTED_host; 203.30.35.134; }; notify yes; also-notify { 203.30.35.134; 203.30.35.161; }; }; zone "128.35.30.203.in-addr.arpa" { type master; file "named.203.30.35.128"; allow-query { TRUSTED_net; }; }; zone "siyongc.domain" { type master; file "named.siyongc.domain"; allow-query { TRUSTED_net; }; allow-transfer { 192.168.0.20; 203.30.35.161; }; notify yes; also-notify { 192.168.0.20; 203.30.35.161; }; }; zone "siyongc.domain.nt" in { type slave; file "slave.siyongc.domain.nt"; masters { 192.168.0.20; }; allow-update { 192.168.0.20; }; }; 在設定 DNS 的安全原則的時候﹐有些問題您必須注意﹕ 當這一個區域作為 master 且有其它 slave 指向它的時候﹐slave 主機必須同時被包括在 allow-query 和 allow-transfer 設定中才可以完成區域轉移。 那些不在 allow-query 設定當中的主機﹐雖然不能夠直接將 server 指向這台 DNS 來查詢所在區域。然而﹐如果對方先將 server 指向另一台 DNS 主機﹐且它是屬於 allow-query 設定之中的話﹐也可以對該區域進行查詢。 例如﹐如果在 zone "siyongc.domain" 當中允許 DMZ_net 的查詢。雖然從外面的主機不能直接查詢這個 zone (假設火牆對 DNS 查詢是開放的)﹐但只要對方將 server 指向 DMZ_net 其中任一台 DNS 主機﹐而該主機的 allow-query 可以讓其通過的話﹐那他們也就可以查詢 siyongc.domain 了。 實質上﹐also-notify 並不能限制區域轉移的進行﹐它只不過可以讓 master 通過 push 的方式去通知其中的 slave 主機罷了。任何一台 DNS﹐只要通過了 allow-transfer 和 allow-query 檢查﹐就可以用 pull 的方式進行區域轉移了。 讓您的設定生效 當您以為所有設定檔都設定好之後﹐最想做的事情莫過於要測試一下啦。但在測試之前﹐我們得要重新啟動 named ﹐否則﹐您測試出來的還是舊資料。聰明的您或許已經知道使用 /etc/rc.d/init.d/named restart 來重新啟動DNS 服務﹐但﹐我這裡還有更懶的方法哦﹕ ndc restart 按上面輸入即可﹗哈哈~~~ 是不是您最想要的呢﹖ 測試 DNS DNS 可以說是一個 client / server 系統。server 那端的設定就是我們前面一起設定下來的艱辛歷程﹔而 client 這端我們也需要設定哦﹕首先您得要為 Linux 客戶機指定好 DNS主機地址。也就是修改 /etc/resolv.conf 這個檔案﹐將您剛設定好的 DNS 主機 IP 放在檔案的前排位置﹐如﹕ nameserver 192.168.0.17 nameserver 139.175.10.20 如果要測試我們的設定是否生效﹐我們可以使用的方法有很多﹐其中最常用的是 nslookup 命令。關於 nslookup 我已經在“網路基礎”中的“DNS 協定”有很詳細的例子﹐這裡不再重複。 如果我們在測試中失敗﹐例如 nslookup 回應說﹕ *** redhat52.siyongc.domain can't find dns.sub.siyongc.domain: Non-existent host/domain 這通常是反解記錄沒設定好的緣故﹐或者是 named 還沒傾聽 PRT 指定的界面。請確定反解那裡包括 DNS 主機本身﹐而且可以被 DNS 追查得到。 有時候 nslookup 停在某處不動了﹐其實它不是當掉了﹐而是在查詢沒結果之後等 time out 而已。您可以按 Ctrl C 終止查詢﹐再打 exit 跳出來。不過﹐如果您在按了 Ctrl C 之後接著再輸入一個無結果的查詢﹐那就好可能將 nslookup 當掉。這樣您必須登錄進另外一個 terminal ﹐然後用 kill 將 PID 殺掉。 如果 nslookup 查詢的結果未如您所預期的﹐您就要進行 debug 工作了﹐在我們動手查看設定檔和記錄檔之前﹐有一個地方很值得我們去看看的。在您輸入 ndc restart 之後﹐接著輸入﹕ vi /var/log/messages 然後按“G”鍵(大寫)跳到檔案末尾部份﹐如果您看到諸如這樣的敘述﹕ Nov 26 23:33:14 redhat52 named[3078]: named sh
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-17 16:02:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!