這一系列 DNS 文章主要是以架設 DNS Server 應用在中小企業的網路環境為主。本文主要是以筆者自身的設定經驗,以最精簡的方式將 Linux 架設成 DNS Server 的好處分享給大家,希望對於從事 IT/MIS 相關工作的讀者朋友們都能夠有所幫助。
在新版的 Linux(搭配新版的 DNS 軟體)要架設 Caching-only Name Server 比舊版更容易,原因是新版 bind9 已經內建「根主機列表資訊」,省去一些預設的輸入設定(當然你要照舊版的輸入也可以),在 RHEL5.1 就只要將 bind9 安裝、預設值啟動服務即可使用這台 Caching-only Name Server。
預設值灌好的 RHEL5.1 並沒有安裝好 DNS 伺服端軟體 bind,只有安裝 bind-utils 這個 DNS 客戶端軟體,當我們調整好 yum 後,即可使用「yum list | grep bind」列舉出 bind 字眼的相關軟體,並使用「yum install -y bind」來安裝 DNS Server 軟體。

請注意 DNS 軟體名稱為 BIND(Berkeley Internet Name Domain)而 Daemon 名稱卻是 named 所以我們應使用「/etc/init.d/named restart」來啟動服務;這次啟動的時候會出現錯誤訊息『Locating //etc/named.conf failed:』原因是找不到設定檔 named.conf 將他產生出來即可(使用指令「touch /etc/named.conf」再次啟動即可成功(首次停止的 FAILED 是因為從未啟動過)。

使用指令「chkconfig named on」設定下次開機自動啟動 named,「chkconfig --list named」用來觀察設定是否正確。

DNS 一般查詢是使用 udp 53 埠,防火牆要記得開才能夠提供外部主機來查詢,使用指令「system-config-securitylevel」設定即可。

在客戶端主機使用「dig @172.18.0.35」作測試(172.18.0.35 是 DNS Server IP),指令的意思是向 DNS Server 172.18.0.35(@ 就是向誰問)詢問名稱解析,結果是有回應的,回應的 SERVER 是 172.18.0.35,由下圖的倒數第四行 SERVER: 172.18.0.35#53(172.18.0.35) 看出來的。
至於問的 DNS 查詢是『根主機資訊』,以下圖資訊來看是有回應的,全世界大概有十幾台 root-servers 而這些 root name server 通常只負責回答向下授權(delegate)後該問哪些 Name Server 主機。

