Linux DNS Server.doc

(258 KB) Pobierz
Linux DNS Server 安裝

Linux DNS Server 安裝

(一)、DNS 介紹

DNS 全名是 Domain Name System, 電腦在網路透過 DNS 系統, 可以由一部機器的 domain name 查其 IP, 也可以由機器的 IP 反查它的 domain name, 除此之外 DNS  還與 Mail System 結合, 提供 Mail routing 的功能.

Domain Name Space

整個網際網路上的電腦如此眾多, 如何保證兩部電腦不會有相同的網域 domain name/IP 是一個很重要的問題. 幾個重要的觀念如下

Domain (網域)

將整個 internet 分成許多domain, 每個 domain下又細分為許多 domain, 然後這些細分的 domain 視實際需求又再細分成許多 domain, 一直循環下去. 基本上每個 domain 內的 mapping 由一部主機負責管理.

top level domain - com, edu, gov, mil, net, org, int (現在又多出一些 top domain 了如 isp, art 等)




 

Delegation (授權)

每個 domain 都可因實際需求再細分成許多 sub domain. 上層的 domain 可以將其分出的某個 sub domain 的 domain name 與 IP mapping 交由另一部機器管理, 這個動作我們稱之為 delegation (註: 注意與authority之不同)

Forward/Reverse(正解/反解)

在講到 domain name <-> IP mapping, 其實應該看成兩個命名空間:

一個是 domain name -> IP, 稱之為 forward mapping,  在這個命名空間中就是先分成前面提到的那些 top domain, 再細分 sub domain, 再細分... 比如說 winnie.corp.hp.com -> 15.16.192.152 代表在負責  corp.hp.com 這個 sub domain 的機器上, 可以查到其 mapping table 上有一筆記錄是 winnie -> 15.16.192.152.

一個是 IP -> domain name 稱為 reverse mapping. 在這個命名空間中, 所有的 IP 組成一個叫作  arpa.in-addr 的 top domain, 然後再依 IP 層層細分... 比如說 15.16.192.152 -> winnie.corp.hp.com 代表在負責 192.16.15.in-addr.arpa(注意是反過來寫, 因為 top domain 要在最後面) 這個 sub domain 的機器上,  可以查到其 mapping table 上有一筆記錄是 152 -> winnie.cop.hp.com

值得注意的是:
a. 負責 forward mapping 和 reverse mapping 的機器不一定是同一部 負責 corp.hp.com domain 與負責 192.16.15.in-addr.arpa 的機器不一定是同一部機器,

b. forward與reverse database entrie對應的一致 負責forward與reverse mapping二者對應的一致是dns管理者不是機器, 在更動fqdn或ip時管理者應注意一致
c. domain 與 ip subnet 並沒有一對一關係

舉例而言東華的 domain 是 ndhu.edu.tw, 但是因為內部機器數多的關係, 所用到的 IP subnet 有 203.64.88-115, 203.64.16-20, 192.192.172-176, 163.28.160-175 共 4 組

 

(二)、Name Server



負責記錄 forward/reverse mapping 的機器會執行一個叫 name server 的軟體, 透過這個軟體回應來自其它機器對 domain name 或 IP 的查詢

zone & domain

上面提到基本上每個 domain交由一個機器來負責, 其實更精確地說應該是每個 zone 交由一個 name server 來負責, 所謂 zone 就是把一個 domain 扣掉分給下層負責的部份, 剩下來的就是 zone

Primary/Secondary (master/slave)

每個 zone 交由一部 name server負責的作法會有一個問題, 萬一這個 name server 當掉, 可能造成 INTERNET 上其它機器無法取得屬於這個  zone 的資料(就是 domain name ip mapping). 為了避免這種情形, 我們可以把這個 zone 的資料同時交給多部 name server 負責.原本的這部稱為 primary(master) name server, 其它的稱為 secondary(slave) name server. Secondary name server 會定期將 primary name server 上 zone 的資料拷貝一份下來備用(稱之為zone transfer).

