First Time to deploy Domain Name Server

這一篇文章是因為 NCTUNA(Network Administration) 課程學習到的心得記錄,課程網站可以參見於此,僅記錄我於 NA 課程當中學習到的知識與重點節錄。

使用的環境是交大資工計算機中心助教們所提供的 VM,OS 版本為 FreeBSD 10.3

Install BIND

這邊使用的是 BIND 9.11 版,安裝指令如下

1
2
pkg search bind
pkg install bind911

初探 DNS

以我的 Domain: aweimeow.idv.tw 來說的話,當有人要連上我的網站時,因為他的電腦不知道我(aweimeow.idv.tw)的 IP 是什麼,因此會依照以下順序去做 Query:

  1. . - 先從 Root Name Server 問起,問他 tw. 是誰管轄的
  2. .tw. - 跑去問管轄 .tw 的 Server,問他 idv.tw. 是誰管轄的
  3. .idv.tw. - 跑去問管轄 .idv.tw 的 Server,問他 aweimeow.idv.tw 是誰管轄的
  4. .aweimeow.idv.tw. - 如果有想知道這個 Domain 的 sub domain,再去問管轄這個網域的機器

而我們現在就是要讓域名商把 aweimeow.idv.tw 的管轄權放給我們,這樣子如果有人要找 hello.aweimeow.idv.tw 就會跑來問 aweimeow.idv.tw 這一台機器(也就是我們架的 DNS)了!

但是,他怎麼知道 aweimeow.idv.tw 的 IP 是誰呢?這不是有點矛盾嗎,既想要讓別人找到 aweimeow.idv.tw 但又沒告訴大家它的 IP 位址?

所以我們會需要在管理 idv.tw 的域名商那邊設定好我的 Domain 的 Name Server:

DNS Setting

這邊我設定了三台 Name Server:一台是我、一台是隊友、一台是由 he.net 的免費 DNS Slave 服務提供的機器。

那為什麼要設定這麼多台呢?

設定 Slave 的好處除了是有人幫忙備份 Name Record 以外,在 Master 死掉的時候也還有人知道你的 Domain 應該要對應到哪個 IP。

補充說明

課程當中要求兩人一組,互相作為對方的 Slave,把對方的 Record 抓過來,至於如果陌生人都可以亂抓我的 DNS record 不是很危險嗎?隱藏的 domain 都會被知道了,公司的秘密全部都會被發現了呢?

所以在稍後還會提及 要怎麼限制誰才能夠來抓我的紀錄

Configure BIND

/etc/rc.conf

首先在 FreeBSD 裡面要啟動軟體不像是 Ubuntu 都是安裝好之後都會自動啟動(或是執行個 service start 就可以了),需要在 /etc/rc.conf 裡面寫下 enable:

1
named_enable="YES"

named.conf

named.conf 是 BIND 的設定檔,基本上很多設定都會在這邊,像是:

  • allow-transfer
  • allow-notify
  • allow-recursion
  • zone file path

那這些名詞代表什麼含義也會在稍後說明,先讓我們來讓 DNS Server 動起來囉。

1
2
3
4
5
6
7
8
9
10
11
12
13
options {
directory "/usr/local/etc/namedb";
};

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

zone "aweimeow.idv.tw" {
type master;
file "master/aweimeow.idv.tw";
};

在這一個 conf 裡面設定了三個東西:

  • named 的目錄位置
  • Root 的參考(不過如果不開 recursive 的話用不到)
  • 我的 Zone File

recursive 是讓別人能以你的 DNS 作為主要 DNS(像 8.8.8.8 或 168.95.1.1 那樣,你的 DNS 會去查詢 www.example.com 的網址給使用者

zone file

剛剛特地把 named.conf 當中的 zone file 特別以粗體加註了,因為這邊會來介紹這個檔案是做什麼的。

zone file 會紀錄你的這一台 Domain Name Server 上面的 Record。

當有人要找 web.aweimeow.idv.tw 的時候,當問到誰是管轄 aweimeow.idv.tw 時,那你的 DNS Server 就會需要來處理這個任務,要由你來告訴大家,誰是 web.aweimeow.idv.tw 囉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$TTL 600
$ORIGIN aweimeow.idv.tw.
@ IN SOA ns1.aweimeow.idv.tw. aweimeow.tw.gmail.com. (
2017031001 ; serial
86400 ; refresh time for secondary server
1800 ; retry
86400 ; expire
3600 ; minimum TTL
)

IN A 140.---.---.---

IN NS ns1.aweimeow.idv.tw.
IN NS dns1.-------.idv.tw.
IN NS ns1.he.net.


ns1 IN A 140.---.---.---

這是一個 Zone File Example,在第一行的地方是 SOA(Start Of Authority),Zone File 都會以這筆 Record 開始。

@ 則是代表這個 $ORIGIN 的 Domain root: aweimeow.idv.tw,SOA Record 還需要紀錄這個 Domain 由哪個 NS 來管、負責人的 Mail 是什麼,以及其他資料:Serial, Refresh Time, Retry, Expire, Minimum TTL。

每一個數字都有其功能,像是 Serial 就代表著這一個 Zone File 的流水序號,如果 Slave 在 TTL 到時發現你的紀錄的序號值變大了,也就代表這個檔案被更新過了,Slave 也就會把他那邊儲存的紀錄更新囉。

而在 DNS Record 當中,第一個 Column 是 Name,如果沒有寫就是承接以上的設定。

About debug

通常我們在 debug 都是透過 dig 這一套工具去檢查 DNS record 是否正確:

1
dig {domain_name} @{name_server_ip}

以上是最基本的基本招,且 dig 也能夠查詢特定 Type 的 Record:A, AAAA(IPv6), NS, TXT, ….

而因為通常 DNS Record 也不太容易寫錯,所以如果有碰到錯誤的時候就把 dig 拿出來用一用吧 ( ´ ▽ ` )ノ

寫於文末

NCTU Network Administration 當然不止於 Domain Name Server,也有其他網路管理相關知識(如 Web Server, Mail Server, …),如果之後有時間會再陸續補上其他內容的學習心得。