DNS: Domain Name Service          
            DNS服务是一种分布式数据库,它提供规范机器名到数字IP地址的映射及数字IP到规范机器名。 
DNS相关定义:
       用于主机和IP地址的一个有层次结构的名字空间;
       主机名和地址信息保存在一个分布式数据库中;
       一个查询这个数据库的解析器(resolver)
       改进了路由电子邮件的机制,以及邮件发送方的身份验证机制
       域名服务器用于交换信息的一种机制
       用于查询网络上服务的一种机制

DNS工作原理:
       DNS域名服务器其实就是个分布式数据库,它主要提供规范的FQDN到IP地址的解析,反之亦然。
构成全世界DNS系统的是一个分布式数据库,每个站点都维护着这个数据库的一个或者多个组成部分。有点类似如图1

互联网域名解析系统DNS的工作原理及相关服务配置
我们通过下面的案例来介绍DNS服务器完成解析(参考图)

互联网域名解析系统DNS的工作原理及相关服务配置
域名服务器解析原理及过程:


  1. 说明:服务器之间的箭头上的数字均显示DNS查询事件的次序,字母则表示事件查询请求的类型。并且在此查询之前,ns.fin.example.com服务器没有相关的缓存记录,并且本地缓存文件也没有相关的www.fin.example.com的相关记录。  
  2. 本地域名服务器是一台递归服务器,当它第一次发送查询请求时,得到的是推荐DNS服务器地址,则本地DNS服务器去新的DNS服务器发出查询请求,然后再去得到推荐的DNS服务发送请求,直到找到相应的主机记录为止。  
  3. 查询流程详解:  
  4. <1>所以当sandy用户查询www.fin.example.com这台主机的相关记录,它首先去本地(/etc/hosts)查询有没有相关的记录,有则返回结果,  
  5. 没有则去本地DNS服务器(ns.fin.example.com)发送请求。  
  6. <2>本地域名服务器(ns.fin.example.com)查询缓存发现没sandy用户查询的相关记录,所以它去根服务器查询fin.example.com的相关记录,并得到一个推荐的DNS服务器的地址(.com)  
  7. <3>然后本地域名服务去com域名服务器查询(fin.example.com)的相关记录,并得到了关于exampl.com域服务器地址,然后本地域名服务向example.com发送查询请求,example.com域名服务器查询缓存没有相应的答案,则推荐到fin.example.com域名服务器去查询,对于查询域名信息来说,fin.example.com的域名则是权威的,它在自己的管辖内找到www这台主机,然后用www这台主机的地址回复本地域名服务器(ns.fin.example.com)。  
  8. <4>本地域名服务器(ns.fin.example.com)得到了关于www.fin.example.com的主机记录,并将记录到缓存区域,然后发送给sandy用户。  
  9. <5>下次再有用户查询www.fin.example.com主机信息时,本地域名服务器直接从缓存中调用此记录即可。 

注:DNS查询类型:
  
    递归查询:客户端得到结果要么成功,要么失败。(本地客户端和DNS服务直接交互)
       迭代查询:服务器以相关最佳记录返回本地域名服务器。(DNS服务与DNS服务交互)
所以本地客户端详本地域名服务器查询请求时,查询类型为:
一次递归,多次迭代。

