2012-06-13

DNS Server on Debian 6

由於前工作的關係讓凍仁對 DNS 有了更進一步的了解,也申請了 .tw 的網域名稱 (Domain Name) 來練習。原先是直接使用 FreeDNS 來代管,但隨著測試環境的增加預設的 30 筆紀錄 (Record) 早已不足,索性就開個子網域架 DNS Server 自己管。

1. 環境介紹

  • 網域名稱
    • 網域名稱: drx.tw。
    • 子網域名稱: test.drx.tw。
  • DNS Server
    • 作業系統: Debian 6 (Squeeze)。
    • 套件: bind9 (DNS Server)

2. 上層 DNS 設定

查詢 test.drx.tw 的 DNS 紀錄時,因有 NS 紀錄,故主要參照 dns.test.drx.tw 此台 DNS Server,且 dns.test.drx.tw 必須為 A 或 AAA 紀錄;若設定顛倒則下層 DNS Server 無法提交紀錄給上層,也就是只有手動在本機加入 1.2.3.4 的 DNS Server 才可使用。

設定 test.drx.tw 的 NS 紀錄為 ns.test.drx.tw。

設定 ns.test.drx.tw 的 A 紀錄為 1.2.3.4。

3. 伺服器設定

3.1. 安裝

3.1.1. 尋找 bind 於 Debian 上的套件名稱。
[ jonny@squeeze ~ ]
$ aptitude search bind [Enter]
p   bind9     - Internet Domain Name Server

3.1.2. 安裝 bind。
[ jonny@squeeze ~ ]
$ sudo aptitude install bind9 [Enter]

3.2. 設定

3.2.1. 開始編輯前建議先備份原始的設定檔,以免搞砸。
[ jonny@squeeze ~ ]
$ sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.ori [Enter]

[ jonny@squeeze ~ ]
$ sudo cp /etc/bind/named.conf.options /etc/bind/named.conf.options.ori [Enter]

3.2.2. 正反解設定: 於 named.conf.local 定義管轄內的區域 (Zone) 名稱及相關檔案。
[ jonny@squeeze ~ ]
$ sudo vi /etc/bind/named.conf.local [Enter]
 1 //
 2 // Do any local configuration here
 3 //
 4 
 5 // Consider adding the 1918 zones here, if they are not used in your
 6 // organization
 7 //include "/etc/bind/zones.rfc1918";
 8 
 9 //新增正解區域 (Zone)。
10 zone "test.drx.tw" {
11     type master;
12     file "/etc/bind/db.test.drx.tw";
13 };
14 
15 //新增反解區域 (Zone)。
16 zone "4.3.2.1.in-addr.arpa" {
17     type master;
18     file "/etc/bind/db.4.3.2.1";
19 };

3.2.3. 建立正解區域設定檔。
[ jonny@squeeze ~ ]
$ sudo vi /etc/bind/db.test.drx.tw [Enter]
 1 ;
 2 ; BIND data file for test.drx.tw
 3 ;
 4 $TTL    604800
 5 @                   IN  SOA     ns.test.drx.tw. ns1.test.drx.tw. (
 6                   2     ; Serial [註1]
 7              604800     ; Refresh
 8               86400     ; Retry
 9             2419200     ; Expire
10              604800 )   ; Negative Cache TTL
11 ;
12 @                    IN  NS      ns.test.drx.tw.
13 test.drx.tw.        IN  NS      ns.test.drx.tw.
14 ns.test.drx.tw.     IN  A       1.2.3.4
15 
16 ; record wth myself.
17 www.test.drx.tw.    IN  A       1.2.3.4
18 jonny.test.drx.tw.  IN  CNAME   www.test.drx.tw.

# [註1] 其長度為 2^32 - 1,一般慣用年月日加兩碼亂數做辨別 (例如 2012082001),有跑 Slave 時請多加注意,若數字過長、超過上限則會以餘數計算。

