中小企業 DNS Server 實戰應用(上)

作者:徐秉義(Albert Hsu)

這一系列 DNS 文章主要是以架設 DNS Server 應用在中小企業的網路環境為主。本文主要是以筆者自身的設定經驗,以最精簡的方式將 Linux 架設成 DNS Server 的好處分享給大家,希望對於從事 IT/MIS 相關工作的讀者朋友們都能夠有所幫助。

架設 Caching-only Name Server

在新版的 Linux(搭配新版的 DNS 軟體)要架設 Caching-only Name Server 比舊版更容易,原因是新版 bind9 已經內建「根主機列表資訊」,省去一些預設的輸入設定(當然你要照舊版的輸入也可以),在 RHEL5.1 就只要將 bind9 安裝、預設值啟動服務即可使用這台 Caching-only Name Server。

安裝 bind9

預設值灌好的 RHEL5.1 並沒有安裝好 DNS 伺服端軟體 bind,只有安裝 bind-utils 這個 DNS 客戶端軟體,當我們調整好 yum 後,即可使用「yum list | grep bind」列舉出 bind 字眼的相關軟體,並使用「yum install -y bind」來安裝 DNS Server 軟體。

溫馨提示:RHEL5(或 RHEL5.1)yum 設定與調整請參考第21期『使用 yum 管理套件;建置 yum Server』一文。

r

啟動 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 是因為從未啟動過)。

r

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

r

named 與 firewall 相關設定

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

溫馨提示:DNS 在做 zone transfer 時是使用 tcp 53 埠方式(有別於一般查詢的 udp 53 埠)。

r

測試 DNS 服務

在客戶端主機使用「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 主機。

r

向下授權例如國際域名像是:

.com 結尾該問哪些 Name Server 主機。

.net 結尾該問哪些 Name Server 主機。

.org 結尾該問哪些 Name Server 主機。

另外還有國家級域名例如:

.tw 結尾該問哪些 Name Server 主機(主要是台灣在管理的)。

.cn 結尾該問哪些 Name Server 主機(主要是中國在管理的)。

.hk 結尾該問哪些 Name Server 主機(主要是香港在管理的)。

架設 Caching-only 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 客戶端工具介紹

筆者介紹 dns 客戶端工具時,都說是『三加一』,整理如下表:

 

指令名稱dighostnslookupwhois
程式功能用來查詢各種不同類型 DNS 紀錄(record)的工具主要用來查詢網域名稱的相關資訊
(例如查詢網域名稱的擁有者)
程式現況
及其特色
Linux 通常灌好就有裝
建議用來取代 nslookup
Linux 建議用 dig/host 取代
Windows 內建有 nslookup
指令 whois 在 Linux 通常灌好就有裝
此外亦有網站提供的 whois 查詢功能
例如 http://www.twnic.net/

關於 dig 基本的解說

筆者覺得輸入 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)。

溫馨提示:問的到 168.95.1.1(網際網路)的名稱解析,意味著網際網路的連線『應該』是通的。

r

關於 dig 較詳細的解說

下圖是指令「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 的意思)。

溫馨提示:若沒有特別指明查詢的紀錄類型(Record Type)的話,dig 預設是查 A 紀錄。

『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 其中一台所回答出來的。

溫馨提示:回應所有 babyface.com.tw 結尾的紀錄應該都是由 ns1.babyface.com.tw 與 ns2.babyface.com.tw 這兩台所回答的,例外情況像是這兩台有做「授權子網域」(delegate subdomain)的動作,就有可能由別台 Name Server 回答。

r

名稱查詢 Cache 與 TTL 解說

我們第二次向 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 詢問。

r

如果我們直接向 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 是不會減少的(也不需要減少)。

溫馨提示:注意看此次 dig 回應的 flags 中,有個 aa 的 flag(Authoritative Answer 之意),仔細與先前的查詢拿來比較的話,先前 TTL 會減少的則不會有這個 aa flag。

r

架設內部專用的 DNS Server

若企業尚未購買網域名稱之前,我們可以先行架個內部專用的 DNS Server 來方便內部名稱解析使用。

挑個『內部專用』網域名稱

訂定內部專用的網域名稱時,如果此網域名稱很簡短的話,避免使用到已知的頂級域名(Top-level domain name)免得造成不必要的困擾。

避開的頂級域名像是 .com、.org、.net 等等。

避開的頂級域名(國家或地區)像是 .tw、.cn、.jp 等等。

溫馨提示:請參考『http://zh.wikipedia.org/w/index.php?title=顶级域名列表&variant=zh-tw』有著頂級域名列表。

r

底下就以網域名稱『ol』(OnLine 之意)作為我們測試用的『內部專用』網域名稱。

新增 ol 網域且角色為 master

開啟 /etc/named.conf 編寫內容如下:

options {
        directory "/var/named"; // 之後的 record 都是放在 /var/named/ 目錄下
};

zone "ol" in {
        type master;
        file "ol.db";           // record 檔案位於 /var/named/ol.db
};

這個檔案在輸入內容的時候很容易出錯,尤其是在參數那幾行的結尾以及大括號結束的地方需加上 ; (分號)要特別注意。

溫馨提示:此檔案建議使用 C/C++ 註解方式(單行註解 // ;多行註解 /* 註解夾在中間 */)此外 Unix # 字號的註解方式也行得通(某些很舊的版本是不能用 # 字號當註解)。

以上的輸入可看做兩個區段,一個 options 區段是給整個 named 用的;另一個 zone "ol" 則是用來新增 ol 網域且角色為 master 用的。

給整個 named 用的 options 區段內 directory 參數意思是之後提到的 file(record 檔案)都是放在 /var/named 底下,例如:『file "ol.db";』就是放在 /var/named/ol.db 這個位置。

r

寫好了之後接下來就是重啟 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 檔案,重啟才會正常。

r

溫馨提示:筆者在此採『一步一腳印』的方式來配置 DNS Server 是為了避免因輸入錯誤而造成一些怪怪的問題。

編寫 ol 網域的 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),這五個數字各有用途,留到後面再詳述。

溫馨提示:record 檔案的註解符號是分號( ; ),不能使用 C/C++ 註解方式。

第二筆是 NS 紀錄:此行的開頭空白,意思是續接上一筆紀錄的 @ (代表這個 zone),Name Server 紀錄為 ns1(就是 ns1.ol.)。

溫馨提示:由以上兩筆紀錄看出 ol 有一筆 SOA 紀錄同時也有一筆 NS 紀錄。

第三筆是 A 紀錄:此行開頭的 ns1(就是 ns1.ol.),有一筆 A 紀錄(Address)指向到 IP 為 172.18.0.35 (也就是這台 Name Server 主機的 IP 位址)。

r

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

r

使用 dig 來做測試

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

r

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

r

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

r

Name Server 主機的 /etc/resolv.conf 建議設定值

剛才我們在用 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』這段敘述。

溫馨提示:所有的 Client 主機在 Name Server 架好以後,也應該問這台比較近的 Name Server 才是。

圖為方式二的情況,也是筆者偏好的設定方式。

r

新增紀錄

在『新增 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

溫馨提示:這個檔案使用『TAB 鍵』當分隔會比『空白鍵』整齊且好調整。

r

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

r

 

Valid XHTML 1.0! Valid CSS! Get Firefox

Creative Commons License
This site is licensed under a Creative Commons Attribution 2.5 Taiwan License.