引自:http://www.codepub.com/info/2006/11/info-11543.html
bind簡介
BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 協議的一個實現,提供了DNS主要功能的開放實現,包括
* 域名伺服器 (named)
* DNS解析庫函數
* DNS伺服器運行調試所用的工具
是一款開放源碼的DNS伺服器軟體,由美國加州大學Berkeley分校開發和維護的,
按照ISC的調查報告,BIND是世界上使用最多最廣泛的域名服務系統。不論你的郵件伺服器,WEB伺服器或者其他的services如何的安全可靠,DNS的故障會給你帶來用戶根本無法訪問這些服務。
BIND,也是我們常說的named,由於多數網路應用程序使用其功能,所以在很多BIND的弱點及時被發現。主要分為三個版本:
v4
1998年多數UNIX捆綁的是BIND4,已經被多數廠商拋棄了,除了OpenBSD還在使用。OpenBSD核心人為BIND8過於複雜和不安全,所以繼續使用BIND4。這樣一來BIND8/9的很多優點都不包括在v4中。
v8
就是如今使用最多最廣的版本,其詳細內容可以參閱 BIND 8+ 域名伺服器安全增強
v9
最新版本的BIND,全部重新寫過,免費(但是由商業公司資助),也添加了許多新的功能(但是安全上也可能有更多的問題)。BIND9在2000年十月份推出,現在穩定版本是9.3.2。
軟體的相關資源
官方網站: http://www.bind.com/
最新版本: 9.3.2 http://www.isc.org/sw/bind/bind9.3.php#download
幫助文檔: http://www.isc.org/sw/bind/
配置文件樣例: http://www.bind.com/bind.html
FAQ: http://www.nominum.com/getOpenSourceResource.php?id=6
配置環境
環境:GNU/Linux Debian/testing Linux 2.6.8-2-386
版本:bind9 9.3.2-2
測試域名:mydebian.org
測試ip: 192.168.102.47 主域名伺服器
192.168.102.48 純緩存域名伺服器
192.168.102.49 輔助域名伺服器
192.168.102.49 測試客戶機
配置文件說明
安裝bind9的命令:
~# aptitude update
~# aptitude install bind9 bind9-host dnsutils
配置文件族:
# ls /etc/bind/ -l
total 44
-rw-r--r-- 1 root root 237 Jan 16 2006 db.0
-rw-r--r-- 1 root root 271 Jan 16 2006 db.127
-rw-r--r-- 1 root root 237 Jan 16 2006 db.255
-rw-r--r-- 1 root root 353 Jan 16 2006 db.empty
-rw-r--r-- 1 root root 256 Jan 16 2006 db.local
-rw-r--r-- 1 root root 1507 Jan 16 2006 db.root
-rw-r--r-- 1 root bind 1611 Jan 16 2006 named.conf
-rw-r--r-- 1 root bind 165 Jan 16 2006 named.conf.local
-rw-r--r-- 1 root bind 672 Jan 16 2006 named.conf.options
-rw-r----- 1 bind bind 77 Aug 4 08:41 rndc.key
-rw-r--r-- 1 root root 1317 Jan 16 2006 zones.rfc1918
配置文件說明:
named.conf
設置一般的named參數,指向該伺服器使用的域資料庫的信息源
named.conf.options
全局選項
db.root
根伺服器指向文件, 由Internet NIC創建和維護, 無需修改, 但是需要定期更新
db.local
localhost正向區文件,用於將名字localhost轉換為本地回送IP地址 (127.0.0.1)
db.127
localhost反向區文件,用於將本地回送IP地址(127.0.0.1)轉換為名字localhost
其中,主配置文件/etc/named.conf的配置語句
命令 用法
acl 定義IP地址的訪問控制清單
control 定義ndc使用的控制通道
include 把其他文件包含到配置文件中
key 定義授權的安全密鑰
logging 定義日誌寫什麼,寫到哪
opitons 定義全局配置選項和預設值
server 定義遠程伺服器的特徵
trunsted-keys 為伺服器定義DNSSEC加密密鑰
zone 定義一個區
默認情況下, 內容如下:
include "/etc/bind/named.conf.options";
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
include "/etc/bind/named.conf.local";
其中type項的值:
master:表示定義的是主域名伺服器
slave :表示定義的是輔助域名伺服器
hint:表示是互聯網中根域名伺服器
在Debian環境中,options語句的配置內容, 被移至named.conf.options文件中:
options {
directory "/var/cache/bind";
// 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 and later use an unprivileged
// port by default.
// query-source address * port 53;
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
// 0.0.0.0;
// };
auth-nxdomain no; # conform to RFC1035
};
創建主域名伺服器
a. 首先, 在在192.168.102.47機器上安全bind9
b. 使用編輯器,比如vi, 編輯配置文件/etc/bind/named.conf
加入如下內容
zone "mydebian.org" {
type master; //定義此區為主伺服器
file "/etc/bind/db.mydebian"; 指定區資源文件的位置
};
zone "102.168.192.in-addr.arpa" {
type master; //定義此區為主伺服器
file "/etc/bind/db.192"; //指定區資源文件的位置
};
c. 創建區資源文件:
創建區資源文件/etc/bind/db.mydebian內容如下
;
; BIND data file for local loopback interface
;
$TTL 604800
$ORIGIN mydebian.org.
@ IN SOA mydebian.org. root.mydebian.org. (
2006080401 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
IN NS ns
IN MX 0 mail.mydebian.org.
@ IN A 192.168.102.47
ns IN A 192.168.102.47
www IN A 192.168.102.47
webserver IN CNAME www
mail IN A 192.168.102.47
ftp IN A 192.168.102.48
ns2 IN A 192.168.102.48
ns3 IN A 192.168.102.49
第一行是TTL設定,生存時間記錄欄位。它以秒為單位定義該資源記錄中的信息存放在高速緩存中的時間長度。這裡定義為604800秒,也就是1周.
第二行是$ORIGIN設定,說明下面的記錄出自何處.請您加倍留意最後的一個小小數點"."
然後,第三行,是一個 SOA 記錄的設定,在這裡我們看到一個特殊字元 @ ,它就是 ORIGIN 的意思,也就是剛剛所定義的$ ORIGIN mydebian.org. 的內容,您可以寫成 mydebian.org. 也可以用 @ 來代替。
假如這個文件前面沒有定義 $ ORIGIN 的話, 那?個 @ 的值就以 named.conf 里的 zone .
接著 SOA 後面,指定了這個區域的授權主機和管理者的信箱,這裡分別是"mydebian.org." 和"root.mydebian.org."。我們平時使用的信箱通常是「user@host」這樣的格式,但因為@在 DNS 記錄中是個保留字元,所以在 SOA 中就用「.」來代替了@。目前這個信箱是 "root@mydebian.org."。
接下來的 SOA 設置,是被括在「( )」之間的 5 組數字,主要作為和 slave 伺服器同步 DNS 資料所使用的資料:
Serial:其格式通常會是「年月日+修改次序」(但也不一定如此,您自己能夠記得就行)。當 slave 要進行資料同步的時候,會比較這個號碼。如果發現在這裡的號碼比它那邊的數值「大」,就進行更新,否則忽略。不過設 serial 有一個地方您要留意:不能超過 10 位數字!
Refresh:這裡是是告訴 slave 要隔多久要進行資料同步(是否同步要看 Serial 的比較結果)。
Retry:如果 slave 在進行更新失敗后,要隔多久再進行重試。
Expire:這是記錄逾期時間:當 slave 一直未能成功與 master 取得聯繫,那到這裡就放棄 retry,同時這裡的資料也將標識為過期(
expired )。
Minimum:這是最小默認 TTL 值,如果您在前面沒有用「$TTL」來定義,就會以此值為準。
請注意:SOA 記錄中這對 「 ( ) 」符號之第一個 「 (」括弧一定要和 SOA 寫在同一行,而不能用 Enter 斷行到下一行去,而且其左邊最好有一個空格鍵或 tab 建。而最後一個 「 )」括弧也不能寫在註解符號 「 ;」的右邊。 置 DNS 的 RR 記錄檔,其格式要求非常嚴格,我們絲毫不能掉以輕心。比方說:如果句子不是以空格鍵、Tab 鍵、 或註解符號 ( ; )開頭,也不在 SOA 的 「 ( ) 」之內, 則表示要定義一個「新記錄項 (Entry) 」;如果句子是以空格鍵或 tab 鍵開始的話,其設置被視為上一個「記錄項」的內容。所以,如果您要為「同一個記錄項」定義多個記錄設置,而不想重複打字,您倒可以偷懶:在接著它的後面幾行用空白或 Tab 來縮排就可以了。
NS表明負責mydebian.org.這個域的Name Server是mydebian.org這台主機
MX記錄標明發往mydebian.org域的郵件由mail.mydebian.org這台伺服器接收
A記錄標明了IP地址和域名之間的對應關係
接下來創建該區的反向映射資源文件
/etc/bind/db.192內容如下:
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA mydebian.org. root.mydebian.org. (
2006080401 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS mydebian.org.
47 IN PTR mail.mydebian.org.
47 IN PTR www.mydebian.org.
47 IN PTR ns.mydebian.org.
48 IN PTR ftp.mydebian.org.
48 IN PTR ns2.mydebian.org.
49 IN PTR ns3.mydebian.org.
其中PTR記錄用來解析IP地址對應的域名
d. 重啟DNS服務
/etc/init.d/bind9 restart
此時查看系統日誌,可了解BIND的啟動情況,比如如下輸出,則說明引導正常
tonybox:~# tail /var/log/syslog
Aug 14 08:36:45 localhost named[2792]: zone 127.in-addr.arpa/IN: loaded serial 1
Aug 14 08:36:45 localhost named[2792]: zone 102.168.192.in-addr.arpa/IN: loaded serial 2006080801
Aug 14 08:36:45 localhost named[2792]: zone 255.in-addr.arpa/IN: loaded serial 1
Aug 14 08:36:45 localhost named[2792]: zone localhost/IN: loaded serial 1
Aug 14 08:36:45 localhost named[2792]: zone mydebian.org/IN: loaded serial 2006080801
Aug 14 08:36:45 localhost named[2792]: running
Aug 14 08:36:45 localhost named[2792]: zone mydebian.org/IN: sending notifies (serial 2006080801)
Aug 14 08:36:45 localhost named[2792]: zone 102.168.192.in-addr.arpa/IN: sending notifies (serial 2006080801)
Aug 14 08:36:45 localhost named[2792]: client 192.168.102.47#1030: received notify for zone 'mydebian.org'
Aug 14 08:36:45 localhost named[2792]: client 192.168.102.47#1030: received notify for zone '102.168.192.in-addr.arpa'
e. 在客戶機上的設置
# cat /etc/resolv.conf
search mydebian.org
nameserver 192.168.102.47
f. 測試:
使用nslookup 測試
tonybox2:~# nslookup
> set type=any
> mydebian.org
Server: 192.168.102.47
Address: 192.168.102.47#53
mydebian.org
origin = mydebian.org
mail addr = root.mydebian.org
serial = 2006080801
refresh = 604800
retry = 86400
expire = 2419200
minimum = 604800
mydebian.org nameserver = ns.mydebian.org.
mydebian.org mail exchanger = 0 mail.mydebian.org.
Name: mydebian.org
Address: 192.168.102.47
使用dig測試
tonybox2:~# dig @192.168.102.47 mydebian.org
; <<>> DiG 9.3.2 <<>> @192.168.102.47 mydebian.org
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41793
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;mydebian.org. IN A
;; ANSWER SECTION:
mydebian.org. 604800 IN A 192.168.102.47
;; AUTHORITY SECTION:
mydebian.org. 604800 IN NS ns.mydebian.org.
;; ADDITIONAL SECTION:
ns.mydebian.org. 604800 IN A 192.168.102.47
;; Query time: 31 msec
;; SERVER: 192.168.102.47#53(192.168.102.47)
;; WHEN: Mon Aug 14 09:16:27 2006
;; MSG SIZE rcvd: 79
tonybox2:~# dig @192.168.102.47 ftp.mydebian.org
; <<>> DiG 9.3.2 <<>> @192.168.102.47 ftp.mydebian.org
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63890
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;ftp.mydebian.org. IN A
;; ANSWER SECTION:
ftp.mydebian.org. 604800 IN A 192.168.102.48
;; AUTHORITY SECTION:
mydebian.org. 604800 IN NS ns.mydebian.org.
;; ADDITIONAL SECTION:
ns.mydebian.org. 604800 IN A 192.168.102.47
;; Query time: 22 msec
;; SERVER: 192.168.102.47#53(192.168.102.47)
;; WHEN: Mon Aug 14 09:16:41 2006
;; MSG SIZE rcvd: 83
反向查詢
tonybox2:~# dig @192.168.102.47 -x 192.168.102.47
; <<>> DiG 9.3.2 <<>> @192.168.102.47 -x 192.168.102.47
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21885
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;47.102.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
47.102.168.192.in-addr.arpa. 604800 IN PTR www.mydebian.org.
47.102.168.192.in-addr.arpa. 604800 IN PTR mail.mydebian.org.
47.102.168.192.in-addr.arpa. 604800 IN PTR mydebian.org.
;; AUTHORITY SECTION:
102.168.192.in-addr.arpa. 604800 IN NS mydebian.org.
;; ADDITIONAL SECTION:
mydebian.org. 604800 IN A 192.168.102.47
;; Query time: 33 msec
;; SERVER: 192.168.102.47#53(192.168.102.47)
;; WHEN: Mon Aug 14 09:17:00 2006
;; MSG SIZE rcvd: 138
純緩存域名伺服器
192.168.102.48 為我們的dns 緩存伺服器,首先, 在在192.168.102.48 機器上安全bind9, 在配置前我們用dig 進行測試
tonybox2:/etc/bind# dig @192.168.102.48 www.mydebian.org
; <<>> DiG 9.3.2 <<>> @192.168.102.48 www.mydebian.org
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 34137
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.mydebian.org. IN A
;; Query time: 1844 msec
;; SERVER: 192.168.102.48#53(192.168.102.48)
;; WHEN: Tue Aug 8 12:05:17 2006
;; MSG SIZE rcvd: 34
修改named.conf.options文件
tonybox2:/etc/bind# cat named.conf.options
options {
directory "/var/cache/bind";
// 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 and later use an unprivileged
// port by default.
// query-source address * port 53;
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
forwarders {
192.168.102.47; //主域名伺服器的IP地址
};
auth-nxdomain no; # conform to RFC1035
};
然後再進行測試
tonybox2:/etc/bind# dig @192.168.102.48 www.mydebian.org
; <<>> DiG 9.3.2 <<>> @192.168.102.48 www.mydebian.org
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54332
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.mydebian.org. IN A
;; ANSWER SECTION:
www.mydebian.org. 604800 IN A 192.168.102.47
;; AUTHORITY SECTION:
mydebian.org. 604800 IN NS mydebian.org.
;; ADDITIONAL SECTION:
mydebian.org. 604800 IN A 192.168.102.47
;; Query time: 44 msec
;; SERVER: 192.168.102.48#53(192.168.102.48)
;; WHEN: Tue Aug 8 12:05:47 2006
;; MSG SIZE rcvd: 80
所謂的 forwarder,就是當某一台 NS 主機遇到非本機負責的 zone ( slave zone 也屬於本機負責的範圍) 查詢請求的時候,將不直接向 "." zone 查詢而把請求轉交給指定的 forwarder (一台或多台) 主機代為查詢。
我們知道,當DNS伺服器接到客戶端主機的查詢請求時,首先會檢查這個查詢是否屬於本機管轄,否則將轉向 "." zone 再逐級的查詢下去,最後再把查詢結果告訴客戶端。
在這個過程之中,DNS伺服器還會將查詢到的結果存放到緩存中。只要緩存中的 TTL 沒過期,在下次遇到同樣查詢的時候,就可以直接將結果響應給客戶端,而無需再重複上次的查詢流程。
如果DNS伺服器上指定了forwarder,那這個DNS發現緩存中沒有記錄時,將不向 "." 查詢,而是向 forwarder 送出同樣的請求(轉發),然後等待查詢結果,即把逐級往下查詢這個耗費精力的動作,交給 forwarder 負責。但無論這個結果是自己直接查詢得來的,還是 forwarder 送回來的,DNS伺服器都會保存一份數據在緩存中。
這樣,以後的相同查詢就快多了,這對於DNS所服務的 客戶端而言查詢效率會提高很多。
/var/named/named.ca
dig @a.root-servers.net . ns > /var/named/named.ca
輔助域名伺服器
a. 192.168.102.49 為我們的dns 緩存伺服器,首先, 在在192.168.102.49 機器上安全bind9,
b. 在主配置文件/etc/named.conf中加入如下內容:
zone "mydebian.org" {
type slave;
file "/etc/bind/slaves/db.mydebian";
masters {192.168.102.47;};
};
zone "102.168.192.in-addr.arpa" {
type slave;
file "/etc/bind/slaves/db.192";
masters {192.168.102.47;};
};
type後面的值已經成為slave; 表示定義的是輔助域名伺服器
file 後面也可以是別的文件名不必與主域DNS伺服器的設置一樣
masters 後為主域DNS伺服器的IP地址, 可以是多個IP,型如
masters {ip1;ip2;ip3;};
c. 創建/etc/bind/slaves/目錄
tonybox2:/etc/bind# mkdir slaves
tonybox2:/etc/bind# chown bind.bind slaves
d. 重啟dns服務
tonybox2:/etc/bind/slaves# /etc/init.d/bind9 restart
named進程第一次啟動時,輔助域名伺服器就下載主域名伺服器的信息;輔助域名伺服器根據主域名伺服器的對應SOA記錄規定的刷新時間間隔,去主域名伺服器查詢相關信息。
tonybox2:/etc/bind/slaves# ls -l
total 8
-rw-r--r-- 1 bind bind 410 2006-08-08 12:23 db.192
-rw-r--r-- 1 bind bind 430 2006-08-08 12:23 db.mydebian
查看 /etc/bind/slaves 目錄,我門會發現已經從主域名伺服器獲取了相應的資源文件
如果用戶bind對於/etc/bind/slaves目錄沒有寫許可權, 則查看 /var/log/syslog 會出現如下類似錯誤:
tonybox:~# tail /var/log/syslog
Aug 8 12:30:09 tonybox2 named[3849]: zone mydebian.org/IN: Transfer started.
Aug 8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: connected using 192.168.102.15#1075
Aug 8 12:30:09 tonybox2 named[3849]: dumping master file: /etc/bind/tmp-VHTxU6CT5n: open: permission denied
Aug 8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: failed while receiving responses: permission denied
Aug 8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: end of transfer
Aug 8 12:30:10 tonybox2 named[3849]: zone 102.168.192.in-addr.arpa/IN: Transfer started.
Aug 8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: connected using 192.168.102.15#1076
Aug 8 12:30:10 tonybox2 named[3849]: dumping master file: /etc/bind/tmp-dxbiD1JtTK: open: permission denied
Aug 8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: failed while receiving responses: permission denied
Aug 8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: end of transfer
[火星人 ] Bind9 的安裝與配置已經有977次圍觀