3.2.4. 修改 Bind 參數
[ jonny@squeeze ~ ]
$ sudo vi /etc/bind/named.conf.options [Enter]
 1 {
 2     directory       "/var/cache/bind";
 3     dump-file       "/var/cache/bind/cache_dump.db";
 4     statistics-file "/var/cache/bind/named.stats";
 5     managed-keys-directory "/etc/bind";
 6 
 7  # 自訂 bind 回應版本。
 8     version         "None of your business";
 9 
10  # 減輕 bind 負載,並將未管轄網域轉到其他機器。
11     forwarders {
12         8.8.4.4; 8.8.8.8; 168.95.192.1;
13     };
14 
15     auth-nxdomain no;    # conform to RFC1035
16     listen-on-v6 { none; };
17 
18  # 認證網域。
19     allow-query { any; };
20 
21  # 停用全域轉送 (Master 與 Slave 間的傳送)。
22     allow-transfer { none; };
23 };

3.2.5. 重新啟動服務,要是嫌重新啟動的時間過長,也可改用 reload。
[ jonny@squeeze ~ ]
$ sudo /etc/init.d/bind9 restart [Enter]
* Stopping domain name service... bind         [ OK ]
* Starting domain name service... bind          [ OK ]

4. 除錯

在設定 Bind 時,log 幫了凍仁不少的忙,相信只要把錯誤訊息拿去 Google 搜尋都會有解答的。
[ jonny@squeeze ~ ]
$ sudo tail -f /var/log/daemon.log | nl [Enter]
  1  Jun 11 12:26:45 drx named[27036]: client 192.168.1.1#46910: query (cache) 'www.google.com/A/IN' denied
 ......
  4  Jun 12 21:59:06 drx named[1735]: dns_rdata_fromtext: /etc/bind/db.test.drx.tw:10: near eol: unexpected end of input
  5  Jun 12 21:59:06 drx named[1735]: zone test.drx.tw/IN: loading from master file /etc/bind/db.test.drx.tw failed: unexpected end of in put
  6  Jun 12 21:59:06 drx named[1735]: zone test.drx.tw/IN: not loaded due to errors.
 ......
 15  Jun 11 15:54:55 drx named[29705]: zone test.drx.tw/IN: dns.test.drx.tw/NS 'test.drx.tw' has no address records (A or AAAA)

# CentOS 的 log 位置為 /var/log/message
  • 第 1 行 denied:認證網域中不含 192.168.1.1,換句話說就是權限開的不夠大。
  • 第 4 ~ 6 行: dns 正 (反) 解區域設定檔語法有誤。
  • 第 15 行: 預代管的子網域 test.drx.tw 必須為 A 或 AAA 紀錄才行。

5. 驗證

[ jonny@squeeze ~ ]
$ dig test.drx.tw [Enter]
; <<>> DiG 9.8.1-P1 <<>> test.drx.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16804
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;test.drx.tw.                    IN      A

;; AUTHORITY SECTION:
test.drx.tw.             10783   IN      SOA     ns.test.drx.tw. ns1.test.drx.tw. 2 604800 86400 2419200 604800

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jun 13 13:57:50 2012
;; MSG SIZE  rcvd: 71

[ jonny@squeeze ~ ]
$ host ns.test.drx.tw [Enter]
ns.test.drx.tw has address 1.2.3.4

凍仁還記得第一次聽到 DNS 這名詞是在高中的計算機概論課堂上,一直到現在才有融會貫通的感覺,真是超感動的。由於手邊沒有可以設反解的環境,在此就先不列入筆記了。

# 以上的 test.drx.tw, test.drx.tw 以及 1.2.3.4 請自行更換。

相關連結:
DNS介紹 | TWNIC
Internet 基本概念 | TWNIC
bind9 - 提供 Domain Name 與 IP 對應的服務 - 不自量力 の Weithenn

資料來源:
DNS Server - 鳥哥的 Linux 私房菜
毓林園地:[ubuntu] 設定 DNS
Ubuntu 10.10 Server 安裝 DNS Server @ 暉獲無度的步烙閣