DNS:Domain Name Service,linux上的DNS服务是基于一种软件BIND实现的。BIND: Berkeley Internet Name Domain。

那什么是域名呢?举个例子,先问个问题:www.baidu.com是不是域名?可能有人会说这个是域名,其实这是错误的,这个是主机名,否则你怎么访问到它呢。baidu.com才是域名,com也是域名,因为其下面包含有baidu这个域。www.baidu.com是主机名,也叫FQDN,FQDN:Full Qualified Domain Name,完全限定域名(可翻译成其他名字)
那DNS是用来做什么的呢?DNS,即名称解析,简单来说就是名称转换,即Name Resolving,其背后有查询过程,既然是查询,肯定需要依赖某些数据库来实现。那既然是名称解析,主要实现什么解析呢?其实现的是从FQDN <--> IP,这是一种双向转换,或者说双向解析,从FQDN可实现到IP的解析,同样,从IP也可以实现到FQDN的解析。但这种双向转换是通过不同的机制实现的。
 
要完成名称解析的机制有很多,为了有一个统一的框架,就出现了nsswitch,nsswitch实现为多种需要提供名称解析的机制提供一种名称解析的平台,它不负责真正的名称解析,仅提供一种框架,或者说平台。就像淘宝一样,仅提供平台,不负责真正的买卖。帮我们实现能够将DNS转换成IP地址的机制有两个:libnss_files.so和libnss_dns.so库文件。用户提交查询请求的时候,是通过nsswitch这个框架来去这两个库文件中查找的。
在nsswitch的配置文件/etc/nsswitch.conf中有这么一行内容:
hosts:  files dns
这里的file指的就是通过libnss_files.so来找/etc/hosts文件,通过这个文件来完成主机名称到IP地址的对应关系。这里的dns指的就是DNS服务。当我们去访问一个主机名的时候,主机名是不能建立真正的联系的,它会调用一个库文件来完成从主机名到IP地址的转换,这个完成机制,在我们主机上叫做stub resolver,可翻译成名称解析器,这是一个软件也可以理解为程序。这个名称解析器会通过某个库来完成通过nsswitch的配置文件中指定的文件files来查找该文件中有没有我们查找的主机名对应的IP地址,如果有就可以查找成功。如:当我们去ping www.baidu.com的时候,这是个主机名,是没法建立直接联系的,需要转换成IP地址才行,这时候ping命令会借助于本地的stub resolver来完成名称解析,stub resolver第一步先查找nsswitch的配置文件中指定的files文件查找有没有对应的IP的地址,如果有就查找成功,没有,就通过我们的DNS服务器来解析。
在早期的时候,因为当时计算机很少,虽然当时也有IP地址,但我们人记忆数字的能力远没有我们记忆字符串的能力强,所以那个时候就是通过hosts文件来实现解析的过程。每个主机上都有一个hosts文件,里边记录有主机名和IP地址的对应关系。hosts文件的格式为:IPADDR FQDN(即主机名) Ailases(别名),当用户要解析某个主机名或别名的时候,系统通过本地的hosts文件来查找第二列有没有匹配的,有就把第一列的IP地址返回给用户,由此实现解析。但后来随着主机的增多,这种方法显然已经无法满足我们的需要。有点扯远了,好了,我们还回到我们的DNS上来。想要了解更多关于该方面的信息,请查阅相关资料。
  
DNS,采用的是C/S架构,使用一种分布式数据库,有严格的上下级关系,上级仅知道其直接下级,而下级只知道根的位置。当我们要解析某个主机名的时候,先从最上级进行查找,然后逐级往下查找,最终返回结果。
最上级的是根域,用.表示根域,根域下又有许多TLD。
TLD:Top Level Domain顶级域,顶级域又分为三类:
    组织域:如:.com,.org,.net,.cc等等
    国家域:如:.cn,.hk,.iq,.ir,.jp,.us等等
    反向域:IP-->FQDN(早期仅能实现该解析方式)
        反向:IP-->FQDN
        正向:FQDN-->IP