對於上層的 name server 而言, 它只是設定某個 zone 同時 delegate 給一部以上的下層 dns server, 但是它並不去分辨誰是真正的 primary, 誰是 secondary. 它只是依據順序尋問, 當第一部負責某個 zone 的 dns server 當掉時, 它會依序找下一個負責的 dns server.

ps: primary/secondary 在新版 name server 程式中改稱為 master/slave
 

(三)、Name Resolution (名稱解析, 名稱查詢)

以下介紹名稱查詢運作時一些重要名詞或觀念

1. Resolver
相當於是 DNS server 的 client 端, 通常是以函式庫的方式被放在整套作業系統中, 各類的應用程式經由呼叫這個 resolver 函式庫可以很容易地向 DNS server 進行查詢, 得到所要的資料. (/usr/local/bind/lib/libbind.a)

Root Name Server

在查詢資料時, 總是要有一個起點, 當一個 local DNS server 收到來自 client 端關於一個 domain name 的查詢, 這個 local DNS server 怎麼知道這個 domain name 的相關資料是記錄在 INTERNET 中的哪一個 DNS 上呢? 答案是向 root name server 尋問. root name server 記錄了各 top domain 分別是由哪些 DNS server 負責. 比如說要找 www.yohoo.com 時, root name server 會告訴 local DNS server 哪部 name server 負責 .com 這個 domain, 然後 local dns 再向負責 .com 的 name server 詢問關於 yohoo.com 是哪部 name server 在負責. 最後 local DNS 就可以向負責 yohoo.com 的 name server 問到有關 www.yohoo.com 的資料.

註: 考量 root name server 會被全世界的 DNS sever 詢問, 負擔很大, 在世界各地共有十多個root name server. 而每個 name server 軟體都附有一個文字檔, 其中記錄了這十多個世界知名的 root name server 的 IP 位址(A.ROOT-SERVERS-NET. -- M.ROOT-SERVERS-NET.)

 

Recursive Query

在上面介紹的過程中, DNS client 端只丟出一個詢問給 local DNS server, 然後 local DNS 就會不斷地查到答案出來為止, 最後把結果傳回來給 client, 這種查詢稱為 recursive query


 

上圖中 DNS client 端(resolver) 向 local DNS server 進行 recursive query, 查 girigri.gbrmpa.gov.au 的 IP. local DNS server 會由 root name server 開始問起, 依序找到負責 .au domain 的 DNS server, 負責 .gov.au domain 的 DNS server, 負責 gbrmpa.gov.au domain 的 DNS server, 最後在負責 gbrmpa.gov.au 的 DNS server 問到 girigri.gbrmpa.gov.au 的資料, 然後傳回給 DNS client (resolver).

Iterative Query

前面的介紹中, local DNS 對其它 DNS 發出的詢問, 都只是知道一個更進一步的線索, 然後發問者(local DNS)根據線索再去進一步找答案, 這種詢問方式稱為 iterative query

ps:
a.一般說來, resolver 對 local DNS server 都是 recursive query, 而 DNS server 之間的 query 多是iterative.
b.大部份的 DNS server 都可以接受 recursive iterative 兩種 query 方式, 但是考量負載問題,  root name server 只接受 iterative query.

DNS Caching

由前面的敘述我們可以了解由 resolver 發出一個 query 給 local DNS, 到最後 local DNS 把答案傳回來, 中間需要許多次的查詢, 為了節省這些反覆查尋的時間, DNS server 會把查到的結果暫存一陣子, 這麼一來當有其它機器發出相同詢問時, 就可以省下不少的時間.
舉例而言, 在一次詢問 www.ndhu.edu.tw 的過程中, local DNS 上可以得知
a. 負責 .tw 的 name server IP
b. 負責 .edu.tw 的 name server IP
c. 負責 .ndhu.edu.tw 的 name server IP
d. www.ndhu.edu.tw 的 IP
除了有機器再次查詢 www.ndhu.edu.tw 會變快外, 查詢和 a, b, c 相關 domain 的資料也會變快, 因為 local DNS 不必再從 root name server 一層層問下來.

