实践仅缓存DNS服务器
2018-01-31王继敏
王继敏
【摘 要】仅缓存DNS服务器(Cache Only DNS Server)可以加速本地局域网内的DNS查询请求并有效节省网络带宽。在阐明相关技术原理的基础上实践配置了一个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服务器在一些局域网办公环境中也是很常用的,它能有效的加速本地局域网内的DNS查询请求并节省网络带宽。本文在阐明相关技术原理的基础上实践配置了一个DNS缓存服务器。
本文所述的命令、配置文件等都基于RHEL6.3(Redhat Enterprise Linux 6.3),不同Linux发行版之间或许有细微的差别,这些差异不在本文的探讨范围之内。
1 相关概念及技术原理
1.1 名称解析
名称解析(Name Resolution)就是以名称作为自变量的一个映射,例如在TCP/IP网络上的域名(Domain Name)解析为对应的IP地址。在Linux操作系统中,有多处需要名称解析的地方,因此有一个专门的配置文件/etc/nsswitch.conf定义对于各种名称解析的映射规则。NSSwitch可以理解为name service switch configuration(名字服务切换配置)。打开这个文件看一下,可以看到其中有一行:
Hosts: files dns
这行文本就规定了,当查找主机名(hosts)相关信息的时候,先搜索本地文件/etc/hosts文件,如果本地查询失败的话则查询DNS(本地解析的优先级高)。
1.2 2DNS与DNS服务器
DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。实质上它是一个关于资源记录的目录,其中的每一条目录記录了一个从名称到地址的对应关系,如主机名到IP地址、域名到权威的名称服务器等等。客户端向DNS服务器提出域名查询请求,最终得到该域名对应的IP地址的过程叫做域名解析。因特网上的整个DNS构成了一个树形结构。
1.3 仅缓存DNS原理
Linux中有一个关于DNS域名解析的配置文件/etc/resolv.conf,它规定了在进行DNS查询时首先查询的名称服务器。整个查询过程如下[1]:
首先,客户端查询/etc/resolv.conf文件中所列的第一个名称服务器。接着,该名称服务器会查询本地数据库和缓存:如果本地数据库中有该资源记录(该名称服务器对该域进行权威解析),则返回查询结果;如果没有,则查询缓存,看看缓存中是否有以前对该资源记录的查询结果,如有,则返回查询结果;如果仍然没有,则会向其他DNS服务器进行递归解析。接下来进入递归解析过程。进入递归解析后本地DNS服务器向根域DNS服务器(Root Nameserver)提出查询请求;根域DNS服务器会返回顶级域(TLD)DNS服务器地址(例如.com的DNS服务器地址);本地DNS服务器再次向TLD Nameserver发出查询请求,TLD Nameserver会返回下一级域的DNS服务器地址;依此类推,直到查询到权威的名称服务器。
本地DNS服务器从权威域名服务器获得查询结果,将查询结果返回给客户端,并在本地DNS服务器中缓存该查询结果;如果客户端再次提出同样的查询请求,本地DNS服务器直接从缓存中取得对于结果返回给客户端。
2 实践配置仅缓存DNS服务器
假设办公局域网的IP地址配置为192.168.3.0/24网段,在该局域网内配置一台仅缓存DNS服务器。
2.1 软件包的安装
为了提供DNS服务,我们需要使用伯克利大学开发的BIND软件,即Berkeley Internet Name Domain。如果采用了默认的最小化安装方式安装RHEL6.3,是没有安装BIND套件的。可以通过如下命令查询系统中是否安装了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
如果命令结果如上文所示,表明已经安装好了BIND套件。否则需要执行安装命令安装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段落进行简单的修改,即可以实现一个仅缓存DNS服务器。下面对需要强调和修改的地方进行解释说明:
listen-on port 53 { 127.0.0.1; },表明该DNS服务对来自其他IP地址的查询请求不予响应,而仅仅监听在本地回环地址的53号端口。这显然不符合要求,为了使该服务器能够作为本地局域网内的DNS缓存服务器,需要把此地址修改为服务器所在的局域网的网段。假定服务器所在的局域网网段为192.168.3.0/24,那么该字段修改为listen-on port 53 { 192.168.3.0/24; }。
listen-on-v6 port 53 { ::1; },此处用IPv6的表示方法定义了该DNS服务对来自其他IP地址的查询请求不予响应,而仅仅监听在本地回环地址的53号端口。此处可以将{ ::1; }成{ none; },也可以简单的将该行注释掉。
allow-query { localhost; },仅允许本机提出DNS查询请求。这一行代码规定了允许提供DNS查询请求的客户端地址,这里的localhost代表的是当前的DNS服务器主机,allow-query { localhost; }即表示仅允许当前主机提出DNS查询请求。此处用本网段地址192.168.3.0/24或者用localnet来代替localhost,表示允许本局域网中的所有主机提出查询。即修改后的代码为allow-query{localnet}。
recursion yes,是否允许进行递归解析,这里如果是no表示关闭递归解析功能,配置文件的默认值为yes,即允许递归解析。一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。由于此处仅需要配置一个缓存DNS服务器,这种DNS服务器的特征是仅仅将本地局域网内的所有查询转发到其他DNS服务器处理,而自身并不存储域名数据库。所以此处必须设置为recursion yes。
forward only,这一行在默认的配置文件中是没有的。此行代码规定,假如来自客户机的DNS解析请求没有在本服务器的缓存中查找到,此DNS服务器不会从根域开始进行递归查询,它仅把来自客户机端的DNS解析查询向其他DNS服务器上转发。需要注意的是这个选项只有配合forwarders列表才有意义,在该配置文件的forwarders列表中定义了当缓存查询没有命中时将要转发至哪些DNS服务器。
forwards { 180.76.76.76; },即forwarders列表。forwarders列表中定义了当缓存查询没有命中时,将要把来自客户端的DNS查询请求转发至哪些DNS服务器。这里可以把多个DNS服务器的地址添加到forwarders列表中。Cache-Only DNS Server如果在本地的缓存查询中没有命中,那么它会在自己的forwarders列表中取出一台DNS服务器的地址,将客户端DNS查询请求向此服务器转发,如果从这台服务器获取了DNS应答,那么将此应答转发给客户端,同时将此应答结果缓存起来供再次查询使用。假如没有收到应答,它会在自己的forwarders列表中取出下一台DNS服务器的地址,重复上面的过程。依此类推,直到接收到来自DNS服务器的确定应答。
2.3 重啟服务
执行命令service named restart重启named服务,这样一台仅缓存DNS服务器配置成功。
【参考文献】
[1]鸟哥.鸟哥的Linux私房菜服务器架设篇[M].第三版.北京:机械工业版社,2010:586-587.