本博客主要讲:

DNS原理、DNS缓存服务器、主从服务器、DNS转发、子域授权、ACL与View、日志系统与压力测试工具

   实现DNS服务的软件如:Bind、powerdns。本博客主要讲Bind

一、DNS原理

   网络通讯大部分是基于TCP/IP协议,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“125.39.240.113”之类的IP地址,而不能认识域名。我们无法记住那么多数字组成的IP地址,所以我们在访问网站时,在浏览器地址栏中输入的几乎都是域名,就能看到我们所需要的内容,这是因为有一个“DNS服务器”自动把我们的域名转换成了相应的IP地址,然后查询出IP地址所对应的网页。

DNS是什么东东?

   DNS( DomainName System)是“域名系统”的英文缩写,它是由解析器以及域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。DNS使用TCP与UDP端口号都是53,主要使用“UDP”协议,服务器之间备份使用“TCP”协议。它的基本工作原理用图来表示如:

075118279.jpg

DNS域名称

   域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,如:www.google.com 完全限定的域名(FQDN)唯一地标识在 DNS分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。DNS 域名称层次结构如:

080327284.jpg

DNS域:

   互联网域名系统由名称注册机构负责维护分配由组织和国家/地区的顶级域在 Internet 上进行管理。这些域名按照国际标准进行分配。一些常见的DNS域名称如:

   com:商业公司  edu:教育机构  net:网络公司  gov:政府机构  mil:军事政府机构 cn:中国

DNS域名称空间的组织方式

   根域:DNS域名使用时,由尾部点"."来指定名称位于根域或更高

   顶级域:用来表示某个国家或地区使用的名称类型 如: .cn

   二级域:个人或组织在internet上使用的注册名称 如:google.com

   子域:已注册的二级域名衍生的域名,也就是网站名 如:www.google.com

   主机名:通常表示DNS域名的最左侧标签来标识网络上特定的计算机 如: ns1   ns1.www.google.com

Dns服务的工作过程

   当 DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应答的问题

  1. 指定的 DNS 域名,表示为完全合格的域名 (FQDN)

  2. 指定的查询类型,它可根据类型指定资源记录

  3. DNS域名指定的类别

   对于DNS 服务器,它始终应指定为 Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如im.qq.com,并且指定的查询类型用于通过该名称搜索地址资源记录

   DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他 DNS 服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归查询

   另外,客户机自己也可尝试联系其他的DNS 服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代查询,即DNS服务器之间的交互查询就是迭代查询

DNS查询的过程如下图:
183603331.jpg

  1. 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析

  2. 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析

  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性

  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性

  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机

  6. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机

注:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询


注:红色字体为命令

二、DNS缓存服务器

1、规划好配置信息

 NS服务器是:172.16.14.1

 两台www服务器分别是:172.16.14.1172.16.14.2

 mail服务器是:172.16.14.3

 有一台FTP主机在www服务器上,即FTPwww的别名(CNAME)

2、准备工作:

 首先我们需要先获取到软件包,rpm包可以到光盘映像里索取,也可以配置Yum;本博客采用yum安装。而源码包可以从官方网站下载https://www.isc.org/downloads/,本博客主要以rpm安装方式进行讲解,我们使用(CentOS6.4)光盘映像中的bind软件来搭建DNS服务器,首先需要安装好bind-9.8.2-0.17.rc1.el6.x86_64bind-libs.x86_64bind-utils.x86_64这三个软件包。

3、配置文件详解

 /etc/named.conf为Bind服务进程的主配置文件

 区域的定义,切记每个选项后面都要加分号

options {                                      #定义全局选项
    directory "/var/named";                    #定义区域数据文件存放目录
};                                                
zone "." IN {                                  #定义根区域
    type hint;                                 #定义区域类型为根
    file "named.ca";                           #定义数据文件
};                                                
zone "localhost" IN {                          #定义本地解析区域
    type master|slave;                         #定义区域类型为主或辅
    file "named.localhost";                    #定义数据文件
};
zone "0.0.127.in-addr.arpa" IN {               #定义反向解析区域
    type master|slave;                         #定义区域类型为主或辅
    file "named.loopback";                     #定义数据文件
};

   /etc/named.rfc1912.zones:区域配置文件

   /var/named/:目录中存放的为区域数据文件

   /etc/rc.d/init.d/named :服务控制脚本,可以使用service来控制启动和关闭.我们也可以使用rndc命令来控制bind服务的启动和关闭.  如:  rndc start|stop|reload|status 启动、停止、重新加载、查看状态

4.  Dns资源记录类型

SOA:起始授权记录
    $TTL 600
    @    IN     SOA    [FQDN]text.cn. admin.com.[管理员邮箱] (
                2013081001; serial    #版本号(最长为10位数字)
                1D; refresh           #定义检查周期时间
                1H; retry             #定义重试时间
                1W; expire            #定义过期时间
                3H ); minimum         #定义否定答案时长

   时间单位:M(分钟)H(小时)D()W()、默认单位是秒

NS:区域名称-->主机名   如: test.cn.    IN   NS    ns.test.cn.