DNS服务器的分类:


  1. 主域名服务器(Primary Name Server)  
  2.    主域名服务器是特定域所有信息的权威来源,主域名服务器是特定域所有信息的权威来源,它从域管理员构造本地文件中加载域信息,  
  3. 该文件包含服务器具有管理权的部分域结果的最权威信息。主域名服务器需要配置一组完整的文件,即主机配置文件(named.conf),正向区域文件、反向区域文件、高速缓存初始化文件(named.ca),回送文件(named.local)  
  4. 辅助DNS服务器(Second Name Server)  
  5.    辅助DNS服务器用来从主域名服务器同步区域数据文件,作为磁盘文件保存在辅助域名服务器相对应的目录,辅助DNS服务器只需要配置主配置文件即可,不需要配置区域数据文件。  
  6. 唯高速缓存域名服务器(Cache-only Server)  
  7.    唯高速缓存域名服务器不包含域名数据库文件,它每次将从域名服务器得到的查询结果返回给客户端,并在本地将以缓存,供下次查询使用。 

 DNS层次结构中资源记录的基本格式:


  1.                 [name] [ttl] [class] type [rdata]  
  2. [name(名字)]:  
  3.     name字段表示该记录所描述的实体(通常是主机或者一个域)。如果几个连续的记录涉及同一个实体的话,那么则第一条之后可以省略,利用@特殊  
  4.  字符来代替这个name字段。  
  5. [ttl]字段  
  6.     TTL(time to live (存活时间)),默认字段以秒为单位指定时间长度,在指定的时间内,数据项可被缓存并且仍被认为是有效的。TTL必须位于该区域数据文件的第一行,来进行标识  
  7. class:class指定网络类型:默认类型为IN 
  8. IN(指Internet)、HS(Hesiod:本地使用的目录服务)、CH(供域名服务器内部用来标示自己)  
  9. type类型:  
  10.     A(Address):记录FQDN-IP转换  
  11.     MX(Mail eXchanger):记录邮件交换记录  
  12.     CNAME(Canonical NAME):记录别名,允许将多个名字映射到一个主机,通常CNAME主要用于WEB和邮件服务器。  
  13.     SOA:(Start Of Authority):一个授权区的开始。每个配置文件必须包含SOA记录,以标志服务器所管理的起始处。  
  14.     PTR(domain name PonitTeR):记录IP-FQDN  
  15.     HINFO(Host INFOrmation):记录一组描述主机的信息文件组成,例如:一些硬件名称及操作系统名称等信息。  
  16. rdata:  
  17.     A:记录主机IP地址  
  18.     HINFO:记录Hardware和OS相关记录  
  19.     MX:记录提供收发电子邮件相关信息,一般包含两个部分(preference-value) 

BIND常用到的资源记录语法


  1. 1、SOA资源记录  
  2. $TTL 86400  
  3. 区域名称(Name)  记录类型(type)  SOA   主域名服务器(FQDN)   管理员邮箱地址(mail)  (  
  4.                                       serial     ##number ***,每次更改配置值是都要在原来的基础上加上1,表示以更新。   
  5.                                       refresh    ##刷新时间(间隔)  
  6.                                       retry      ##重试时间(间隔)  
  7.                                       expire     ##过期时间(间隔)  
  8.                                       na ttl )   ##否定答案缓存TTL值  
  9.                 时间单位:M(分钟)、H(小时)、D(天)、W(周),默认单位是秒    

  1.  
  2. 好了,对DNS工作原理有所了解,那么就来创建个DNS服务器吧!!!
  3. 实验环境:
    OS:RedHat 5.8
    Software:bind97   bind97-utils bind97-libs
    master server(172.16.88.1)
    Domain Name:example.com
    www主机地址:172.16.88.3/172.16.88.4  ##提供http服务
    mail服务器:172.16.88.5   ##提供邮件的收发
    www主机创建别名 sandy
    slave server (172.16.88.2)   ##实现负载均衡
  4.  
  5. 第一步:使用YUM安装DNS所使用的软件包(BIND),这里使用的是bind97  
  6. 第二步:自己创建配置文件(/etc/named.conf)  
  7. 第三步:创建区域数据文件(/var/named)  
  8. 第四步:使用相关命令(named-checkconf、named-checkzone)测试配置文件及区域文件是否存在语法错误  
  9. 第五步:启动named服务(service named start 、/etc/rc.d/init.d/named start)  
  10. 第六步:使用命令更改系统启动时自动在启动named服务(chkconfig named on)默认2345级别(可以根据自己的需求设定启动级别)  
  11. 第七步:更改iptables和selinux的设置  
  12. 第八步:分别使用(dig/nslookup)在Linux/Windows主机进行查询DNS相关资源记录  
  13. 第九步:设置递归选项  
  14.           (1),实现不给任何主机递归,但可以给本地递归  
  15.           (2),实现只给172.16.0.0/16网段递归,其他不递归。  
  16. 第十步:设置区域传送,并创建辅助DNS服务器并实现从主DNS服务同步区域数据文件并查看日志文件(/var/log/message)  
  17.            (1)、先创建一个辅助DNS  
  18.            (2)、然后再实现从主DNS服务器完全同步区域数据文件,查看日志文件及从服务器是否完成同步  
  19.            (3)、然后再主DNS服务器上新增一条资源记录并查看日志文件,然后到辅助DNS服务上查看日志是否 完成增量区域数据同步  
  20. 第十一步:编译安装dnstop工具,查看DNS工作状态  
  21.  