DNS域名解析查询过程
DNS的查询过程,按查询方式的不同,分为递归查询和迭代查询。
递归查询:只发出一次请求,本地主机向本地域名服务器发出查询请求,如果本地域名服务器能够解析,则返回查询结果,否则,本地域名服务器向根请求查询,如果根知道结果则返回给本地域名服务器结果,否则,就由根在向下移级域名查询结果,这样逐级查询,最终逐级返回结果,最终返回到本地主机。
迭代查询:发出多次请求,本地主机先向本地域名与服务器发出查询请求,如果本地域名服务器能够解析,则返回结果,否则,由本地主机向根查询,同样,如果根能够解析直接返回结果,否则返回负责该域名解析的下一级域名,让本地主机找该域名继续查询,最终,找到结果。
在实际的网络中,一般采用两段式查询过程,即先递归,后迭代。从本地主机到本地域名服务器采用递归查询,而从本地域名服务器到最终结果则采用迭代方式查询。
DNS的解析过程又可分为正向解析和反向解析。由FQDN到IP是正向解析,而由IP到FQDN属于反向解析。
 
DNS查询实例

我们以查询www.redhat.com为例来了解DNS查询的过程,如上图
1、本地客户端将www.redhat.com的查询提交给本地DNS服务器,此时采用递归查询方式。
2、本地DNS服务器检查区域数据文件,由于此服务器不负责redhat.com的解析,因此,本地DNS服务器将查询传递到根服务器,请求解析主机名称。根服务器把.com服务器IP返回给本地服务器,此时采用的是迭代查询方式。
3、本地DNS服务器将请求发给.comDNS服务器,此服务器根据请求将redhat.com的DNS服务器IP地址返回给本地DNS服务器,此时依然是迭代查询。
4、本地DNS服务器向redhat.com的DNS服务器发送请求,由于此服务器负责该域名解析,因此将www.redhat.com的IP地址返回给本地DNS服务器。
5、本地DNS服务器最终将结果发给本地客户端。
DNS服务器类型
DNS服务器类型主要分为以下几种:
(1)主DNS服务器(primary name server):它是特定域所有信息的权威性信息源。它从域管理员构造的本地磁盘文件中加载域信息,该文件(区文件)包含着该服务器具有管理权的一部分域结构的最精确信息。主服务器是一种权威性服务器,因为它以绝对的权威去回答对其管辖域的任何查询。
(2)辅助DNS服务器(secondary name server):它可从主服务器中复制一整套域信息。区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。这种复制称为"区文件复制"。在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。因此,辅助域名服务器也称作权威性服务器。配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。
(3)高速缓存服务器(caching-only server):可运行域名服务器软件,但是没有域名数据库软件。它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。 
 
 
DNS的资源记录类型
 
     
  1. 数据库中的每一个条目称作一个资源记录(Resource Record,RR)  
  2. 资源记录的格式:  
  3.     NAME  [TTL]  IN(关键字)  RRT(资源记录类型) VALUE    
  4. 如:  
  5. www.hulunbeier.com.   IN    A              172.16.0.1  
  6. 172.16.0.1            IN    PTR            www.hulunbeier.com  
  7.    
  8. 资源记录类型:  
  9.     SOA(Start OF Authority):起始授权记录(第一条必须是此记录)  
  10.           ZONE NAME     TTL    IN    SOA   FQDN    ADMINISTRATOR_MAILBOX (  
  11.                            serial number:可理解为版本号  
  12.                            refresh:检查时间周期  
  13.                            retry:重试时间  
  14.                            expire:过期时间  
  15.                            nagative answer TTL:否定答案缓存时间 )  
  16.              时间单位:M(分钟)、H(小时)、D(天)、W(周),默认为秒  
  17.           邮箱格式:[email protected] --写为--->admin.hulunbeier.com  
  18.           如:  
  19. hulunbeier.com.      500    IN       SOA     ns1.hulunbeier.com.  admin.hulunbeier.com. (  
  20.                                 2013040101  
  21.                                 1H  
  22.                                 5M  
  23.                                 1W  
  24.                                 1D )          
  25.     NS(Name Server):DOMAIN NAME-->FQDN :名称服务器(任何一个NS记录都有一个A记录与其相随)  
  26.         如:  
  27.         hulunbeier.com.       500   IN    NS   ns1.hulunbeier.com.  
  28.         ns1.hulunbeier.com.   500   IN    A       172.16.0.1  
  29.     MX(Mail eXchanger):ZONE NAMA-->FQDN  :邮件交换器  
  30.         ZONE NAME      TTL     IN     MX   pri    VALUE  
  31.         优先级:0-99,数字越小级别越高  
  32.             如:  
  33.             hulunbeier.com.    500   IN    MX  10   mail.hulunbeier.com.  
  34.             mail.hulunbeier.com.   500   IN    A      172.16.0.10  
  35.     A(address):FQDN-->IPv4   
  36.     AAAA:FQDN-->IPv6  
  37.     PTR(pointer):IP-->FQDN :指针记录  
  38.     CNAME(Canonical NAME):Alias-->FQDN :别名记录  
  39.         www2.hulunbeier.com.       IN    CNAME      www.hulunbeier.com.  
  40.         ftp                     IN    CANME      www  
  41.     TXT  
  42.     CHAOS  
  43.     SRV  