ps: 當 local DNS 偷偷記下一些資料以便加速時, 萬一真正的資料有修改時怎麼辦呢? DNS server 針對它負責的 domain 資料有一個 TTL(time to leave)參數, 用來告訴其它 DNS 在 cache 其資料時, 資料只應該 cache 多久. 超過 TTL, 那個 cache 就要視為過期無效.

 

Domain Name驗證流程

               reverse                             forward
IP Addr. A --------> domain name B ----------> IP Addr. C
其中IP Addr. C (可能是一個group), 必需包含或等於A, 才算通過DNS查驗

對於絕大部分的校園網路而言,所需架設的DNS大都只應付一個Class C以下的領域,因此有關DNS的組態及領域正反解檔,大抵必須存在四個檔案,在Redhat裡,內定Name Server DNS的簡稱) 的組態檔為named.conf 固定放置在/etc目錄下,而其它領域宣告檔內定於 /var/named目錄下,其結構為:

/etc/named.conf ;領域型態組態檔
/var/named/named.localhost.arpa ;本機反解宣告檔
/var/named/named.domain ;領域正解宣告檔
/var/named/named.domain.arpa ;領域反解宣告檔
 

(四)、安裝 DNS (Linux Redhat)

當您安裝Redhat 6.0時是以Server等級安裝系統,系統並未安裝DNS Server;若您是以Custom等級安裝系統,記得選取「Named Server」及「BIND」相關套件。目前最常使用DNS Server是 BIND8.2,Redhat 6.0(+Cle)光碟已內附,您可不必上網下載,安裝BIND套件步驟如下:
1、步 驟:
1. # mount /mnt/cdrom
2. # cd /mnt/cdrom/Redhat/RPMS/。
3. # rpm -Uvh bind-*。
  上述的安裝步驟會幫您安裝:bind-8.2-6.i386.rpm、bind-devel-8.2-6.i386.rpm、bind-utils-8.2-6.i386.rpm等三個套件,其中bind-8.2-6.i386.rpm是安裝BIND 8.2主要程式與套件,bind-devel-8.2-6.i386.rpm是安裝BIND的發展套件,bind-utils-8.2-6.i386.rpm則是安裝nslookup等DNS查詢必備工具,頭尾兩項套件缺一不可。安裝好BIND後,DNS Server尚未啟動,即使重新開機後也不會自動啟動,您可使用linuxconf設定Redhat Linux一開機後就自動啟動BIND,請依下列步驟設定:
2 步 驟:
1. 以 root身分登入主機。
2. # linuxconf。(啟動linuxconf)
3. 按一下「Control」、「Control panel」。
4. 按一下「Control service activity」項目。
5. 設定「named」項目為啟動,再按下 [Accept] 鍵即可。
注意:BIND DNS Server的服務名稱固定稱為named,事實上當您啟動named後,DNS Server就開始運作了。
若是要立即啟動DNS Server,可輸入如下命令:
# named & 或是
# /etc/rc.d/init.d/./named start
若是要停止DNS Server服務,則可輸入如下命令:
# /etc/rc.d/init.d/./named stop

 

2、BIND的結構

安裝好DNS Server後,就算是啟動DNS也不能正常運作,您必須撰寫DNS組態檔、本機正反解檔及領域正反解檔,由於所使用的DNS版本是BIND 8.2,因此以一個class c以下的網域為例,最一般化的DNS組態檔及正反解領域宣告檔必須存在四個檔案,在Redhat裡,內定Name Server (DNS的簡稱) 的組態檔為named.conf 固定放置在/etc目錄下,而其它領域宣告檔內定於 /var/named目錄下,其結構為:
/etc/named.conf ;領域型態組態檔
/var/named/named.localhost.arpa ;本機反解宣告檔
/var/named/named.domain ;領域正解宣告檔
/var/named/named.domain.arpa ;領域反解宣告檔
   注意:您會發現上述省略了本機正解宣告檔,這是因為對於任何一部主機而言,必定存在一虛擬機器名稱:localhost及虛擬機器IP位址127.0.0.1,為了讓Name Server能夠運作正常,當然也要對本機的虛擬Domain(localhost)及虛擬IP(127.0.0.1)做正反解宣告檔。不過對於localhost這個名稱而言,並不需要個別成立一個宣告檔,一般而言都宣告在領域正解檔裡,若是獨立成一個宣告檔也可以。除了基本的named.conf 檔固定放在 /etc 目錄下外,其餘的宣告檔,目錄及檔名是可以更改的。
