DNS解析与域名服务安全防护策略

企业开源 DNS 服务应用概述

在 Internet 上域名与 IP 地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识 IP 地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS 就是进行域名解析的服务器。DNS 是域名系统 Domain Name System 的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,用户在上网时输入的网址,是通过域名解析系解析找到相对应的 IP 地址,这样才能上网。其实,域名的最终指向是 IP。

DNS 是一个分层级的分散式名称对应系统,看起来有点像电脑的目录树结构。在最顶端的是一个“.”(root),然后其下分为好几个基本类别名称,如 com、org、edu 等。再下面是组织名称,如 sun、yale 等。继而是主机名称,如 eng、cs、ntu 等。如图 1 所示的 DNS 域名空间的分层结构:

图 1.DNS 域名空间的分层结构

值得一提的是,因为当初 Internet 是从美国发起的,所以当时并没有国域名称。但随着后来 Internet 的蓬勃发展,DNS 也加进了诸如 cn、jp、au 等国域名称。所以一个完整的 DNS 名称就好像是这样的 www.xyz.com.cn 而整个名称对应的就是一个 IP 地址了。在开始的时候 root 下面只有六个组织类别:

  • edu:教育学术单位
  • org:组织机构
  • net:网路通讯单位
  • com:公司企业
  • gov:政府机关
  • mil:军事单位

不过自从组织类别名称开放以後各种各样五花八门的名称也相继出现,但无论如何取名的规则最好量适合网站性质。除了原来的类别资料由美国的 NIC(Network Information Center)管理之外,其它在国域以下的类别分别由该国的 NIC 管理。

DNS 系统的组成

DNS 系统基于客户机 / 服务器模式,从概念上说它主要由三个部分组成:

(1)域名空间:域名空间中的记录标识一组主机并提供它们的有关信息。域中的每一个节点都有它的有关信息的数据库。查询命令试图从这个数据库中提取适当的信息。简单地说,域名空间是所有不同类型信息的列表,这些信息是域名、IP 地址、邮件别名和那些在 DNS 系统中能查到的内容。

(2)域名服务器:保持并维护域名空间中的数据的程序。每个域名服务器含有一个域名空间子集的完整信息,并保存其它有关部分的信息。一个域名服务器拥有它控制范围的完整信息。控制的信息按区进行划分,区可以分布在不同的域名服务器上,以便为每个区提供服务。每个域名服务器都知道所有负责其他区的域名服务器。如果来了一个请求,它请求给定域名服务器负责的那个区的信息,那么这个域名服务器只是简单地返回信息。但是,如果请求是不同区的信息,那么这个域名服务器就要与控制该区的相应服务器联系。

(3)解析器:解析器是简单的程序或子程序库,它从服务器中提取信息以响应对域名空间内主机的查询。

DNS 是一个很复杂的概念,下表列出了常用的 DNS 术语:

  • 域:代表网络一部分的逻辑实体或组织。
  • 域名:主机名的一部分,它代表包含这个主机的域。它可以和域交换使用。
  • 主机:网络上的一台计算机。
  • 节点:网络上的一台计算机。
  • 域名服务器:提供 DNS 服务的计算机,它将 DNS 名字转化为 IP 地址。
  • 解析:把一个域名转化为与其相应的 IP 地址的过程。
  • 解析器:从域名服务器中提取 DNS 信息的程序或库子程序。
  • 反向解析:将给出的 IP 地址转化为其相应的 DNS 名字。
  • 欺骗:使网络看上去好象具有不同的 IP 地址或域名的行为。

DNS 服务器的类型

DNS 域名服务器是用来存储主机 - 域名映射信息的,这些服务器具体又可以分为 3 类:

(1)主 DNS 服务器(primary name server):它是特定域所有信息的权威性信息源。它从域管理员构造的本地磁盘文件中加载域信息,该文件(区文件)包含着该服务器具有管理权的一部分域结构的最精确信息。主服务器是一种权威性服务器,因为它以绝对的权威去回答对其管辖域的任何查询。

(2)辅助 DNS 服务器(secondary name server):它可从主服务器中复制一整套域信息。区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。这种复制称为“区文件复制”。在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。因此,辅助域名服务器也称作权威性服务器。配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。

(3)高速缓存服务器(caching-only server):可运行域名服务器软件,但是没有域名数据库软件。它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。

DNS 的工作原理

