DNS 伺服器 bind9 的 zone file 設定

Posted by blueskyson on May 24, 2021

此為計算機網路管理課程的 lab12

設定 named 監聽埠

$ sudo apt install bind9

首先將預設的監聽埠由 53 改為 8053 (lab 要求,一般狀況不需要改監聽埠)

$ sudo vim /etc/bind/named.conf.options

options{} 區塊裡加入

1
2
3
4
    recursion yes;
    listen-on port 8053 { 127.0.0.1; };
    allow-query { any; };
    listen-on-v6 { any; };

執行以下指令測試 named 是否成功執行,

$ sudo systemctl restart named
$ dig @127.0.0.1 -p 8053

若成功在 8053 執行,會顯示以下訊息

; <<>> DiG 9.16.1-Ubuntu <<>> @127.0.0.1 -p 8053
; (1 server found)

...

;; SERVER: 127.0.0.1#8053(127.0.0.1)
;; WHEN: Mon May 24 07:51:08 UTC 2021
;; MSG SIZE  rcvd: 851

新增 zone

確認 named 可以正常執行後,我們加入一個 Domain Name 名叫 dns.imslab.org。打開 named.conf.local

$ sudo vim /etc/bind/named.conf.local

寫入以下區塊,告訴 named 蓋去哪裡取得 dns.imslab.org 的資訊