【說明】
1. named.conf:在此檔裡您必須指明各類正反解檔的讀取目錄,並且宣告本機正反解領域及主機的正反解領域,而領域宣告檔的多寡視您網域大小而定。下面列出讀取本機正反解領域及主機正反解領域宣告檔所在目錄的定義形式:
options {
directory "/var/named";
};
2. named.localhost.arpa:本機領域反解宣告檔,在此檔裡您必須宣告本機的反解檔,即127.0.0.1對應到localhost,對於任何DNS主機而言,此檔的設定皆一樣的。例如:

@ IN SOA redhat.test.edu.tw. kao.test.edu.tw. (
1999032401 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ; default_ttl
)
@ IN NS redhat.test.edu.tw.
1 IN PTR localhost.

本機反解檔在 /etc/named.conf 檔裡定義如下:
zone "0.0.127.in-addr.arpa"{
type master;
file "named.localhost.arpa";
};

3. named.domain:領域正解宣告檔,通常以一個class C網域以下的規模定義一個領域正解宣告檔,網域內所有機器的領域名稱與IP Address的正解對應關係,均在此檔裡宣告,例如:
@ IN SOA redhat.test.edu.tw. kao.test.edu.tw.
(
1999032401 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ; default_ttl
)
@ IN NS redhat.test.edu.tw.
localhost IN A 127.0.0.1

mail IN MX 10 redhat.test.edu.tw.
redhat IN A 192.168.1.10
freebsd IN A 192.168.1.20

www IN CNAME redhat
ftp IN CNAME redhat
proxy IN CNAME freebsd
mail IN CNAME freebsd

而網域的領域名稱(Domain Name)則在 /etc/named.conf檔裡事先指定,例如:
zone "test.edu.tw"{
type master;
file "named.test";
};

4. named.domain.arpa:領域反解宣告檔,網域內所有機器的IP Address對應到領域名稱的反解對應關係,均在此檔裡宣告。如下所示:
@ IN SOA redhat.test.edu.tw. kao.test.edu.tw.
(
1999032401 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ; default_ttl
)
@ IN NS redhat.test.edu.tw.

10 IN PTR redhat.test.edu.tw.
20 IN PTR freebsd.test.edu.tw.

注意:或許您會納悶,既然本機的虛擬名稱localhost可以在領域正解檔裡宣告,為什麼本機的虛擬IP位址不能在領域反解檔裡宣告,您可注意到上述的領域反解檔裡,每一個領域尾碼的IP值如 10(即 192.168.1.10.)對應到一個領域名稱redhat.test.edu.tw.,當您在領域正解檔宣告了如下敘述:
vodserver IN A 192.168.1.1
那麼在領域反解檔裡應宣告:
1 IN PTR vodserver.test.edu.tw.
在此反解檔裡所宣告的IP值,是屬於192.168.1網域裡的尾碼,此時127.0.0.1因為不屬於192.168.1網域,也就無從宣告。因此,必須特別為127.0.0.1成立一個本機反解宣告檔。
而localhost的領域全名為localhost.test.edu.tw. 屬於test.edu.tw.領域,故可以在領域正解檔裡宣告為:
localhost IN A 127.0.0.1
領域反解檔必須在/etc/named.conf檔裡定義如下:

zone "1.168.192.in-addr.arpa"{
type master;
file "named.test.arpa";
};

 

五、/etc/boot.conf組態檔

看了前面對DNS簡單的敘述後,相信現在起碼您應該知道建立DNS的第一步就是撰寫 /etc目錄下的named.conf組態檔。