DNS 基于 C/S(Client/Server,客户机 / 服务器)模式,因而分为 Client 和 Server 两种角色。Client 扮演询问的角色,也就是向 Server 询问一个 Domain Name,而 Server 必须要回答此 Domain Name 所对应的真正 IP 地址。而当地的 DNS 先会查自己的资料库。如果自己的资料库没有,则会往该 DNS 上所设的其他 DNS 进行求助询问,依此得到答案之后,将收到的答案存起来,并回答客户。

DNS 服务器会根据不同的授权区(Zone),记录所属该网域下的各名称资料,这个资料包括网域下的次网域名称及主机名称。在每一个名称服务器中都有一个高速缓存区(Cache),这个 高速缓存区的主要目的是将该名称服务器所查询出来的名称及相对的 IP 地址记录在高速缓存区中,这样当下一次还有另外一个客户端到次服务器上去查询相同的名称时,服务器就不用在到别台主机上去寻找,而直接可以从缓存区中找到该名称记录资料,传回给客户端,以加速客户端对名称查询的速度。

举个例子,当 DNS 客户端向指定的 DNS 服务器查询网 Internet 上的某一台主机名称时,DNS 服务器会先在自己的高速缓存区中查询有无该条纪录,如果找到该条名称记录后,会从 DNS 服务器直接将所对应到的 IP 地址传回给客户端;如果查不到,则再次在本地资料库中找寻用户所指定的名称;如果 DNS 服务器在高速缓存区中和本地资料记录都查不到时,服务器才会向别的 DNS 服务器查询所要的名称。例如,本地的 DNS 服务器会向最接近(比如属于同一个 IP 地址段或者同一个 ISP)的 DNS 服务器去要求帮忙找寻该名称的 IP 地址。在另一台服务器上也有相同的动作的查询,当查询到后会回复原本要求查询的服务器,该 DNS 服务器在接收到另一台 DNS 服务器查询的结果后,先将所查询到的主机名称及对应 IP 地址记录到高速缓存区中,最后在将所查询到的结果回复给客户端。这样就成功地完成了一次标准的 DNS 查询 - 应答过程。

开源 DNS 服务构建面临的主要安全威胁分析

DNS 由于受当时条件限制,其系统设计存在很多缺陷:

  1. 单点故障:DNS 采用层次化的树形结构,由树叶走向树根就可以形成—个全域名(Fully Qualified Domain Name,FQDN),DNS 服务器作为该 FQDN 唯一对外的域名数据库和对内部提供递归域名查询的系统,因而其安全和稳定就存在单点故障风险。
  2. 无认证机制:DNS 没有提供认证机制,查询者在收到应答时无法确认应答信息的真假,就容易导致 DNS 欺骗。比如,提交给某个域名服务器的域名解析请求数据包被黑客截获,黑客可以将一个虚假的 IP 地址作为应答信息返回给请求者,那么原始请求者就误以为这是正确的 IP 地址而访问它,从而这样就导致了 DNS 欺骗。
  3. 访问量和维护量巨大以及远距离集中式数据库:如果部署中采用单个或者少数个名字服务器,则这些服务器不得不处理所有 DNS 查询消息,并保存所有因特网主机的记录,数据库会相当巨大,需要为每台新增的主机频繁更新,而且单台或者少数台名字服务器主机不可能在所有请求查询的客户主机附近,就可能导致相当大的延迟。
  4. DNS(Berkeley Internet Name Domain)的漏洞:DNS 是域名软件,它在提供高效服务的同时也存在许多的安全性漏洞。现已证明在 DNS 版本 4 和 8 上存在缺陷,攻击者利用这些缺陷能成功地进行 DNS 欺骗攻击。构成严重威胁的漏洞主要有两种:一种是缓冲区溢出漏洞,严重的可以使攻击者在 DNS 服务器上执行任意指令。另一种是 DoS 漏洞,受攻击后 DNS 服务器不能提供正常服务,而且其所辖的子网无法正常工作。

