2010年2月24日 星期三

BIND 介紹

BIND 介紹

BIND 是 Berkeley Internet Name Domain 的縮寫, 是目前被使用得最廣泛的 name server. 原本 bind 的版本一直在 4.8.x, 4.9.x 左右, 後來因為功能上作大幅改進, 並且改掉一些 security hole, 版本一口氣跳到 8.1.x, 目前最新的版本到 8.2(1999/May/11). FreeBSD 3.1 內建附的是 8.1.2.

BIND 8.x 版的新功能

  • DNS Dynamic Updates (RFC 2136)
  • DNS Change Notification (RFC 1996)
  • Completely new configuration syntax
  • Flexible, categorized logging system
  • IP-address-based access control for queries, zone transfers, and updates that may be specified on a zone-by-zone basis
  • More efficient zone transfers
  • Improved performance for servers with thousands of zones
  • The server no longer forks for outbound zone transfers
  • Many bug fixes
詳細的內容, 請參考 BIND-8.x source 目錄下的 doc/html/index.html (FreeBSD 放在 /usr/src/contrib/bind/doc/html/index.html )

BIND 的設定檔 named.conf

BIND 的主程式是 /usr/sbin/named, 執行的時後會去讀取 /etc/namedb/named.conf 這個設定檔

ps: 如果是 RedHat Linux, 會去讀取 /etc/named.conf

每部 name server 主要就是負責某些特定 zone 中有關機器的 domain name, IP 的查詢, 127.0.0.1 這個 IP 的查詢, 除此之外, name server 也需要知道要怎樣去找 root name server. 這些資料都被放在所謂的 zone file 中, 而根據 named.conf的內容, named 才能找到所要的 zone file

ps: 127.0.0.1 是每部電腦都會有的 loop back interface 的 IP, 每部機器針對來自自己的連線, 都視為是由 127.0.0.1 來的, 這時可能會想要向 name server 反查詢 127.0.0.1 IP 的 domain name, 所以 name server 上會準備這個 IP 的 reverse record.

一個 named.conf 的例子

如上圖所示, 這個基本的 name server 負責 school.edu.tw與 172.16.1 的查詢, 接下來的說明都是以這個 name server 作例子, 以下是其 named.conf 的內容
options {
directory "/etc/namedb";

// rely forwarder to do dns iterative query to save some traffic.
// ps:163.28.112.1 is dns of ncku.edu.tw !
/*
forwarders {
163.28.112.1;
};
*/
};

// set db file for root dns, 127.0.0.1,
// set db file school.edu.tw(forward query)/172.16.1(reverse query)

zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
zone "school.edu.tw" {
type master;
file "school.edu.tw.hosts";
};
zone "1.16.172.IN-ADDR.ARPA" {
type master;
file "172.16.1.rev";
};

在 named.conf 中, 空白行或是用 // 開頭或是用 /*與 */ 包夾起來的部份都會被忽略不計.
每一行 statement 用 ; 作結尾, 多行的 statement 可再構成一個 block, 每個 block 用 { } 包起來當成一個大 statement, 也是用; 作結尾.

options block 中是有關 named 功能的一些設定

directory - 指出 zone file 要放在哪個目錄中, FreeBSD 內定是放在 /etc/namedb (RedHat Linux 則是放在 /var/named)

forwards - 告訴 named 在處理一個 client 端送來的 query 時, 將它再轉(recursive query)給其他的 name server 處理, 而不要自己由 root name 一個個去問下來, 如果一段時間 forwarder 沒有回應, named 還是會自己去進行這個 query (iterative query)

ps: forwarder 可以減少 name server 對外的 traffic, 適合用在對外頻寬不大的情形

zone block 共有四個, 指明各個 zone 相關的 record 要到哪個檔案中去找, 及 name server 在 zone 中擔任的是 master 還是 slave server

name server 的資源記錄 (resource record)

前面說到所有要被查詢的資料都是放在 zone file 中, 除了少數的控制命令外, 都是一筆一筆的 resource record(有時也稱 RR)

1.一筆 resource record 的表示法為

domain
代表要對應的名稱
opt_ttl
代表這筆 record 的 TTL(Time To Live), 意思是當其它的 DNS server cache 這筆 record 時, 最長不應該超過這個時間, 這個參數可以不寫
opt_class
目前只能填 IN, 代表 internet
type
resource record type 有很多種, 以下介紹一些常用的 resource record type.

SOA
Start Of Authority, 這種 record 放在 zone file 一開始的地方, 描述這個 zone 負責的 name server, version number, maintainer 資料, 以及當 slave server 要備份這個 zone 時的一些參數.
NS
name server, 定義某個 domain 是由哪個 name server 負責
A
address, 定義某個 domain name 對應的 IP
PTR
pointer, 定義某個 IP 對應的 domain name
CNAME
canonical name, 定義一個別名及其真正對應到的 record
MX
mail exchanger, 定義某部機器的 mail exchanger, 所有要送往那部機器的 mail 都要經過 mail exchanger 轉送