第一步:配置YUM源(可以参考笔者的关于YUM和RPM的介绍来进一步了解YUM和RPM日常工作中的使用)


  1. [[email protected] ~]# yum list all | grep 'bind'        
  2. [[email protected] ~]# rpm -e bind-libs bind-utils          ##这里采用的是bind97版本,所以把系统默认安装的bind-libs、bind-utils卸载  
  3. [[email protected] ~]# yum install bind97 bind97-utils      ##bind97(服务器所使用的软件包)  bind97-utils(客户端工具) 

第二步:创建DNS的主配置文件(/etc/named.conf)


  1. [[email protected] ~]# mv /etc/named.conf /etc/named.conf.bak  
  2. [[email protected] ~]# vim /etc/named.conf  
  3. 编辑主配置文件,添加如下内容(named.conf里面没有任何内容)  
  4. options {  
  5.         directory "/var/named" ;              ##指明区域文件保存的位置  
  6. };  
  7. zone "." IN                                   ##定义根区域文件名称  
  8.         type hint;  
  9.         file "named.ca";                      ##默认存放在/var/named/named.ca  
  10. };  
  11. zone "localhost" IN {  
  12.         type master;  
  13.         file "named.localhost";                
  14. };  
  15. zone "0.0.127.in-addr.arpa" IN {  
  16.         type master;  
  17.         file "named.loopback";  
  18. };  
  19. zone "example.com" IN {                       ##定义example.com正向区域配置文件  
  20.         type master;                          ##类型为master(主DNS)  
  21.         file "example.com.zone";              ##example.com域正向区域配置文件存放名称(/var/named/example.com.zone)  
  22. };  
  23. zone "88.16.172.in-addr.arpa" IN {            ##定义example.com域反向区域配置文件  
  24.         type master;                          ##类型为master(主DNS)  
  25.         file "172.16.88.zone";                ##example.com域反向区域配置文件存放名称(/var/named/172.16.88.zone)  
  26. }; 

注:修改/etc/named.conf的权限为(640)及属主属组(root:named)


  1. [[email protected] ~]# chown root:named /etc/named.conf      ##将主配置文件的属主和属组改为root和named  
  2. [[email protected] ~]# chown 640 /etc/named.conf             ##将named.conf的权限更改为640,只有管理员具有读写的权限,组有读的权限。  
  3. [[email protected] ~]# ll /etc/named.conf  
  4. -rw-r--r-- 1 640 named 374 Apr  2 15:41 /etc/named.conf  
  5. [[email protected] ~]#  

第三步:创建区域配置文件(example.com.zone)


  1. [[email protected] ~]# cd /var/named  
  2. [[email protected] named]# vim example.com.zone  
  3. 添加如下内容:  
  4. $TTL 86400  
  5. @       IN      SOA     ns1.example.com.        admin.example.com. (  
  6.                         2013040201       ##***(每次更新时都加上1,便于从服务器更新)  
  7.                         1H               ##都长时间主动发送请求更新区域数据文件  
  8.                         5M               ##如果更新失败,多长时间重试  
  9.                         7D               ##过期时间  
  10.                         3D )               
  11.         IN      NS      ns1.example.com.  
  12. ns1     IN      A       172.16.88.1  
  13. www     IN      A       172.16.88.3  
  14. www     IN      A       172.16.88.4  
  15. mail    IN      A       172.16.88.5  
  16. ftp     IN      CNAME   sandy  
  17. :wq  
  18. 注:更改example.com.zone的权限及属主及属组(同上)  
  19. [[email protected] named]# chown root:named example.com.zone  
  20. [[email protected] named]# chmod 640 example.com.zone 

<2>创建反向(PTR)区域配置文件


  1. [[email protected] named]# vim 172.16.88.zone  
  2. 添加如下内容:  
  3.  
  4. $TTL 86400  
  5. @       IN      SOA     ns1.example.com.        admin.example.com. (  
  6.                         2013040201  
  7.                         1H  
  8.                         5M  
  9.                         7D  
  10.                         3D )  
  11.         IN      NS      ns1.example.com.  
  12. 1       IN      PTR     ns1.example.com.  
  13. 3       IN      PTR     www.example.com.  
  14. 4       IN      PTR     www.example.com.  
  15. 5       IN      PTR     mail.example.com.  
  16. :wq  
  17.  
  18. 注:更改172.16.88.zone的权限及属主及属组(同上)  
  19. [[email protected] named]# chown root:named 172.16.88.zone  
  20. [[email protected] named]# chmod 640 172.16.88.zone 

第四步:通过named-checkconf及named-checkzone检测配置文件及区域文件是否有语法错误