区域文件,包括正向区域文件和反向区域文件。
 
 
    
  1. 正向区域文件格式为:    
  2.         hulunbeier.com.        IN    NS     FQDN  
  3.         www.hulunbeier.com.    IN     A     192.168.0.1  
  4.         第二行可简写为:  
  5.         www               IN      A     192.168.0.1   
  6.       
  7. 反向区域文件:  
  8.         0.168.192.in-arpa.       IN       SOA     FQND  
  9.         如:  
  10.         1.0.168.192.in-arpa.       IN     PTR     www.hulunbeier.com.  
  11.         可简写为:  
  12.         1               IN          PTR    www.hulunbeier.com.  
 
我们主机上的DNS服务其实是通过一种软件BIND来实现的,要想使用需要先安装然后才能使用。这里不再介绍如何安装。下面我们介绍下BIND。bind的版本我们使用的是bind97版本。所以我们主要介绍bind97。
 
 
    
  1. bind97安装后会生成如下几个目录:  
  2.     /etc/named.conf  #这是主配置文件,里边包含有BIND进程的工作属性的定义和区域的定义。  
  3.     /var/named/*   #这个目录下是所有区域数据文件存放的地方。在该目录下包含这样两个文件:  
  4.     /var/named/named.localhost  
  5.     /var/named/named.loopback  #这两个文件是本地主机名的正反解析文件。  
  6.     /etc/rc.d/init.d/named,这个是服务,我们可使用如下几个命令来开启、关闭服务等。  
  7.     {start|stop|restart|status|reload}  
  8.   
  9.   
  10. bind安装完成后,在修改配置文件及添加区域数据文件时,常使用如下两个命令,对其进行检查。     
  11. named-checkconf:检查配置文件有没有语法错误  
  12. named-checkzone:检查区域文件有没有错误  
  13.    
  14. dig:Domain Information Gropher  ,该命令一定要熟记,是查询DNS的主要命令。下面使用时我们跟边使用边介绍其用法。这里先说两个简单命令。  
  15. dig -t NS .  :可查看根域名服务器信息(前提是本机必须可以上网)  
  16. dig -t NS .  @host :表示通过host主机查看根域名服务器信息      
  17.       
  18.    
  19. 区域的定义:/etc/named.conf配置文件  
  20. zone "ZONE NAME" IN {     #定义区域名称,其中IN是关键字  
  21.     type [master|slave|hint|forward];   #指定区域类型  
  22.     file "ZONE_DATA_FILENAME";    #指定区域数据文件保存地文件  
  23.     masters { MASTER_IP; };    #指明主服务器地址,该定义只在从服务器上使用     
  24. };      
一起看一下其配置文件里的内容:
 
 
    
  1. options {         #定义全局选项,在所有区域中均有效,如果区域中对某一项有定义,则使用区域中定义的,否则使用此处已定义好的  
  2.     listen-on port 53 { 127.0.0.1; };      #指定BIND侦听的DNS查询请求的本机IP地址和端口  
  3.     listen-on-v6 port 53 { ::1; };          #同上,但只用在IPv6版本中  
  4.     directory   "/var/named";               #指定区域配置文件所保存的路径  
  5.     dump-file   "/var/named/data/cache_dump.db";   #当执行rndc dumpdb命令时,DNS服务器存放数据库文件的路径名  
  6.         statistics-file "/var/named/data/named_stats.txt";       
  7.         memstatistics-file "/var/named/data/named_mem_stats.txt";  
  8.     allow-query     { localhost; };      #指定接受DNS查询请求的客户端  
  9.     recursion yes;                         #是否允许递归  
  10.    
  11.     dnssec-enable yes;                         
  12.     dnssec-validation yes;  
  13.     dnssec-lookaside auto;  
  14.    
  15.     bindkeys-file "/etc/named.iscdlv.key";  
  16. };  
  17.    
  18. logging {                      #指定BIND服务的日志参数  
  19.         channel default_debug {       #日志通道,用于指定日志发送目标,default_debug是通道名称  
  20.                 file "data/named.run";     #记录的日志保存到指定路径下的的文件中  
  21.                 severity dynamic;         #指定日志的级别  
  22.         };  
  23. };  
  24.    
  25. zone "." IN {         #指定区域配置参数  
  26.     type hint;         #根  
  27.     file "named.ca";    #指定保存数据文件的路径,这里是相对路径,即相对上边的/var/named  
  28. };  
  29.    
  30. include "/etc/named.rfc1912.zones";      #该配置文件中其他区域定义在该文件中,这里使用该命令将该配置文件包含进来  
  31.    
 
先介绍几个命令,用于查询:
 
 
    
  1. dig -t RT(资源记录类型) NAME [#IP]    #当记录类型不同时,其后所跟的名称也不同  
  2. dig -t NS ZONE_NAME     #通过区域名查询  
  3. dig -x IP:根据IP查找FQDN      
  4.     #在使用该命令时,系统会返回给我们很多信息,我们主要看ANSWER SECTION这个选项的信息,这才是我们想要的答案,其他选项不做介绍  
  5. dig +norecurse -t A FQDN @HOST     #通过host主机不递归查询该FQDN,默认情况使用递归查询  
  6. dig +trace -t A FQDN @HOST         #通过host主机追踪查询该FQDN的查询过程  
  7. host -t RT NAME:查询名称的解析结果  
  8.     如:# host -t RT www.mageedu.com        
  9. nslookup      #交互式查询界面,与windows下的该命令类似    
  10. nslookup>  
  11.     server IP  
  12.     seT q=RT  
  13.     set q=A  
  14.     NAME  
在修改/etc/named.conf前请确保下面的值你已修改过,否则当你查询时可能会对结果有影响。
 
 
    
  1. 临时性关闭SELinux: 
  2. getenforce     #表示查看SELinux是否启用,输入该命令如果显示Enforcing,则需要关闭 
  3.   
  4. setenforce 0    #关闭SELinux服务 
  5. setenforce 1     #开启该服务 
  6.   
  7. 永久关闭,可编辑/etc/selinux/config文件修改SELinux=Permissive    
 
现在我们来配置本地缓存服务器。
可编辑/etc/named.conf配置文件,进行修改
 
 
    
  1. options {  
  2.     directory  "/var/named" ;  
  3. };  
  4.    
  5. zone "." IN {  
  6.     type hint;  
  7.     file "named.ca";     #默认情况下该文件是存在的,可去/var/named目录下查看  
  8. };  
  9.    
  10. zone "localhost" IN {     #该区域和下边的区域定义可实现本机的正反向解析  
  11.     type master;     #指定主服务器  
  12.     file "named.localhost";   #默认情况下该文件是存在的,可去/var/named目录下查看  
  13. };  
  14.    
  15. zone "0.0.127.in-addr.arpa" IN {  
  16.     type master;  
  17.     file "named.loopback";   #默认情况下该文件是存在的,可去/var/named目录下查看  
  18. };  
  19.    
  20. 配置好以上几个,缓存服务器建立好  
  21.    
  22. service named start     #重启服务即可生效  
  23.    
  24. vim /etc/resolv.conf      #编辑本机的dns服务器指向指定  
  25. search example.com  
  26. nameserver 172.16.32.100     #要换成本主机的域名服务器地址  
  27.    
  28. 要想下次开机启动,可用如下命令:  
  29. # chkconfig named on  
  30.    
缓存服务器就可以使用了,就算是下次重新开机也可以使用
 
 
 
本想举个DNS配置实例一块贴出来,但发表时总提示字数太多不让发表,所以,配置服务器的实例放到下一篇。