1
2
3
4
zone "dns.imslab.org" IN {
    type master;
    file "/etc/bind/db.dns.imslab.org";
};
  • type: 有 hint (針對 root server “.” 的類型)、master 手動修改的資料庫、slave 可自動更新的資料庫
  • file: zone file 的路徑,檔案要命名為 /*.dns.imslab.org/

我們預期需要創建以下 Resource Record (RR):

Record name Type Value
a A 127.0.1.1
aaaa AAAA 2001:4860:4860::8888
cname CNAME a.dns.imslab.org.
mail MX 10, smtp1.dns.imslab.org.
mail MX 20, smtp2.dns.imslab.org.
smtp1 A 127.0.2.1
smtp2 A 127.0.2.2
<MT ID> A <MY SERVER IP>
foo TXT bar

關於每個 RR 的 Type 可以參考 List of DNS record types

創建 zone file:

$ sudo vim /etc/bind/db.dns.imslab.org

寫入以下 RR:

在動手開始寫 zone file 前,要先搞清楚一串域名的尾巴的 "." 很重要! 結尾有點的字串代表他是完整的域名,而結尾無點的,在解析時需要為把它視為 域名.@,例如第六行的 dns.imslab.org. 是個完整的域名;第八行的 a 要視為 a.@,也就是 a.dns.imslab.org.

  • 第 1 行 $TTL 為 time-to-live,為域名紀錄的最長快取次數
  • 第 2 行 $ORIGIN 就是 zone 的定義,正常情況下會與 zone 一樣,但也可以自行修改
  • 第 3 行 @ 代表 zone,也就是字串 “dns.imslab.org.”,SOA 為 Start of Authority Record,後面必須緊接著 Primary Name Server dns.imslab.org. 與 Domain 管理者的 e-mail,雖然 e-mail 寫作 root.dns.imslab.org.,但其應被解讀為 root@dns.imslab.org。
    緊接著小括號內包含五個數值,分別代表流水號、slave server 刷新時間、Secondary Name Server 的刷新時間、Expire (離線的 Time Out)、TTL,詳情看 SOA record
  • 第 5 行 IN 前面留空代表繼承前一個域名,即 @NS 為要作為 Name Server 的域名,這裡直接使用 zone 來代表。如果有備用 Name Server 的話,也可以像下面這樣宣告好幾個 NS:
              IN  NS  dns1.imslab.org.
              IN  NS  dns2.imslab.org.
    
  • 第 6 行紀錄 Name Server 的 IPv4

到目前為止,已經做完 Name Server 的基礎設定,一個正解的 Name Server 應該要包含一個 $TTL、一個 SOA、至少一個 NSNSA。接下來我們可以開始定義子域名:

  • 第 8 行紀錄 a.@ 的 IPv4
  • 第 9 行紀錄 aaaa.@ 的 IPv6
  • 第 10 行將 cname.@ 映射到 a.@
  • 第 11、12、15 行一樣設定 IPv4
  • 第 13、14 行設定電子郵件的權重與域名
  • 第 16 行 foo.@ 對應文字記錄 "bar"

辛苦寫完 zone file 後,使用以下指令重啟 named

$ sudo systemctl restart named

使用 dig 測試

一一測試域名,以下我只保留關鍵的輸出值

dns.imslab.orga.dns.imslab.orgF74076027.dns.imslab.org

$ dig @127.0.0.1 -p 8053 dns.imslab.org
;; QUESTION SECTION:
;dns.imslab.org.                        IN      A

;; ANSWER SECTION:
dns.imslab.org.         600     IN      A       127.0.0.1

$ dig @127.0.0.1 -p 8053 a.dns.imslab.org
;; QUESTION SECTION:
;a.dns.imslab.org.              IN      A

;; ANSWER SECTION:
a.dns.imslab.org.       600     IN      A       127.0.1.1

$ dig @127.0.0.1 -p 8053 F74076027.dns.imslab.org
;; QUESTION SECTION:
;F74076027.dns.imslab.org.      IN      A

;; ANSWER SECTION:
F74076027.dns.imslab.org. 600   IN      A       172.26.4.34

aaaa.dns.imslab.org

$ dig @127.0.0.1 -p 8053 -t AAAA aaaa.dns.imslab.org
;; QUESTION SECTION:
;aaaa.dns.imslab.org.           IN      AAAA

;; ANSWER SECTION:
aaaa.dns.imslab.org.    600     IN      AAAA    2001:4860:4860::8888

cname.dns.imslab.org

$ dig @127.0.0.1 -p 8053 -t CNAME cname.dns.imslab.org
;; QUESTION SECTION:
;cname.dns.imslab.org.          IN      CNAME

;; ANSWER SECTION:
cname.dns.imslab.org.   600     IN      CNAME   a.dns.imslab.org.

smtp1.dns.imslab.orgsmtp2.dns.imslab.org

$ dig @127.0.0.1 -p 8053 smtp1.dns.imslab.org
;; QUESTION SECTION:
;smtp1.dns.imslab.org.          IN      A

;; ANSWER SECTION:
smtp1.dns.imslab.org.   600     IN      A       127.0.2.1

$ dig @127.0.0.1 -p 8053 smtp2.dns.imslab.org
;; QUESTION SECTION:
;smtp2.dns.imslab.org.          IN      A

;; ANSWER SECTION:
smtp2.dns.imslab.org.   600     IN      A       127.0.2.2

mail.dns.imslab.org

$ dig @127.0.0.1 -p 8053 -t MX mail.dns.imslab.org
;; ANSWER SECTION:
mail.dns.imslab.org.    600     IN      MX      20 smtp2.dns.imslab.org.
mail.dns.imslab.org.    600     IN      MX      10 smtp1.dns.imslab.org.

;; ADDITIONAL SECTION:
smtp1.dns.imslab.org.   600     IN      A       127.0.2.1
smtp2.dns.imslab.org.   600     IN      A       127.0.2.2

foo.dns.imslab.org

$ dig @127.0.0.1 -p 8053 -t TXT foo.dns.imslab.org
;; QUESTION SECTION:
;foo.dns.imslab.org.            IN      TXT

;; ANSWER SECTION:
foo.dns.imslab.org.     600     IN      TXT     "bar"

以上便完成測試

心得

bind9 雖然語法簡潔,但是規則實在有夠複雜、錯誤訊息又不夠完整、zone file 寫錯都不會噴 Error,只能一行一行嘗試和找錯,寫的我好苦啊! 重點是一般架站都是找網路公司買域名,到底誰會親自維護一個 Name Server?

參考資料

鳥哥的 Linux 私房菜–第十九章、主機名稱控制者: DNS 伺服器

O’REILLY’–10.15. Addresses and Ports

BIND 介紹