互联网域名解析系统DNS的工作原理及相关服务配置
第五步:启动二进制进程named
[[email protected] ~]# service named restart
  {start|restart|reload|status}
第六步:设置named进程在开机时自动在2345级别下运行并查看named在哪个端口上启动并监听
[[email protected] ~]# chkconfig named on
[[email protected] ~]# netstat -ntupl   ##查看DNS启动端口

互联网域名解析系统DNS的工作原理及相关服务配置第七步:设置防火墙及SElinux


  1. [[email protected] ~]# iptables -A FORWARD -i eth0 -p tcp --dport 53 -j ACCEPT  
  2. [[email protected] ~]# iptables -A FORWARD -i eth0 -p udp --doprt 53 -j ACCEPT  
  3. 设置SELinux  
  4. [[email protected] ~]# getsebool -a | grep named       
  5. named_disable_trans --> off  
  6. named_write_master_zones --> off   
  7. [[email protected] ~]# getsebool   
  8. [[email protected] ~]# setsebool -P named_write_master_zones 1 

第八步:使用nslookup和dig命令分别在Windows和Linux系统进行查询
<1>使用nslookup命令在Windows系统平台下测试DNS相关资源记录,测试如图(1)

互联网域名解析系统DNS的工作原理及相关服务配置

<2>使用dig命令在Linux主机上进行DNS资源查询
注:这里我们将我们的DNS服务指向自己的IP地址(172.16.88.1),也可以不修改我们可以使用@在指定在哪个DNS上查询

互联网域名解析系统DNS的工作原理及相关服务配置

 第九步:设置递归参数


  1. (1)在配置文件,设置给不给任何主机递归,但给自己内网主机递归  
  2. 实现过程:  
  3. [[email protected] ~]# vim /etc/named.conf  
  4. 只要在options选项添加recursion no;即可  
  5. options {  
  6.         directory "/var/named" ;  
  7.         recursion no;  
  8. };  
  9. [[email protected] ~]# service named reload   ##重新读取配置文件  
  10. 注:笔者虚拟机可以连入网络,因为我们的DNS只给不给任何主机递归,只负责解析自己所属的域  
  11. 所以我们使用dig命令来测试:  
  12. [[email protected] ~]# dig +recurse  -t  A www.baidu.com @172.16.88.1  
  13. 测试如图 

互联网域名解析系统DNS的工作原理及相关服务配置(2)如果要给某个网段(172.16.0.0/26)提供递归的话,我们用allow-recursion { 172.16.0.0/16; };
注:修改完成后,千万别忘记使用# service named reload命令来执行重新读取配置文件内容
我们还可以使用上面的指令在测试,看是否可以提供解析
[[email protected] ~]# dig +recurse -t A www.baidu.com 
@172.16.88.1测试如图:

互联网域名解析系统DNS的工作原理及相关服务配置

我用我的Windows主机来测试,看看能不能为192.168.0.0/24提供解析呢(答案:否定),测试如图

互联网域名解析系统DNS的工作原理及相关服务配置 
 第十步:设置区域传送,并创建辅助DNS服务器并实现从主DNS服务同步区域数据文件并查看日志文件(/var/log/message)


  1. (1)、首先我们要在主DNS服务器的正向区域文件添加辅助DNS的记录  
  2. (2)、先创建一个辅助DNS  
  3. (3)、然后再实现从主DNS服务器完全同步区域数据文件,查看日志文件及从服务器是否完成同步  
  4. (4)、然后再主DNS服务器上新增一条资源记录并查看日志文件,然后到辅助DNS服务上查看日志是否完成增量区域数据同步  
  5. (1)、这步是在主DNS(172.16.88.1)添加一条辅助DNS名称及A记录及设置只允许172.16.88.2同步传输区域数据文件  
  6. [[email protected] ~]# vim /var/named/example.com.zone  
  7. 添加如下内容:  
  8. options {  
  9.  directory "/var/named";  
  10.  allow-recurion { 172.16.0.0/16; };  
  11.  notify yes;     ##当有数据更新时,立即通知辅助DNS服务  
  12. }  
  13.     IN  NS  ns2.example.com.  
  14. ns2 IN  A  172.16.88.2  
  15. :wq  
  16. [[email protected] ~]# vim /etc/named.conf  
  17. 在example.com及88.16.172区域中添加如下内容:  
  18. allow-transfer { 172.16.88.2; };      ##只允许172.16.88.2发送请求同步传送区域数据文件  
  19. 注:辅助DNS服务器(172.16.88.2/16),所以下面的配置在辅助DNS上配置的。 