DNS 面临的网络威胁是指 DNS 在实际的应用和部署中,不法用户或者黑客利用 DNS 协议或者软件设计的漏洞,可以通过网络向 DNS 发起的攻击,主要包括如下几种:

  1. 内部攻击:攻击者在非法或合法地控制一台 DNS 服务器后,可以直接操作域名数据库,修改指定域名所对应的 IP 为自己所控制的主机 IP,当客户发出对指定域名的查询请求后,将得到伪造的 IP 地址。
  2. 序列号攻击:DNS 协议格式中定义了用来匹配请求数据包和响应数据报序列 ID,欺骗者利用序列号伪装成 DNS 服务器向客户端发送 DNS 响应数据包,在 DNS 服务器发送的真实 DNS 响应数据报之前到达客户端,从而将客户端带到攻击者所希望的网站,进行 DNS 欺骗。
  3. 信息插入攻击:攻击者可以在 DNS 应答报文中随意添加某些信息,指示权威域名服务器的域名及 IP,那么在被影响的域名服务器上查询该域的请求都会被转向攻击者所指定的域名服务器上去,从而威胁到网络数据的完整性。
  4. 缓存中毒:DNS 使用超高速缓存,即当一个名字服务器收到有关域名和 IP 的映射信息时,它会将该信息存放在高速缓存中。当再次遇到相同的映射请求,能直接使用缓存中的结果,这种映射表是动态更新的,刷新也是有时限的,这样假冒者如果在下次更新之前成功地修改了 DNS 服务器上的映射缓存,就可以进行 DNS 欺骗或者 DDoS 攻击了。
  5. 信息泄漏:DNS 的缺省设置允许任何人进行区传送(区传送一般用于主服务器和辅服务器之间的数据同步,辅服务器可以从主服务器获取最新区数据文件的副本,也就可以获得整个授权区域内的所有主机信息 ),区传送可能会造成信息泄漏。一旦这些信息泄漏,攻击者就可以根据它轻松地推测主服务器的网络结构,并从这些信息中判断其功能或发现那些防范措施较弱的机器。
  6. 不安全的动态更新:随着动态主机配置协议(DHCP)的出现,客户计算机由 DHCP 服务器动态分配 IP 地址,使原来手工更新其 A(Address)记录和 PTR(反向解析)记录变得很难管理。因此在 RFC2136 标准草案中提出了 DNS 动态更新,使得 DNS 客户端在 IP 地址或名称出现更改的任何时候都可利用 DNS 服务器来注册和动态更新其资源记录。尽管 DNS 动态更新协议规定只有经过授权的主机才能动态更新服务器的 zone file,但是攻击者还是可以利用 IP 欺骗伪装成 DNS 服务器信任的主机对区数据进行添加、删除和替换。

实战一:DNS 服务安全配置

在使用 DNS 服务器之前,需要对与之相关的配置文件进行配置,因而首先需要了解这些基本文件,下面列表给出了几种主要的与 DNS 有关的文件:

  1. /etc/name.conf 文件:它是 DNS 服务器的主文件,通过它可以设置一般的 name 参数,指向该服务器使用的域数据库的信息源。
  2. /var/named/named.ca 文件:它是根域名配置服务器指向文件,通过它来指向根域名服务器,用于高速缓存服务器初始化。
  3. /var/named/localhost.zone 文件:localhost 区文件,用于将名字 localhost 转换为本地回送 IP 地址(127.0.0.1)。
  4. /var/named/localhost.zone 文件:localhost 区反向域名解析文件,用于将本地 IP 地址(127.0.0.1)转化为会送方 localhost 名字。
  5. /var/named/name2ip.conf 文件:用户配置的正向解析文件,将主机名映射为 IP 地址。
  6. /var/named/ip2name.conf 文件:用户配置的反向解析文件,将 ip 地址映射为主机名。

named.conf 主配置文件

在使用 named.conf 进行配置时,需要了解如下常用的配置语句,如表 1 所示。

表 1.named.conf 主配文件配置语句说明
配置语句 说 明
zone 定义一个区
options 定义全局配置选项
include 将其他文件包含到本配置文件中使用
controls 定义 rndc 命令使用的控制通道
acl 定义基于 IP 地址的访问控制
Key 定义授权的安全密钥

根据在实际应用中的广泛程度和重要性,下面我们着重对 option 语句和 zone 声明的使用进行介绍。

使用 option 语句

option 语句的使用语法为:

 option { 
配置子句 1;
配置子句 2;
 };

在上述语法中,其配置子句常用的主要有如下两类:

  • directory:该子句后接目录路径,主要用于定义服务器区配置文件的工作目录,如 /home 等,在 Red Hat Enterprise Linux 5 系统中的默认路径为 /var/named;
  • forwarders:该子句后接 IP 地址,定义转发器;

使用 zone 声明

区声明是主配置文件中非常常用而且是最重要的部分,它一般要说明域名、服务器类型以及域信息源三个重要部分。它的语法为:

 zone “zone_name” IN { 
 type 子句;
 file  子句;
其他子句;
 };