MX:(邮件) 区域名称-->FQDN  如: test.cn. IN   MX 10 mail.test.cn.  #数字(0-99)越小级别越高

                          mail.text.cn IN   A     172.16.14.3

A:FQDN-->IPv4   AAAA:FQDN-->IPv6

PTR:Ip-->FQDN  指针记录    CNAME:FQDN-->FQDN 别名记录

5.  配置缓存服务器

提示:后面的实验我们都需要关闭本地的防火墙与SELinux

    关闭防火墙: service iptables stop   关闭SELinux: setenforce 0

先打开主配置文件 vim /etc/named.conf

options {
//      listen-on port 53 { 127.0.0.1; };         #把本行注释默认只监听127.0.0.1的53端口
//      listen-on-v6 port 53 { ::1; };            #把本行注释,我们不使用IPv6
        directory       "/var/named";             #定义区域数据文件存放目录
//      allow-query     { localhost; };           #把本行注释,默认只允许本地查询
        recursion yes;                            #是否允许递归
  };

打开区域配置文件,可以只保留这两个区域  vim /etc/named.rfc1912.zones

zone "localhost" IN {                          #定义本地解析区域
    type master;                               #定义区域类型为主
    file "named.localhost";                    #定义数据文件
    allow-update { none; };                    #是否允许更新
};
zone "0.0.127.in-addr.arpa" IN {               #定义反向解析区域
    type master;                               #定义区域类型为主
    file "named.loopback";                     #定义数据文件
    allow-update { none; };                    #是否允许更新
};

保存并退出,检查语法是否错误  named-checkconf

启动DNS服务器,Dns进程为named:

[root@localhost ~]# service named start
Starting named:                                            [  OK  ]

修改本地DNS地址为本机:echo "nameserver 172.16.14.1" >> /etc/resolv.conf

下面我们用dig命令来测试一下解析根:dig -t NS . @172.16.14.1  -t:指定资源记录类型

[root@localhost ~]# dig -t NS . @172.16.14.2
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> -t NS . @172.16.14.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54857
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14
;; QUESTION SECTION:
;.                     IN    NS
;; ANSWER SECTION:
.            518282    IN    NS    j.root-servers.net.
.            518282    IN    NS    a.root-servers.net.
.            518282    IN    NS    k.root-servers.net.
.            518282    IN    NS    b.root-servers.net.
.            518282    IN    NS    h.root-servers.net.
.            518282    IN    NS    c.root-servers.net.
.            518282    IN    NS    e.root-servers.net.
.            518282    IN    NS    d.root-servers.net.
.            518282    IN    NS    l.root-servers.net.
.            518282    IN    NS    f.root-servers.net.
.            518282    IN    NS    i.root-servers.net.
.            518282    IN    NS    g.root-servers.net.
.            518282    IN    NS    m.root-servers.net.
;; ADDITIONAL SECTION:

6、把Dns服务加入到开机启动项 185458805.gif


三、配置主从DNS服务器

1、服务器规划:

 假设我们已经在网上注册了一个域名为test.cn

 NS服务器是:master:172.16.14.1   slave:172.16.14.2

 两台www服务器分别是:172.16.14.3172.16.14.4

 mail服务器是:172.16.14.5

 有一台FTP主机在www服务器上,即FTPwww的别名(CNAME)

2、所使用的软件与DNS缓存服务器一样

   首先我们先在master与slave服务上安装bind,在安装前确认一下本机上有没有安装bind.如果有比我们使用的版本低的卸载后重新安装或直接升级安装.

201552375.gif

安装bind软件包

yum -y install bind

bind的主配置文件:/etc/name.conf;配置文件中主要讲解dns服务的区域定义与工作属性;而bind的配置文件属性也比较独特,不允许其他用户读写;

202541901.gif

为了做实验方便,我们手动创建配置文件,创建前先把主配置文件备份一下,

cp -p /etc/named.conf /etc/named.conf.bak
#创建"test.cn"正向与反向区域
    options {                                      #定义全局选项
        listen-on port 53 { any; };                #监听地址与端口,把地址改为any或注释
        directory "/var/named";                    #定义区域数据文件存放目录
        allow-query     { any; };                  #本行注释或改为any,默认只允许本地查询
        recursion yes;                             #是否允许递归
    };                                                
    zone "." IN {                                  #定义根区域
        type hint;                                 #定义区域类型为根
        file "named.ca";                           #定义数据文件
    };                                                
    zone "localhost" IN {                          #定义本地解析区域
        type master;                               #定义区域类型为主
        file "named.localhost";                    #定义数据文件
    };
    zone "0.0.127.in-addr.arpa" IN {               #定义反向解析区域
        type master;                               #定义区域类型为主
        file "named.loopback";                     #定义数据文件
    };
    zone "test.cn" IN {                            #定义test.cn解析区域
        type master;                               #定义区域类型为主
        file "test.cn.zone";                       #定义数据文件
    };
    zone "14.16.172.in-addr.arpa" IN {             #定义test.cn反向解析区域
        type master;                               #定义区域类型为主
        file "172.16.14.zone";                     #定义数据文件
    };