(2)、创建一个辅助DNS服务器(slaves:172.16.88.2):  ##只需要建立主配置文件,区域文件不需要创建,通过主服务器进行同步


  1. [[email protected] ~]# yum list all | grep 'bind'        
  2. [[email protected] ~]# rpm -e bind-libs bind-utils             ##这里采用的是bind97版本,所以把系统默认安装的bind-libs、bind-utils卸载  
  3. [[email protected] ~]# yum install bind97 bind97-utils      ##bind97(服务器所使用的软件包、bind-libs、bind97-utils(客户端工具)  
  4. [[email protected] ~]# mv /etc/named.conf /etc/named.conf.bak   
  5. [[email protected] ~]# vim /etc/named.conf  
  6. options {  
  7.         directory "/var/named" ;  
  8.        allow-recursion    { 172.16.0.0/16; };  
  9. };  
  10. zone "." IN  {  
  11.         type hint;  
  12.         file "named.ca";  
  13. };  
  14. zone "localhost" IN {  
  15.         type master;  
  16.         file "named.localhost";  
  17.         allow-transfer { none; };  
  18. };  
  19. zone "0.0.127.in-addr.arpa" IN {  
  20.         type master;  
  21.         file "named.loopback";  
  22.         allow-transfer { none; };    ##172.16.88.2是辅助DNS服务器,不需要给任何主机提供传送功能,故在这里使用allow-transfer { none; };  
  23. };  
  24. zone "example.com" IN {                  
  25.         type slave;                    
  26.         file "slaves/example.com.zone";  
  27.         masters { 172.16.88.1; };  
  28.         allow-transfer { none; };  
  29. };  
  30. zone "88.16.172.in-addr.arpa" IN {  
  31.         type slave;  
  32.         file "salves/172.16.88.zone";  
  33.         masters { 172.16.88.1; };  
  34.         allow-transfer { none; };  
  35. };  
  36. :wq    ##保存并退出  

使用named-checkconf检查配置文件是否有语法错误并将属组改为named,权限为640
然后到主DNS(172.16.88.1)服务器上执行service named reload,并查看日志(tail /var/log/message)是否将区域数据文件传送到辅助DNS服务器

互联网域名解析系统DNS的工作原理及相关服务配置然后到主DNS(172.16.88.1)分别在正向解析文件和反向解析文件中添加一条新的记录如


  1. [[email protected] ~]# vim /var/named/example.com.zone  
  2. 添加一条新的记录如下,并将***加上1,表示数据已更新:  
  3. hello IN  A 172.16.88.10  
  4. :wq  
  5. [[email protected] ~]# vim /var/named/172.16.88.zone  
  6. 10 IN  PTR  hello.example.com.  
  7. :wq  
  8. [[email protected] ~]# service named reload  
  9. [[email protected] ~]# tail /var/log/message  

互联网域名解析系统DNS的工作原理及相关服务配置然后再到辅助DNS(172.16.88.2)执行如下命令


  1. [[email protected]~]# tail /var/log/message  ##查看是否同步增量区域数据文件查看是否存在主DNS服务器上添加的新记录  
  2. [[email protected] ~]# cat example.com.zone 

互联网域名解析系统DNS的工作原理及相关服务配置

第十一步:编译安装dnstop
我们在维护DNS服务器时,网络管理员希望知道哪些用户在使用DNS服务器,同时也希望统计DNS的状态,我们可以使用dnstop来完成查询
dnstop
源代码可以到
http://www.stearns.org/dnstop/下载(可以选择rpm格式,也可以选择tar.gz)
在编译安装前,我们要准备编译环境将开发工具及开发库安装及libpcap-devel的支持


  1. [[email protected] ~]# yum groupinstall "Development Libraries" "Development Tools" -y  
  2. [[email protected] ~]# yum install  libpcap-devel -y  
  3. [[email protected] ~]# tar xf dnstop-20110502.tar.gz -C /usr/local  ##解压路径  
  4. [[email protected] ~]# cd /usr/local/dnstop-20110502  
  5. [[email protected] dnstop-20110502]#./configure        ##这里以默认属性安装  
  6. [[email protected] dnstop-20110502]#make   
  7. [[email protected] dnstop-20110502]#make install     ##完成安装 

编译安装过程附图参考:

互联网域名解析系统DNS的工作原理及相关服务配置

编译安装成功了,下面就运行下,看看有哪些计算在使用DNS服务器在查询?
互联网域名解析系统DNS的工作原理及相关服务配置