那么,围绕上述三个重要部分,区声明语句有如下两类子句:

  • type:其主要有如下三种,master(说明一个区为主域名服务器)、slave(说明一个区为辅助域名服务器)和 hint(说明一个区为启动时初始化高速缓存的域名服务器)。
  • file:后接文件路径,主要说明一个区的域信息源的路径。

DNS 服务器配置实例

为了方便读者对 DNS 服务器配置文件的使用有个详细的了解,本节将针对一个实际的配置文件例子来进行讲解。该配置文件如下所示。我们虚构了一个域 feixiang.com 来举例说明主服务器的配置,下面是定义 feixiang.com 域的主服务器的 named.conf 文件:

 // generated by named-bootconf.pl 

 options { 
 directory "/var/named"; 
 /* 
 * If there is a firewall between you and nameservers you want 
 * to talk to, you might need to uncomment the query-source 
 * directive below. Previous versions of BIND always asked 
 * questions using port 53, but BIND 8.1 uses an unprivileged 
 * port by default. 
 */ 
 // query-source address * port 53; 
 }; 


 // a caching only nameserver config 
 // 
 zone "." { 
 type hint; 
 file "named.ca"; 
 }; 
 zone "feixiang.com"{ 
 type master; 
 file "feixiang.com"; 
 }; 

 zone "0.0.127.in-addr.arpa" { 
 type master; 
 file "named.local"; 
 }; 

 zone "198.25.in-addr.arpa"{ 
 type master; 
 file "named.rev"; 
 };

上例中第一个 master 告诉我们这是 feixiang.com 域的主服务器。该域的数据是从 named.hosts 文件中加载的。在我们这个例子中,我们将文件名 named.hosts 作为区文件名。第三个 master 语句指向能将 IP 地址 198.25.0.0 映射为主机名的文件。它假定本地服务器是反向域 198.25.in-addr.arpa 的主服务器,该域的数据从文件 named.rev 中加载。

除了定义上述的主文件外,还需要定义如下的区文件(/var/named/feixiang.com):

 $TTL86400 
 $ORIGIN feixiang.com. 
 @1D IN SOA@ root ( 
 42; serial (d. adams) 
 3H; refresh 
 15M; retry 
 1W; expiry 
 1D ); minimum 

 @ IN NS@ 
 @ IN A127.0.0.1 
 www IN A198.25.25.80 
 ftp IN A198.25.25.68 
 web IN CNAMEwww

实战二:安全使用 DNS 服务器的高级技巧

配置辅助域名服务器做到冗余备份

辅助服务器可从主服务器中复制一整套域信息。区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。这种复制称为“区文件复制”。在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。因此,辅助域名服务器也称作权威性服务器。配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。

辅助服务器的配置与主服务器的配置不同,它使用 slave 语句代替 master 语句。slave 语句指向用作域信息源的远程服务器,以替代本地磁盘文件。下面的 named.conf 文件可以配置 feixiang.com 域的辅助服务器:

 // generated by named-bootconf.pl 

 options { 
 directory "/var/named"; 
 /* 
 * If there is a firewall between you and nameservers you want 
 * to talk to, you might need to uncomment the query-source 
 * directive below. Previous versions of BIND always asked 
 * questions using port 53, but BIND 8.1 uses an unprivileged 
 * port by default. 
 */ 
 // query-source address * port 53; 
 }; 

 // 
 // a caching only nameserver config 
 // 
 zone "." { 
 type hint; 
 file "named.ca"; 
 }; 

 zone "0.0.127.in-addr.arpa" { 
 type master; 
 file "named.local"; 
 }; 
 zone "feixiang.com"{ 
 type slave; 
 file "named.hosts"; 
 masters {25.198.10.3;}; 
 }; 
 zone "198.25.in-addr.arpa"{ 
 type slave; 
 file "named.rev"; 
 masters {25.198.10.3;}; 
 }; 
 cache . named.ca 
 secondary vbrew.com 25.198.10.3 named.hosts 
 secondary 198.25.in-addr.arpa 25.198.10.3 named.rev 
 primary 0.0.127.in-addr.arpa named.local

