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