王繼敏
【摘 要】僅緩存DNS服務器(Cache Only DNS Server)可以加速本地局域網(wǎng)內(nèi)的DNS查詢請求并有效節(jié)省網(wǎng)絡帶寬。在闡明相關技術原理的基礎上實踐配置了一個DNS緩存服務器。
【關鍵字】DNS;Linux
中圖分類號: TP393.07 文獻標識碼: A 文章編號: 2095-2457(2018)30-0181-002
DOI:10.19694/j.cnki.issn2095-2457.2018.30.079
Building Caching Only DNS Server
WANG Ji-min
(School of Information Engineering,Henan Institute of Science and Technology,Xinxiang Henan 453003,China)
【Abstract】Cache Only DNS Server can speed up DNS query requests within the local LAN and effectively save network bandwidth.On the basis of explaining the related concept and principle, this paper shows main steps to build a cache only DNS server.
【Key words】DNS;Linux
0 引言
僅緩存DNS服務器在一些局域網(wǎng)辦公環(huán)境中也是很常用的,它能有效的加速本地局域網(wǎng)內(nèi)的DNS查詢請求并節(jié)省網(wǎng)絡帶寬。本文在闡明相關技術原理的基礎上實踐配置了一個DNS緩存服務器。
本文所述的命令、配置文件等都基于RHEL6.3(Redhat Enterprise Linux 6.3),不同Linux發(fā)行版之間或許有細微的差別,這些差異不在本文的探討范圍之內(nèi)。
1 相關概念及技術原理
1.1 名稱解析
名稱解析(Name Resolution)就是以名稱作為自變量的一個映射,例如在TCP/IP網(wǎng)絡上的域名(Domain Name)解析為對應的IP地址。在Linux操作系統(tǒng)中,有多處需要名稱解析的地方,因此有一個專門的配置文件/etc/nsswitch.conf定義對于各種名稱解析的映射規(guī)則。NSSwitch可以理解為name service switch configuration(名字服務切換配置)。打開這個文件看一下,可以看到其中有一行:
Hosts: files dns
這行文本就規(guī)定了,當查找主機名(hosts)相關信息的時候,先搜索本地文件/etc/hosts文件,如果本地查詢失敗的話則查詢DNS(本地解析的優(yōu)先級高)。
1.2 2DNS與DNS服務器
DNS是因特網(wǎng)上作為域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使用戶更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的IP數(shù)串。實質(zhì)上它是一個關于資源記錄的目錄,其中的每一條目錄記錄了一個從名稱到地址的對應關系,如主機名到IP地址、域名到權威的名稱服務器等等。客戶端向DNS服務器提出域名查詢請求,最終得到該域名對應的IP地址的過程叫做域名解析。因特網(wǎng)上的整個DNS構成了一個樹形結構。
1.3 僅緩存DNS原理
Linux中有一個關于DNS域名解析的配置文件/etc/resolv.conf,它規(guī)定了在進行DNS查詢時首先查詢的名稱服務器。整個查詢過程如下[1]:
首先,客戶端查詢/etc/resolv.conf文件中所列的第一個名稱服務器。接著,該名稱服務器會查詢本地數(shù)據(jù)庫和緩存:如果本地數(shù)據(jù)庫中有該資源記錄(該名稱服務器對該域進行權威解析),則返回查詢結果;如果沒有,則查詢緩存,看看緩存中是否有以前對該資源記錄的查詢結果,如有,則返回查詢結果;如果仍然沒有,則會向其他DNS服務器進行遞歸解析。接下來進入遞歸解析過程。進入遞歸解析后本地DNS服務器向根域DNS服務器(Root Nameserver)提出查詢請求;根域DNS服務器會返回頂級域(TLD)DNS服務器地址(例如.com的DNS服務器地址);本地DNS服務器再次向TLD Nameserver發(fā)出查詢請求,TLD Nameserver會返回下一級域的DNS服務器地址;依此類推,直到查詢到權威的名稱服務器。
本地DNS服務器從權威域名服務器獲得查詢結果,將查詢結果返回給客戶端,并在本地DNS服務器中緩存該查詢結果;如果客戶端再次提出同樣的查詢請求,本地DNS服務器直接從緩存中取得對于結果返回給客戶端。
2 實踐配置僅緩存DNS服務器
假設辦公局域網(wǎng)的IP地址配置為192.168.3.0/24網(wǎng)段,在該局域網(wǎng)內(nèi)配置一臺僅緩存DNS服務器。
2.1 軟件包的安裝
為了提供DNS服務,我們需要使用伯克利大學開發(fā)的BIND軟件,即Berkeley Internet Name Domain。如果采用了默認的最小化安裝方式安裝RHEL6.3,是沒有安裝BIND套件的。可以通過如下命令查詢系統(tǒng)中是否安裝了BIND套件:
$sudo rpm -qa | grep "^bind"
bind-libs-9.8.2-0.17.rc1.el6_4.6.i686
bind-9.8.2-0.17.rc1.el6_4.6.i686
bind-utils-9.8.2-0.17.rc1.el6_4.6.i686
如果命令結果如上文所示,表明已經(jīng)安裝好了BIND套件。否則需要執(zhí)行安裝命令安裝bind和bind-utils兩個包,然后將DNS服務設置為在相關運行級別下開啟:
$ sudo yum install bind
$ sudo yum install bind-utils
$ sudo chkconfig named on
2.2 修改配置文件
提供DNS服務的軟件為named,該服務的主配置文件/etc/named.conf,其默認配置文件用vim打開如下(文件較長,部分代碼用省略號替代)。
options {
... ...
};
logging {
... ...
};
zone "." IN {
... ...
};
該文件包括了options、logginghe zone “.” IN三個段落,僅需要對options段落進行簡單的修改,即可以實現(xiàn)一個僅緩存DNS服務器。下面對需要強調(diào)和修改的地方進行解釋說明:
listen-on port 53 { 127.0.0.1; },表明該DNS服務對來自其他IP地址的查詢請求不予響應,而僅僅監(jiān)聽在本地回環(huán)地址的53號端口。這顯然不符合要求,為了使該服務器能夠作為本地局域網(wǎng)內(nèi)的DNS緩存服務器,需要把此地址修改為服務器所在的局域網(wǎng)的網(wǎng)段。假定服務器所在的局域網(wǎng)網(wǎng)段為192.168.3.0/24,那么該字段修改為listen-on port 53 { 192.168.3.0/24; }。
listen-on-v6 port 53 { ::1; },此處用IPv6的表示方法定義了該DNS服務對來自其他IP地址的查詢請求不予響應,而僅僅監(jiān)聽在本地回環(huán)地址的53號端口。此處可以將{ ::1; }成{ none; },也可以簡單的將該行注釋掉。
allow-query { localhost; },僅允許本機提出DNS查詢請求。這一行代碼規(guī)定了允許提供DNS查詢請求的客戶端地址,這里的localhost代表的是當前的DNS服務器主機,allow-query { localhost; }即表示僅允許當前主機提出DNS查詢請求。此處用本網(wǎng)段地址192.168.3.0/24或者用localnet來代替localhost,表示允許本局域網(wǎng)中的所有主機提出查詢。即修改后的代碼為allow-query{localnet}。
recursion yes,是否允許進行遞歸解析,這里如果是no表示關閉遞歸解析功能,配置文件的默認值為yes,即允許遞歸解析。一般客戶機和服務器之間屬于遞歸查詢,即當客戶機向DNS服務器發(fā)出請求后,若DNS服務器本身不能解析,則會向另外的DNS服務器發(fā)出查詢請求,得到結果后轉(zhuǎn)交給客戶機。由于此處僅需要配置一個緩存DNS服務器,這種DNS服務器的特征是僅僅將本地局域網(wǎng)內(nèi)的所有查詢轉(zhuǎn)發(fā)到其他DNS服務器處理,而自身并不存儲域名數(shù)據(jù)庫。所以此處必須設置為recursion yes。
forward only,這一行在默認的配置文件中是沒有的。此行代碼規(guī)定,假如來自客戶機的DNS解析請求沒有在本服務器的緩存中查找到,此DNS服務器不會從根域開始進行遞歸查詢,它僅把來自客戶機端的DNS解析查詢向其他DNS服務器上轉(zhuǎn)發(fā)。需要注意的是這個選項只有配合forwarders列表才有意義,在該配置文件的forwarders列表中定義了當緩存查詢沒有命中時將要轉(zhuǎn)發(fā)至哪些DNS服務器。
forwards { 180.76.76.76; },即forwarders列表。forwarders列表中定義了當緩存查詢沒有命中時,將要把來自客戶端的DNS查詢請求轉(zhuǎn)發(fā)至哪些DNS服務器。這里可以把多個DNS服務器的地址添加到forwarders列表中。Cache-Only DNS Server如果在本地的緩存查詢中沒有命中,那么它會在自己的forwarders列表中取出一臺DNS服務器的地址,將客戶端DNS查詢請求向此服務器轉(zhuǎn)發(fā),如果從這臺服務器獲取了DNS應答,那么將此應答轉(zhuǎn)發(fā)給客戶端,同時將此應答結果緩存起來供再次查詢使用。假如沒有收到應答,它會在自己的forwarders列表中取出下一臺DNS服務器的地址,重復上面的過程。依此類推,直到接收到來自DNS服務器的確定應答。
2.3 重啟服務
執(zhí)行命令service named restart重啟named服務,這樣一臺僅緩存DNS服務器配置成功。
【參考文獻】
[1]鳥哥.鳥哥的Linux私房菜服務器架設篇[M].第三版.北京:機械工業(yè)版社,2010:586-587.