第一个 slave 语句是使这个服务器成为 vbrew.com 的辅助服务器。它告诉 named 从 IP 地址为 25.198.10.3 的服务器中下载 feixiang.com 的信息,并将其数据保存在 /var/named/named.hosts 文件中。如果该文件不存在,named 就创造一个,并从远程服务器中取得区数据,然后将这些数据写入新创建的文件中。如果存在该文件,named 就要检查远程服务器,以了解该远程服务器的数据是否不同于该文件中的数据,如果数据有变化,它就下载更新后的数据,用新数据覆盖该文件的内容;如果数据没有变化,named 就加载磁盘文件的内容,不必做麻烦的区转移工作。将一个数据库拷贝到本地磁盘文件中,就不必每次引导主机时都要转移区文件;只有当数据修改时,才进行这种区文件的转移工作。该配置文件中的下一行表示该本地服务器也是反向域 198.25.in-addr.arpa 的一个辅助服务器,而且该域的数据也从 25.198.10.3 中下载。该反向域的数据存储在 named.rev 中。

配置高速缓存服务器提高 DNS 服务器性能

高速缓存服务器可运行域名服务器软件,但是没有域名数据库软件。它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。

配置高速缓存域名服务器是很简单的。必须有 named.conf 和 named.ca 文件,通常也要用到 named.local 文件。下面是用于高速缓存服务器的 named.conf 文件的例子:

 // generated by named-bootconf.pl 
 options { 
 directory "/var/named"; 
 /* 
 * If there is a firewall between you and nameservers you want 
 * to talk to, you might need to uncomment the query-source 
 * directive below. Previous versions of BIND always asked 
 * questions using port 53, but BIND 8.1 uses an unprivileged 
 * port by default. 
 */ 
 // query-source address * port 53; 
 }; 

 // 
 // a caching only nameserver config 
 // 

 // 
 // a caching only nameserver config 
 // 
 zone "." { 
 type hint; 
 file "named.ca"; 
 }; 

 zone "0.0.127.in-addr.arpa" { 
 type master; 
 file "named.local";

directory 这一行告诉 named 到哪里去找寻文件。所有其后命名的文件都将是相对于此目录的。该文件告诉 named 去维持一个域名服务器响应的高速缓存,并利用 named.ca 文件的内容去初始化该高速缓存。该高速缓存初始化文件的名字可以是任何名字,但一般使用 /var/named/named.ca。并不是在该文件中使用一个 hint 语句就能使它成为高速缓存配置,几乎每一种服务器的配置都要用到 cache 语句,而是因为没有 master 和 slave 语句才使它成为一个高速缓存配置。

但是,在我们这个例子中却有一个 master 语句。事实上,几乎在每一个高速缓存的配置文件中都有这一个语句,它将本地服务器定义为它自己的回送域的主服务器,并假定该域的信息存储在 named.local 文件中。这个回送域是一个 in-addr.arpa 域(in-addr.arpa 域用于指定逆向解析,或 IP 地址到 DNS 名字解析),它将地址 127.0.0.1 映射为名字 localhost。转换自己的回送地址对于大多数人都是有意义的,因为大多数的 named.conf 文件都包含这一项。

在大多数高速缓存服务器的配置文件中,这种 directory、master 和 hint 语句是唯一使用的语句,但也可以增加其他的语句,forwarders 和 slave 等语句都可以使用。

配置 DNS 负载均衡防止服务器宕机

DNS 负载均衡技术是在 DNS 服务器中为同一个主机名配置多个 IP 地址,在应答 DNS 查询时,DNS 服务器对每个查询将以 DNS 文件中主机记录的 IP 地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。

现假设有三台服务器来应对 www.feixiang.com 的请求。在采用 Linux 系统上实现起来比较简单,只需在该域区文件的数据记录中添加类似下面的资源记录即可:

 web_server1INA210.113.1.1 
 web_server2INA210.113.1.2 
 web_server3INA210.113.1.3 
 wwwINCNAMEweb_server1 
 wwwINCNAMEweb_server2 
 wwwINCNAMEweb_server3

上述六条资源记录的具体含义为:在 DNS 服务器中为 www.feixiang.com 设定了三台服务器响应客户的访问请求。这三台服务器分别为 web_server1、web_server2 和 web_server3,而他们均为 www 服务器的别名。因此,在访问 www 服务器时,DNS 服务器将依次循环地将访问请求均衡到三台服务器中去,以达到负载均衡的目的。

配置智能 DNS 高速解析

随着原中国的互联网骨干网被一分为二了,北有联通、南有电信。从此,细心的网民可以发现,有些经常访问的网站速度一下子慢了下来,有时候还有访问不到的情况出现。例如北方地区的网络用户访问中国联通的服务器会非常快,而访问中国电信的服务器时,感觉非常慢。这种现象不仅影响了网站的访问量,更严重的是它直接影响了一些经营性网站的经济效益。据分析,产生这个问题的根本原因是中国电信分家之后,电信与联通之间的互连存在问题。虽然信息产业部已经在规划南北互通计划,但在今后相当长的一段时期内,南北方网互连的问题还会长期存在。

智能 DNS 策略解析很好的解决了上面所述的问题。DNS 策略解析最基本的功能是可以智能的判断访问网站的用户,然后根据不同的访问者把网站的域名分别解析成不同的 IP 地址。如访问者是联通用户,DNS 策略解析服务器会把网站域名对应的联通 IP 地址解析给这个访问者。如果用户是电信用户,DNS 策略解析服务器会把网站域名对应的电信 IP 地址解析给这个访问者。

除此之外,智能 DNS 策略解析还可以实现就近访问机制。有些用户在国外和国内都放置了服务器,使用 DNS 策略解析服务可以让国外的网络用户访问国外的服务器,国内的用户访问国内的服务器,从而使国内外的用户都能迅速的访问到网站的服务器。另外,智能 DNS 策略解析还可以给网站的多个主机实现负载均衡,这时来自各地的访问流量会比较平均的分布到服务器的每一个主机上。

下面以一个简单的例子来说明如何实现智能 DNS 的配置。在配置之前,我们需要使用前面小节介绍的有关知识生成针对电信网(telecom_feixiang.com)和联通网(cnc_feixiang.com)的区文件:

 // 在 named.conf 文件的
 options { 
 directory "/var/bind"; 

 }; 

 // 后添加如下控制网段:
 acl "CNC" { 
 58.16.0.0/16; 
 58.17.0.0/17; 
 58.17.128.0/17; 
 58.18.0.0/16; 
 58.19.0.0/16; 
 58.20.0.0/16; 
 58.21.0.0/16; 
 58.22.0.0/15; 
 58.240.0.0/15; 
 221.13.128.0/17; 
 221.14.0.0/15; 
 221.192.0.0/15; 
 221.194.0.0/16; 
 221.195.0.0/16; 
 221.196.0.0/15; 
 221.198.0.0/16; 
 221.207.0.0/18; 
 }; 

 // 修改原来的 dns 配置,让电信和联通访问不同的配置文件
 view "view_cnc" { 

 match-clients { CNC;}; 

 zone "." { 

 type hint; 

 file "named.ca"; 

 }; 

 zone "localhost" { 

 type master; 

 file "db.local"; 

 }; 

 zone "0.0.127.in-addr.arpa" { 

 type master; 

 file "127.0.0.zone"; 

 }; 

 zone "feixiang.com" { 

 type master; 

 file "cnc_feixiang.com"; 

 }; 

 zone "10.42.59.in-addr.arpa" { 

 type master; 

 file "59.42.10.zone"; 

 }; 

 zone "110.21.210.in-addr.arpa" { 

 type master; 

 file "210.21.110.zone"; 

 }; 
 }; 

 view "view_any" { 

 match-clients { any; }; 

 zone "." { 

 type hint; 

 file "named.ca"; 

 }; 

 zone "localhost" { 

 type master; 

 file "db.local"; 

 }; 

 zone "0.0.127.in-addr.arpa" { 

 type master; 

 file "127.0.0.zone"; 

 }; 

 zone "feixiang.com" { 

 type master; 

 file "telecom_feixiang.com"; 

 }; 

 zone "10.42.59.in-addr.arpa" { 

 type master; 

 file "59.42.10.zone"; 

 }; 

 zone "110.21.210.in-addr.arpa" { 

 type master; 

 file "210.21.110.zone"; 

 }; 

 };

合理配置 DNS 的查询方式提高效率

DNS 的查询方式有两种,递归查询和迭代查询。合理配置这两种查询方式,能够在实践中取得较好的效果。

其中,递归查询是最常见的查询方式,工作方式是:域名服务器将代替提出请求的客户机(下级 DNS 服务器)进行域名查询,若域名服务器不能直接回答,则域名服务器会在域各树中的各分支的上下进行递归查询,最终将返回查询结果给客户机,在域名服务器查询期间,客户机将完全处于等待状态。具体流程示意请见图 2:

图 2.DNS 递归查询流程示意

迭代查询又称重指引查询。其工作方式为:当服务器使用迭代查询时能够使其他服务器返回一个最佳的查询点提示或主机地址,若此最佳的查询点中包含需要查询的主机地址,则返回主机地址信息,若此时服务器不能够直接查询到主机地址,则是按照提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般的,每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。具体流程示意如图 3 所示:

图 3.DNS 迭代查询流程示意

综合上面两点,我们可以看出来,递归查询就是客户机会等待最后结果的查询,而迭代查询是客户机等到的不一定是最终的结果,而可能是一个查询提示。因而存在如下两个问题:

  1. 二级 DNS 向一级 DNS 发起递归查询,会对一级 DNS 造成性能压力,所有跨域查询都要经过一级 DNS 响应给对应二级 DNS;
  2. 二级 DNS 向一级 DNS 发起递归查询,再由一级向归属 DNS 发起递归的模式查询响应会有一定延时;

因此,有很多流量很大的 DNS 服务器是禁止客户机使用递归查询,用这种方式来减轻服务器的流量。

使用 dnstop 监控 DNS 流量

在维护 DNS 服务器时,用户往往希望知道到底是哪些用户在使用 DNS 服务器,同时也希望能对 DNS 状态查询做一个统计,以及时地知道 DNS 的工作情况和状态。在传统的方式下,用户通常使用的是 tcpdump 等开源工具来进行抓包并通过查看 53 端口的流量来查看 DNS 数据包。由于 tcpdump 并没有针对 DNS 流量进行特殊定制,因此使用起来可能不是非常方便。因此,用户可以使用专用于 DNS 的 dnstop 工具查询 DNS 服务器状态。

dnstop 是一种非常优秀的开源软件,用户可以到网站 http://dns.measurement-factory.com/tools/dnstop/src/ 上进行下载使用,目前该软件的最新版本为:dnstop-20090128.tar.gz。

由于该软件依赖 tcpdump 和 pcap 抓包库(libpcap)对网络上传输的数据包进行截获和过滤,所以用户需要确保系统安装相应软件后才能正常安装和使用 dnstop。通常情况下,这两种必须的库都已经在系统中预装好了,使用下面的命令安装 dnstop 即可:

(1)解压缩源代码安装包

#tar vxfz ddnstop-20090128.tar.gz

(2)切换到解压目录,并使用 configure 命令生成 Makefile 文件

 #cd dnstop-20090128 
 #./configure

(3)使用 make 命令进行安装

 #make

安装成功后,可以查看通过相应的网络接口来监控 DNS 网络流量,如下所示:

 #./dnstop -s eth0 
 0 new queries, 6 total queries Fri Mar 26 20:18:12 2010 
 Sources count % 
 ---------------- --------- ------ 
 198.35.0.13 4 66.7 
 198.35.0.14 1 16.7 
 198.35.0.15 1 16.7

在运行 dnstop 的过程中,可以键入 、<1>、<2>、 等方式以交互方式来显示不同的信息:

  • S:记录发送 DNS 查询的客户端 IP 地址列表
  • D:记录 DNS 查询的目的服务器的 IP 地址表
  • T:记录查询详细类型
  • 1:记录查询的顶级域名
  • 2:记录查询的二级域名
  • Ctr+R:重新纪录
  • Ctr+X:退出

更详细信息可以使用 dnstop –help 命令进行查看。

使用 DNSSEC 技术保护 DNS 安全

DNSSEC 主要依靠公钥技术对于包含在 DNS 中的信息创建密码签名。密码签名通过计算出一个密码 hash 数来提供 DNS 中数据的完整性,并将该 hash 数封装进行保护。私/公钥对中的私钥用来封装 hash 数,然后可以用公钥把 hash 数译出来。如果这个译出的 hash 值匹配接收者刚刚计算出来的 hash 树,那么表明数据是完整的。不管译出来的 hash 数和计算出来的 hash 数是否匹配,对于密码签名这种认证方式都是绝对正确的,因为公钥仅仅用于解密合法的 hash 数,所以只有拥有私钥的拥有者可以加密这些信息。

DNSSEC 的功能主要有三个方面:

  • 为 DNS 数据提供来源验证,即保证数据来自正确的名称服务器。
  • 为数据提供完整性验证,即保证数据在传输的过程中没有任何的更改。
  • 否定存在验证,即对否定应答报文提供验证信息,确认授权名称服务器上不存在所查询的资源记录。DNSSEC 为了实现签名和签名的验证功能,引入了四个新的资源记录类型:
    • DNSKEY:用于存储验证 DNS 数据的公钥;
    • RRSIG:用于存储 DNS 资源记录的签名信息;
    • NSEC:存储和对应的所有者相邻的下一个资源记录,主要用于否定存在验证;
    • DS(Delegation Signer,授权签名者):用于 DNSKEY 验证过程,存储密钥标签,加密算法和对应的 DNSKEY 的摘要信息。

DNSSEC 的工作机制主要体现在 DNS 工作过程中的以下 2 个方面:

(1)DNS 查询 / 应答:这一步因为使用了未加密和未验证的 UDP 数据包,存在严重的安全漏洞。DNSSEC 在这一步中加入了对数据源的验证和对数据完整性的校验。DNSSEC 要对某个域的数据进行验证,客户端就必须信任这个域的公钥。由于 DNS 中没有第三方的公钥验证体系,要建立对公钥的信任,就必须从一个已经被信任的名称服务器(如根服务器)开始,由此服务器验证其子域的公钥。然后再由这个子域的公钥验证其子域的公钥,一直到所请求的域的公钥得到验证,这个过程称为建立信任链。起始受信任的名称服务器的公钥就被称为信任锚点。验证数据源以后,下一步验证应答信息本身,它要求应答不仅包括请求的资源记录,还包括验证这些资源记录的所需的信息,即一个资源记录集的数字签名,它包含 RRSIG 中。使用信任锚点的 DNS 客户端就可以通过验证此数字签名来检查应答报文是否真实。为了保证和查询相应的资源记录的确不存在,而不是在传输过程中被删除,DNSSEC 生成一个特殊的资源类型记录(NSEC)来检测域名是否存在。

(2)DNS 域区传输:一个域区中一般有主域名服务器和备份域名服务器,域区传输就是域区文件从主域名服务器 copy 到备份域名服务器上的过程。在这个过程中面临着数据包拦截和更改的危险。DNSSEC 用 TSIG(Transaction Signature,事务签名)来验证请求方的真实身份和保证传输内容在传输过程中被篡改。

因此,DNSSEC 的部署主要有三个步骤:

  • 生成公 / 私密钥对
  • 公钥的发布及私钥的存储
  • 域区的签署

DNSSEC 也是一种非常优秀的开源工具,用户可以到 http://sourceforge.net/projects/dnssec-tools/files/dnssec-tools/1.5/dnssec-tools-1.5.tar.gz/download 网站上进行下载和安装,目前其最新版本为 dnssec-tools-1.5.tar.gz。安装的具体步骤如下所示:

(1)解压缩源代码安装包

 #tar vxfz dnssec-tools-1.5.tar.gz

(2)切换到解压目录,并使用 configure 命令生成 Makefile 文件

 #cd dnssec-tools-1.5 
 #./configure

(3)使用 make 命令进行安装

 #make

下面我们通过一个实际的例子来说明如何为名称是 feixiang.com 的域建立 DNSSEC 配置。使用 DNSSEC 保护 DNS 的步骤如下所示:

(1)为 feixiang.com 域建立一对密钥。在 /var/named 目录下,使用如下命令:

 #/usr/sbin/dnssec-keygen -a DSA -b 768 -n ZONE feixiang.com

这个命令产生一对长度 768 位 DSA 算法的私有密钥和公共密钥。

(2)使用如下命令

 #/usr/sbin/dnssec-makekeyset -t 1800 -e now+21 Kfeixiang.com.+003+29462

建立一个密钥集合。该命令以 1800 秒的生存时间(time-to-live)建立密钥集合,有效期限 21 天,并且创建一个文件:feixiang.com.keyset。

(3)使用命令

 #/usr/sbin/dnssec-signkey feixiang.com.keyset Kfeixiang.com.+003+29462

为密钥集合签名。然后建立一个签名文件:feixiang.com.signedkey。

(4)使用命令

 #/usr/sbin/dnssec-signzone -o feixiang.com feixiang.com.signed

为区带文件签名。然后建立一个签名文件:feixiang.com.signed。

(5)替换配置文件 /etc/named.conf 中 feixiang.com 的区文件部分。如下所示:

 zone “feixiang.com” IN { 
 type master; 
 file “feixiang.com.signed”; 
 allow-update { none; }; };

你可能感兴趣的:(网络编程,learning,笔试面试,DNS解析,网络安全,linux面试)