假設筆者目前欲建立的DNS其領域為 test.edu.tw,而此領域的IP網域為192.168.1.0這組 class C網域,首先請您先決定存放領域正解宣告的檔案名稱,如named.test,以及反解宣告的檔案名稱,如named.test.arpa,至於本機反解檔名稱不妨就定為 named.localhost.arpa,則named.conf組態檔可撰寫如下:

options {
directory "/var/named";
};
zone "." {
type hint;
file "named.ca";
};
zone "test.edu.tw"{
type master;
file "named.test";
};
zone "1.168.192.in-addr.arpa"{
type master;
file "named.test.arpa";
};
zone "0.0.127.in-addr.arpa"{
type master;
file "named.localhost.arpa";
};

【說明】
1. 在named.conf檔裡,首先須指明各領域的正反解宣告檔放置在何處(目錄),您可使用指令options進行宣告,在options指令後以 {}; 符號承接成為一段宣告,在{}裡利用directory指令指明各領域的正反解宣告檔所放置的目錄,注意到目錄名稱須以 "" 符號括住,並在其後加上 ; 符號,許多初學DNS者常漏了 ; 符號,在此特別聲明須小心留意。

options {
directory "/var/named";
};

2. 還記得領域名稱無論是正解或是反解的搜尋都是從 .(根領域)開始吧!因此就必須為 . (根領域)先定義一個起始領域,以named.ca宣告,這是個Domain 的Database 檔,在此檔裡必須宣告一些世界上的根名稱伺服器,當啟動named時就會載入DNS的cache中,隨時提供DNS系統使用,否則如何從 . 查詢呢?原則上在安裝BIND套件後Redhat會在/var/named目錄下自動產生root.cache檔,您可使用此檔做為Domain 的Database 檔,筆者將此檔更名為named.ca,並且在 named.conf 檔裡以指令 zone 宣告如下:

zone "." {
type hint;
file "named.ca";
};

注意:指令 zone 可用來定義領域,指令 file 則指定哪一個檔案用來做Domain 的Database 檔。

3. 定義正解領域名稱可使用指令 zone做宣告,您必須注意的是,當您定義了正解領域名稱,如:test.edu.tw(末尾無須加上 . ),DNS會自動將此正解領域名稱(test.edu.tw末尾加上 . :test.edu.tw.)記憶在DNS系統裡,做為正解檔裡DNS系統變數 $ORIGIN及@ 符號的值;在反解檔裡亦是如此。宣告領域正反解檔時,所使用的DNS主機型態一般皆為 master 型態,即主要DNS伺服器。您可在 named.conf 檔裡定義如下:

zone "test.edu.tw"{
type master;
file "named.test";
};

指令 type可用來定義DNS的型態,通常是master(主要DNS)。指令file用來指定宣告領域正解檔的確實檔案名稱。在安全的考量下,在一個網域裡建議設置兩部DNS Server,一部做為主要DNS(master),另一部做為次要DNS(slave),當主要DNS掛掉,次要DNS就能立即取代主要DNS提供服務。

4. 定義反解領域名稱也是使用指令 zone做宣告,您必須注意的是,當您定義了反解領域名稱,如:1.168.192.in-addr.arpa(在反解解析樹裡從下往上搜尋),.in-addr.arpa是固定的定義格式,請勿更換其它字眼。當定義好反解領域名稱後,DNS會自動將此反解領域名稱記憶在DNS系統裡,做為DNS系統變數 $ORIGIN (反解檔裡)的值,而在領域反解檔裡,1.168.192.in-addr.arpa這個反解領域名稱也可使用@ 符號替代。。您可在 named.conf 檔裡定義如下:

zone "1.168.192.in-addr.arpa"{
type master;
file "named.test.arpa";
};

5. 最後,所需要定義的是本機反解領域,不用多說,當然是0.0.127.in-addr.arpa,如定義如下所示:

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

[ 回目錄 ]

六、領域正解檔的宣告方式

千萬不要認為領域正解檔的宣告方式很難,筆者以nam...

Zgłoś jeśli naruszono regulamin