當一部機器 hostC 在 DNS 有如下的 MX 記錄時,

hostC IN MX 50 hostB.ee.ncku.edu.tw
hostC IN MX 100 hostD.ee.ncku.edu.tw

代表的意義是 hostB 和 hostD 是 hostC 的 mail exchanger, 且 hostB 的優先權比 hostD 高
(把數值想像成到 hostC 的相對距離, 越近優先權越高), 參考下面這個例子


hostA 在有信件送往 hostC 時, 會先到 DNS server 查詢 hostC 的 MX 記錄, 找到最高優先權的 mail exchanger, 也就是 hostB, 因此雖然收信人是 user2@hostC, hostA 還是會將信件送往 hostB.
hostB 在收到這封信件後, 發收收信地址主機是 hostC 而不是自己, 它會將信件再轉往 hostC. 在這個例子中, hostB 接受 hostA轉來, 但目的地卻是 hostC 的信件, 並將之送往 hostC, 我們稱 hostB 這個動作叫 Relay.

ps: 當 hostA 找到 hostB 和 hostD 這兩個 mail exchanger 時, 它會先嘗試透過優先權較高 (數值較小) 的 host B傳送信件, 當 hostB 當掉時, hostA 會改透過 host D 去送信, 但是當 hostD 要這封信送往 hostC 時, 一樣會到 DNS 查詢 hostC 的 MX 記錄, 把信件轉往比自己優先權高的 hostB.此時若是 hostB 仍然是當掉的, 那麼信件會被放在 hostD 的 mail queue 中, 等待時間再送往 host B
也就是說 MX 中優先權最高(即離目的地最近)的那個, 一定要被經過

resource_record_data
對應到的資料, 一般就是所要查詢資料對應的 domainname 或是 IP

2.最常用的控制命令是

$ORIGIN

設定 origin domain, 代表從這行以下開始的 resource record 的 欄位, 如果寫的時後沒有以 . 作結束, 都會自動加上 origin domain 再解釋

ps: 所有可以填名字或 IP 的地方都要注意這個規則, 沒有以 . 作結束, 都會自動加上 origin domain 再解釋

BIND 的 zone file

一個 BIND name server, 至少會有兩個 zone file,

named.root
含有指向 root name server 的 record, 根據這個 file, dns 在進行查詢時才知到要從哪裡問起
這個檔案在 name server 裝起來時就會內建, 不用我們操心

localhost.rev
含有 127.0.0.1 這個 IP 的 reverse record, 因為這是每部電腦 loopback interface 所用的 IP, 所以要準備好待查. 這個檔案在 FreeBSD 下可以自動產生

cd /etc/namedb
sh make-localhost

除了上述兩個 zone file 外, 通常還會有兩個 zone file, 一個負責 domain name 到 IP 的查詢, 一個負責 IP 到 domain name 的查詢

school.edu.tw.hosts
含有所有位於 school.edu.tw 這個 zone 內機器的 forward record.
1 ;
2 ; This is db file for school.edu.tw
3 ;
4
5 @ IN SOA mail.school.edu.tw. root.mail.school.edu.tw. (
6 1999051401 ; Serial
7 3600 ; Refresh
8 300 ; Retry
9 3600000 ; Expire
10 3600 ) ; Minimum
11 IN NS mail.school.edu.tw.
12
13 $ORIGIN school.edu.tw.
14
15 localhost IN A 127.0.0.1
16 mail IN A 172.16.1.250
17 www IN CNAME mail.school.edu.tw.
18
19 ; user pc
20 pc1 IN A 172.16.1.1
21 pc2 IN A 172.16.1.2
22 pc3 IN A 172.16.1.3
23 pc4 IN A 172.16.1.4
24 pc5 IN A 172.16.1.5
25 pc6 IN A 172.16.1.6
26 pc7 IN A 172.16.1.7
27 pc8 IN A 172.16.1.8
28 pc9 IN A 172.16.1.9
29 pc10 IN A 172.16.1.10

為了方便說明, 上面列出的內容前面多了行號

第 1-3 行:
註解, 所有凡是位在 ; 之後的都是註解