向下授權例如國際域名像是:
.com 結尾該問哪些 Name Server 主機。
.net 結尾該問哪些 Name Server 主機。
.org 結尾該問哪些 Name Server 主機。
另外還有國家級域名例如:
.tw 結尾該問哪些 Name Server 主機(主要是台灣在管理的)。
.cn 結尾該問哪些 Name Server 主機(主要是中國在管理的)。
.hk 結尾該問哪些 Name Server 主機(主要是香港在管理的)。
架設 Caching-only Name Server 主要好處是讓客戶端的查詢『捨遠求近』,加快客戶端查詢 DNS 時所回應的速度,例如以台灣來說:網際網路線路如果是 Hinet 的話,客戶端名稱解析服務主機的設定通常會是 168.95.1.1(dns.hinet.net)、168.95.192.1(hntp1.hinet.net)這兩台。
這時候若在公司架設一台 Caching-only Name Server 並將客戶端的查詢都指向這台的話,好處就是能夠加快名稱解析查詢時所回應的速度。
筆者介紹 dns 客戶端工具時,都說是『三加一』,整理如下表:
| 指令名稱 | dig | host | nslookup | whois |
| 程式功能 | 用來查詢各種不同類型 DNS 紀錄(record)的工具 | 主要用來查詢網域名稱的相關資訊 (例如查詢網域名稱的擁有者) | ||
| 程式現況 及其特色 | Linux 通常灌好就有裝 建議用來取代 nslookup | Linux 建議用 dig/host 取代 Windows 內建有 nslookup | 指令 whois 在 Linux 通常灌好就有裝 此外亦有網站提供的 whois 查詢功能 例如 http://www.twnic.net/ | |
筆者覺得輸入 dig 就 Enter 是一個很方便查詢這台 Linux 主機網路『大概』通不通的方法,原因是許多中小企業的名稱解析伺服器都設定成外部 DNS Server(例 hinet DNS Server 168.95.1.1)。
以下圖來看「dig」指令執行後,向 168.95.1.1 這台伺服器問名稱解析是有回應的(倒數第四行『SERVER: 168.95.1.1#53(168.95.1.1)』),回應的內容則是 . (根)的 NS(Name Server)是問哪些主機(例 I.ROOT-SERVERS.NET)以及他們的 IP 是幾號(例 I.root-servers.net. 560003 IN A 192.36.148.17)。

下圖是指令「dig www2.babyface.com.tw @172.18.0.35」執行後的內容,指令的意思是向 172.18.0.35 這台 DNS 主機詢問 www2.babyface.com.tw 的紀錄解析。
倒數幾行的『SERVER: 172.18.0.35#53(172.18.0.35)』是由伺服器 172.18.0.35 的 53 埠 UDP 方式回答的。
『QUESTION SECTION:』表示查詢問的問題是 www2.babyface.com.tw 後面的 A 意思是此次查詢的紀錄類型是 A(Address 的意思)。
『ANSWER SECTION:』表示回答 www2.babyface.com.tw 的 A 紀錄得到 IP 是 59.105.220.126,其中 86400 是 TTL(Time To Live)單位是以秒計算,TTL 的意思是查詢到此紀錄以後,此紀錄的存活時間,也就是快取下來這筆紀錄會有多久。
『AUTHORITY SECTION:』顯示的訊息意思是回答 www2.babyface.com.tw 這筆紀錄的職權單位,是由底下這兩台 NS(Name Server,名稱解析伺服器)ns1.babyface.com.tw 與 ns2.babyface.com.tw 其中一台所回答出來的。

我們第二次向 172.18.0.35 問 www2.babyface.com.tw(相同的查詢),會發現之前 86400(TTL 秒數)會減少(下圖是減少成 85780),事實上在秒數尚未為零之前,重複問到相同的查詢時會 Cache 住,此時 DNS Server 172.18.0.35 並不會重複向 ns1.babyface.com.tw 或 ns2.babyface.com.tw 主機詢問 www2.babyface.com.tw 的解析,取而代之的是直接將先前 Cache 下來的答案回答給 Client 端;直到此筆紀錄過期了(秒數倒數歸零了以後),才會再向 ns1.babyface.com.tw 或 ns2.babyface.com.tw 詢問。

如果我們直接向 ns1.babyface.com.tw 或 ns2.babyface.com.tw 詢問他們管理的相同 dns 查詢,例如指令「dig www2.babyface.com.tw @ns1.babyface.com.tw」,重複問 www2.babyface.com.tw 的時候 TTL 並不會減少,因為此時回答這筆紀錄的 Name Server 是『直接』回答的主機(答案是由自己提供而不是『間接』從別台主機那問到的),因此 TTL 是不會減少的(也不需要減少)。

若企業尚未購買網域名稱之前,我們可以先行架個內部專用的 DNS Server 來方便內部名稱解析使用。
訂定內部專用的網域名稱時,如果此網域名稱很簡短的話,避免使用到已知的頂級域名(Top-level domain name)免得造成不必要的困擾。
避開的頂級域名像是 .com、.org、.net 等等。
避開的頂級域名(國家或地區)像是 .tw、.cn、.jp 等等。

底下就以網域名稱『ol』(OnLine 之意)作為我們測試用的『內部專用』網域名稱。
開啟 /etc/named.conf 編寫內容如下:
options {
directory "/var/named"; // 之後的 record 都是放在 /var/named/ 目錄下
};
zone "ol" in {
type master;
file "ol.db"; // record 檔案位於 /var/named/ol.db
};
這個檔案在輸入內容的時候很容易出錯,尤其是在參數那幾行的結尾以及大括號結束的地方需加上 ; (分號)要特別注意。
以上的輸入可看做兩個區段,一個 options 區段是給整個 named 用的;另一個 zone "ol" 則是用來新增 ol 網域且角色為 master 用的。
給整個 named 用的 options 區段內 directory 參數意思是之後提到的 file(record 檔案)都是放在 /var/named 底下,例如:『file "ol.db";』就是放在 /var/named/ol.db 這個位置。

寫好了之後接下來就是重啟 named(指令「/etc/init.d/named restart」)會有『loading master file ol.db: file not found』的訊息,我們先用『touch /var/named/ol.db』產生剛剛 load 不到的那個檔案,再度重啟 named 這次則是得到需要有『SOA 與 NS 的 records』的錯誤訊息,再過來就是要編寫 record 檔案,重啟才會正常。

開啟檔案 /var/named/ol.db 編寫內容如下:
@ IN SOA ns1 root (
2008081511 ; 序號 serial number
43200 ; 重整 refresh
21600 ; 重試 retry
3600000 ; 過期 expire
86400 ; 存活時間 TTL
)
IN NS ns1 ; 此行開頭空白,所以續接上一筆紀錄 @ (代表此 zone)
ns1 IN A 172.18.0.35 ; 就是這台 DNS Server 的 IP
上述那段內容大概十行左右,其實只有三筆紀錄,分別是 SOA、NS 與 A 紀錄。
第一筆是 SOA 紀錄:開頭的 @ 代表這個 zone(也就是 ol)在 SOA 後面的 ns1 是 master DNS Server 的名字(也就是這台 ns1.ol),接在後面的 root 是 e-mail 名稱『root@ol』在此如果要輸入完整 e-mail 名稱要寫成 root.ol.(因為 @ 在此已經被用掉了,所以只好換成一點 .),然後用小括號內放了五個數字,這五個數字依舊是屬於這筆 SOA 紀錄,分別是 序號(serial number)、重整(refresh)、重試(retry)、過期(expire)與 存活時間(TTL),這五個數字各有用途,留到後面再詳述。
第二筆是 NS 紀錄:此行的開頭空白,意思是續接上一筆紀錄的 @ (代表這個 zone),Name Server 紀錄為 ns1(就是 ns1.ol.)。
第三筆是 A 紀錄:此行開頭的 ns1(就是 ns1.ol.),有一筆 A 紀錄(Address)指向到 IP 為 172.18.0.35 (也就是這台 Name Server 主機的 IP 位址)。

輸入完成之後,重啟 named 應該會正常才對。

重啟 named 正常後,使用指令「dig ns1.ol @172.18.0.35」來測試剛才輸入的第三筆紀錄(也就是 A 紀錄那一筆)。

要特別查詢某個紀錄的別種類型(TYPE)時,使用 dig 是將『類型』輸入在欲查詢的名稱後面,例如要查詢 ol 名稱的 NS 紀錄時,使用指令「dig ol ns @172.18.0.35」。

查 ol 名稱的 SOA 紀錄方法相當類似,使用指令「dig ol soa @172.18.0.35」,就會看到我們剛才在 /var/named/ol.db 輸入的 ns1(變成了 ns1.ol.)、root(變成了 root.ol.)以及後面的五個數字。

剛才我們在用 dig 指令測試名稱解析時,都有加上『@172.18.0.35』去問 172.18.0.35 這台 Name Server,這樣顯得測試的時候有些麻煩。倘若這台主機已經是一台 Name Server 了以後,就應該詢問自己才對,簡單的說:「既然已經是一台 DNS Server 了,自己要詢問名稱解析時應該詢問自己,不應該去詢問別台主機,除非是有特殊原因」。
要設定成『名稱解析問自己』有以下幾個選擇:(主要是更改 DNS Server 的 /etc/resolv.conf 檔案內容)
方式一:「nameserver 172.18.0.35」設定成自己的網路卡 IP(若有機會改 IP 的話,記得這裡也要跟著改喔)。
方式二:「nameserver 127.0.0.1」設定成自己的 lo 介面的 IP(改 IP 這裡就不用跟著改)。
方式三:沒有「nameserver」設定,狀況類似『方式二』,會詢問自己的 lo 介面的 IP(改 IP 一樣不用跟著改)。
名稱解析改成問自己之後,在這台 Name Server 使用 dig 就不用特別加上『@172.18.0.35』這段敘述。
圖為方式二的情況,也是筆者偏好的設定方式。

在『新增 ol 網域 / 角色 master』設定好了以後,若未來架設了一些內部專用的伺服器,比如說是內部專用的 File Server(Samba / NFS / FTP)、Web Server(例 Blog、WiKi 以及 phpBB 等等討論區程式)或是即時通 Server,就可以利用這台 DNS Server 來幫忙做解析。
舉例來說:架了一台 File Server 使用 IP 172.18.0.100 名字叫做「fs.ol」
在 DNS Server 則是編寫 /var/named/ol.db 檔案內容,下方加上一行
fs IN A 172.18.0.100

待重新啟動 named 後,所有使用這台 DNS Server 當名稱解析伺服器的客戶端就可以使用主機名稱 fs.ol 來存取 172.18.0.100 那台 File Server 了。