创建正向区域解析文件:

vim /var/named/test.cn.zone

214610521.jpg

创建反向区域解析文件

vim /var/named/172.16.14.zone

214309928.gif

检查区域配置文件权限:

215249982.gif

修改区域配置文件权限为640,并修改其属组

215434751.gif

检查语法是否有错误:

检测配置文件:named-checkconfig

检测区域配置文件:

named-checkzone "test.cn" /var/named/test.cn.zone
named-checkzone "14.16.172.in-addr.arpa" /var/named/172.16.14.zone

启动成功,我们用dig命令测试一下A记录与NS记录:dig -t A www.test.cn

221312464.gif

测试NS记录:dig -t NS test.cn

221314390.gif

3、从服务器配置

从服务器的准备工作与主服务器是相同的,这里就不再介绍。

配置yum源,安装bind工具包,备份/etc/named.conf文件,手动配置一个主文件/etc/named.conf,/var/named/slaves这个目录默认属主属组是named。这们就直接把要同步过来的文件放到这个目录下

   编辑从服务器配置文件: vim /etc/named.conf

085117755.gif

修改一下主服务器(172.16.14.1)的主配置文件,允许从服务器区域传送:

081828406.gif

修改主服务器的正向与反向区域配置文件,添加从服务器记录信息并重新加载配置文件:

082904821.gif

082906937.gif

重启named: service named restart

验证从服务器是否同步文件:

085403617.gif

查看主服务器日志信息,显示172.16.14.2客户端成功传送:

085633164.gif我们在主DNS服务器添加一条正向解析记录并重新加载配置文件:

090204366.gif

重启named: service named restart

查看主服务器日志信息:

091813481.gif

查看从服务器/var/named/slaves/目录下的正向区域文件是否同步:

091813674.gif


四、子域授权

1、子域的准备工作与从服务器是相同的,这里就不再介绍。172.16.14.8做子域授权主机。

配置yum源,安装bind工具包,备份/etc/named.conf文件,手动配置一个主文件/etc/named.conf

编辑主DNS服务器正向区域文件/var/named/test.cn.zone,给子域做授权,添加如下记录:

095144486.gif

重新加载配置文件:service named reload
编辑子域服务器配置文件: vim /etc/named.conf

093419808.gif

子域的正向区域解析文件:

注意:把文件的权限改为640,属组为named.

095935807.gif

重启named服务:service named restart

在主服务器上用dig -t A www.dns.test.cn来测试子域服务器是否能解析:

注:父域可以解析子域,但子域不能解析到父域

100842253.gif


五、DNS转发服务器配置及Acl实现:

acl:访问控制列表,用来定义一组地址,方便在配置文件中调用。

在主服务器上打开配置文件:vim /etc/named.conf

104525786.gif

在172.16.14.8主机上做测试:

104958803.gif

在172.16.14.10主机上做测试:

105253665.gif


六、View视图智能DNS

   我们就模拟国内两大运营商(电信和联通),通过在配置文件中指定特定的客户端(IP地址)来完成智能DNS解析示例。

注:配置文件不做太详细,这里只做简单配置;能说明用法。望谅解

打开配置文件/etc/named.conf编辑内容:

114405177.gif

编辑模拟联通网络的区域解析文件:

114646927.gif

编辑模拟电信的区域解析文件:

114650654.gif

修改区域文件的权限为640,属组为named:

115017136.gif

重新启动named服务: service named restart

配置联通IP使用联通客户端验证:

120409998.gif

120411725.gif

配置电信IP地址并使用电信客户端验证:

121401982.gif

121340888.gif

View视图,智能DNS已经能成功解析。


七:DNS日志系统

172318738.gif

解析一条A记录信息验证一下:host -t A www.test.cn

183837108.gif


八、DNS压力测试

1、首先要获取DNS源码包,这里我们使用的版本是bind-9.9.3-P2.tar.gz,可以到官网获取ftp://ftp.isc.org/isc/bind9/9.9.3-P2/bind-9.9.3-P2.tar.gz

2、我们要使用的压力测试工具“queryperf”,把这个工具安装上

3、写一个文本文件,里面包含DNS解析记录,每行一条记录:如:www.test.cn A

开始安装“queryperf”工具:  注:在编译安装过程中有可能会报错,提示没有安装libpcap,把CentOS6.4第二张光盘挂载到系统,使用rpm安装一下这个软件包即可

[root@localhost ~]# tar xf bind-9.9.3-P2.tar.gz                         #解压软件包
[root@localhost ~]# cd bind-9.9.3-P2/contrib/queryperf/                 #切换工作目录 
[root@localhost queryperf]#./configure --prefix=/usr/local/queryperf    #编译前配置
[root@localhost queryperf]# make                                        #编译
[root@localhost queryperf]# make install                                #编译安装

写一个文本文件包含DNS解析记录信息:

190650404.gif

执行"queryperf"命令,做压力测试: -d:指定文件  -s:指定主机地址

191751242.gif

本博客至此结束,由于内容较多,望广大博友多提宝贵意见.谢谢...