第 5-10 行:
SOA record, 其中 @ 這個符號是縮寫, 代表 named.conf 中這個 zone file 所對應的 zone
以這個例子來說就是 school.edu.tw
SOA 後面的兩個參數是指這個 zone file 是在哪部主機定義的, 以及這個 zone file 的負責人(注意是寫成 root.mail.school.edu.tw 不是 root@mail.ncku.edu.tw)
然後是用括號括起來的 5 個參數, 分別有註解說明
Serial
代表這個 zone file 的版本, 每當 zone file 內容有變動, name server 管理者就應該增加這個號碼, 因為 slave 會將這個號碼與其 copy 的那份比對以便決定是否要再 copy 一次 (即進行 zone transfer)
Refresh
slave server 每隔這段時間(unit:second), 就會 check master server 上的 serial number
Retry
當 slave server 無法和 master 進行 serial check時, 要每隔幾秒 retry 一次
Expire
當時間超過 Expire 所定的秒數而 slave server 都無法和 master 取得連絡, 那麼 slave 會刪除自己的這份 ocpy
Minimum
代表這個 zone file 中所有 record 的內定的 TTL 值, 也就是其它的 DNS server cache 這筆 record 時, 最長不應該超過這個時間

第 11 行:
NS 記錄, 值得注意的是這個 record 沒有第一個欄位. 當一個 resource record 沒有 domain 欄位時, 就從上一筆 resource record 繼承下來, 所這行應該看成

@ IN NS mail.school.edu.tw.

再考慮 @ 是縮寫, 將其展開後變成

school.edu.tw. IN NS mail.school.edu.tw.

第 13 行:
設定 origin domain, 注意要以 . 結束. 意思是說從這行以後出現的 record, 如果其 domain 欄位沒有以 . 結束的話, 都自動加上這個 origin domain
ps: 其實這行可以不寫, 因為一個 zone file 的內定的 origin domain 就是 @ 也就是這個 zone file 在 named.conf 中對應的 zone, 不過我碰過當 name server 同時是多個 zone 的 master 時, 不加這行會怪怪的, 所以強烈建議加上去

第 15 行:
設定 localhost 對應的 IP, 不過因為 domain 欄位不是以 . 作結束, 所以這行代表的是

localhost.school.edu.tw IN A 127.0.0.1

第 17 行:
定義 www.school.edu.tw. 的正式名稱是 mail.school.edu.tw., 也就是說 www.school.edu.tw 是別名,意思是當收到查詢 www.school.edu.tw 的 IP 的 query 時, 會告訴對方說 "this is an alias, please check the real name mail.school.edu.tw".
透過 CNAME, 我們可以讓兩個名字共用一個 IP

ps:針對一個名字, 也可以透過重覆定義讓其對應到不只一個 IP, 這樣一來 name server 會依序每次傳一個給 resolver.

ps:注意對 CNAME 這個 record type 而言, 最後欄位放的也是 domain, 也就是說如果寫全名的話, 一定要寫 .作結束. 否則也會被加上 origin domain.
舉例而言, 如果這行改成

www IN CNAME mail.school.edu.tw

那麼代表的意義會變成

www.school.edu.tw. IN CNAME mail.school.edu.tw.school.edu.tw

ps:如果 mail server 和其他 server 建在同一部機器上, 建議這部機器本身就用 mail.xxx.yyy.zzz 當 hostname, 而 DNS 上也以 mail 作為正式名稱, 其它的名稱都建成 CNAME record.

第 20-29 行:
定義其它的 A resource record.

172.16.1.rev
含有所有屬於 172.16.1 這個 subnet 內機器的 reverse record
;
; This is db file for 172.16.1
;

@ IN SOA mail.school.edu.tw. root.mail.school.edu.tw. (
1999051401 ; Serial
3600 ; Refresh
300 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS mail.school.edu.tw.

$ORIGIN 1.16.172.in-addr.arpa.

; servers
250 IN PTR mail.school.edu.tw.

; user pc
1 IN PTR pc1.school.edu.tw.
2 IN PTR pc2.school.edu.tw.
3 IN PTR pc3.school.edu.tw.
4 IN PTR pc4.school.edu.tw.
5 IN PTR pc5.school.edu.tw.
6 IN PTR pc6.school.edu.tw.
7 IN PTR pc7.school.edu.tw.
8 IN PTR pc8.school.edu.tw.
9 IN PTR pc9.school.edu.tw.
10 IN PTR pc10.school.edu.tw.

reverse zone file 要注意的是 origin domain 變成了 1.16.172.in-addr-arpa, 所以每個 IP 對應到的 domain name 寫的都是完整名稱而且都以 . 作結束.

關於 named 的一點看法

有一點很重要, 雖然真實的世界中, school.edu.tw 這個 domain 對應的就是 172.16.1.0 這個 subnet 的 IP, 但是對於 named 而言, 這是兩個完全不相關的 zone, 一個是 school.edu.tw, 一個是 1.16.172.in-addr.arpa, 只是恰好這兩個 zone 都是這部 name server 負責而已.

注意是由 "人" 負責讓這兩份正解反解的 mapping 有 match, name server 本身是不管的!

沒有留言:

張貼留言