DNS基础知识

域名(Domain Name)

由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。

什么是DNS?

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
例如:网站“百度”,它的IP地址是202.108.22.5。我们经常使用是域名地址www.baidu.com
来访问该网站,就是因为DNS服务器在我们输入www.baidu.com 域名地址后,根据数据库中的映射关系自动将网址转换为IP地址,所以我们通过网址也可以进行访问。

DNS从概念上可以分为三部分

域名空间:就是我们经常说到 的 “域名+网站空间”,是二者的一个统称。是标识一组主机并提供相关信息的树结构的详细说明。树上的每一个节点都有其控制下的主机相关信息的数据库。查询命令试图从这个数据库中提取适当的信息。这些信息是域名、IP地址、邮件别名等在DNS系统中能找到的内容。

域名服务器:保持和维护域名空间中数据的程序。由于域名服务是分布式的,每一个域名服务器含有一个域名空间自己的完整信息,并保存其他有关部分的信息。一个域名服务器拥有其控制范围内的完整信息。控制范围称为区(Zone),对于本区的请求,由负责本区的域名服务器实现域名解析;对于其他区的请求,将由本区的域名服务器联系其他区的域名服务器实现域名解析。

解析器:简单的程序或子程序库,它从服务器中提取信息以相应对域名空间中主机的查询,用于DNS客户。

FQDN

Full Qualified Domain Name,完全合格的域名,即每个域在全球网络都是唯一的;域(Domain),并不是指诸如www.baidu.com这样的域名,而baidu.com才是域。

域名空间

在域名系统中,每台计算机的域名由一系列用点分开的字母数字组成。例如:某台计算机的FQDN为www.ubuntu.org.cn,其具有的域名为:ubuntu.org.cn。

域名空间是层次结构的,域名中最重要的部分位于右边(cn)。FQDN最左边的段(www)是单台计算机的主机名或主机别名。
图片说明

根域(root domain)

只有一个,没有上级域,以圆点“.”来表示。在Internet中,根域是默认的,一般不需要表示出来。
全球13台根域名服务器以英文字母A到M依序命名,域名格式为“字母.root-servers.net”。
在根域服务器中,并没有保存全世界的所有Internet网址,只保存着顶级域的“DNS服务器到IP”的对应数据。
每一层的DNS服务器,只负责管理其下一层的“DNS到IP”的对应数据。

顶级域名(Top-Level Domain,TLD)

以根域为上级域,顶级域名又分为两类:一类是国家顶级域名(national top-level domainnames,简称nTLDs),200多个国家都按照ISO3166国家代码分配了顶级域名,例如中国是cn,美国是us,日本是jp等;另一类是国际顶级域名(international top-level domain names,简称iTDs),例如表示工商企业的 .com .Top,表示网络提供商的.net,表示非盈利组织的.org,表示教育.edu,以及没有限制的中性域名如.xyz等。

各级子域(Subdomain)

除了根域和顶级域之外,其他域都称为子域。一个域可以有许多层子域。在已经申请成功的域名下,一般都可以按自己的需求来设置一层或多层子域。比如www.ubuntu.org.cn,ubuntu.org是cn的子域,ubuntu是org.cn的子域。

反向域(in-addr.arpa)

为了完成反向解析过程,需要使用到另外一个概念,即反向域,通过它来讲一个ip地址解析为相应的全域名。
所以一个服务器实际上至少要负责管理两个域,即本地域和相应的反向域。

例如:对于xyz公司,如果加入Internet,它所获得的管理域将包括两个:xyz.com域和in-addr.arpa反向域。若xyz公司所获得的ip地址为C类地址199.34.51.0,则其域名服务器将负责管理反向域51.34.199.in-addr.arpa。

DNS的解析过程

  • 第1步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
  • 第2步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
  • 第3步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
  • 第4步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
  • 第5步:重复第四步,直到找到正确的纪录。
  • 第6步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

DNS的查询模式

  • 按查询方式分类
    • 递归查询
      只要发出递归查询,服务器必须回答目标IP地址与域名的映射关系。一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。
    • 迭代查询
      服务器收到一次循环查询回复一次结果,这个结果若不是目标IP与域名的映射关系,将会继续向其他服务器进行查询,直到找到含有所查询的映射关系的服务器为止。一般DNS服务器之间属于循环查询,若DNS服务器2不能响应DNS服务器1的请求,则它会将DNS服务器3的IP发给DNS服务器1,以便DNS服务器1向DNS服务器3发出请求。
  • 按照查询的内容分类
    • 正向解析:通过域名查找ip
    • 反向解析:通过ip查找域名

DNS服务器的类型

因特网上的域名服务器用来存储域名的分布式数据库,并为DNS客户提供域名解析。它们也是按照域名层次来安排的,每一个域名服务器都只对域名体系中的一部分进行管辖。
根据它们的用途,域名服务器有以下几种不同类型:

  • ①主域名服务器
  • ②辅助域名服务器
  • ③缓存域名服务器
  • ④转发域名服务器

DNS资源记录

DNS服务器在提供域名解析服务时,会查询自己的数据库。在数据库中包含描述DNS区域资源信息的资源记录(Resource Record,简称RR)。常用的资源记录有:

  • ①区域记录
    • a.SOA:起始授权机构记录,定义了区域的全局参数,进行整个域的管理设置一个区域内是唯一的。一个区域文件值允许存在唯一的SOA记录。
      格式为:区域名 SOA 主域名服务器(FQDN) 管理员邮箱地址 (序号 刷新时间 重试时间 过期时间 生存时间)
    • b.NS:名称服务器(NS)资源记录表示该区的授权服务器,它们表示SOA 资源记录中指定的该区的主和辅助服务器,也表示了任何授权区的服务器。每个区在区根处至少包含一个NS记录。
      格式为: 区域名 IN NS 完整主机名(FQDN)
  • ②可选记录
    • a.CNAME:别名记录,为主机记录别名。
      格式为:别名 IN CNAME 主机名
    • b.TXT:文本记录,表示注释。
  • ③基本记录
    • a. A :地址(A)资源记录把FQDN映射到IP地址,因而解析器能查询到FQDN对应的IP地址。
      格式为:完整主机名(FQDN)IN A IP地址
    • b.AAAA:ipv6地址记录,域名解析为ipv6地址的映射。
    • c.PTR:反向地址记录,相对于A资源记录,指针(PTR)记录把IP地址映射到FQDN。
      格式为:IP地址 IN PTR 主机名(FQDN)
    • d.MX:邮件交换记录,用于控制邮件的路由。
      格式为:区域名 IN MX 优先级(数字) 邮件服务器名称(FQDN) #区域名一般为空代表本区域

DNS服务器的配置文件

/etc/named.conf #主配置文件,用于定义全局选项部分,以及当前域名服务器负责维护的域名地址解析信息。
/etc/named.rfc1912.zones #主配置文件的扩展文件,用于指示引用了哪些区域文件。
/var/named/named.ca         #包含全球主要的根域名服务器的主机名和IP地址。
/var/named/named.localhost  #定义回环网络接口主机名localhost的正向解析记录。
/var/named/named.loopback  #定义回环网络接口IP地址127.0.0.1的反向解析记录。

主配置文件

主配置文件 /etc/named.conf
options {
    listen-on port 53 { any; };       #服务监听的端口和IP地址
    listen-on-v6 port 53 { ::1; };    #服务(ipv6)监听的端口和IP地址
    directory "/var/named";           #区域文件存放的位置
    dump-file "/var/named/data/cache_dump.db";   #转储文件存放的位置
    statistics-file "/var/named/data/named_stats.txt"; #静态缓存的位置
    memstatistics-file "/var/named/data/named_mem_stats.txt";  #服务器输出的内存使用统计文件位置
    allow-query  { any; };   #允许查询的客户机
    recursion yes; #是否使用递归查询
    dnssec-enable yes; #是否使用DNS加密
    dnssec-validation yes; #是否使用DNS加密高级算法
    bindkeys-file "/etc/named.iscdlv.key";   #密钥文件的位置
    managed-keys-directory "/var/named/dynamic";#管理密钥文件的位置
};
logging {   #日志文件
    channel default_debug { 
        file "data/named.run";  #运行状态文件
        severity dynamic;#静态服务器地址
    };
}; 
zone "." IN {    #“.”根区域
    type hint;   #区域类型为根域
    file "named.ca";   #区域配置文件
};
include "/etc/named.rfc1912.zones";#包含扩展配置文件
include "/etc/named.root.key";

其中type选项指定的区域类型有:

  • ①master:表示定义的是主域名服务器。拥有区域数据文件,并对此区域提供管理数据。
  • ②slave:表示定义的是辅助域名服务器。拥有主DNS服务器的区域数据文件的副本,辅助DNS
    服务器会从主DNS服务器同步所有区域数据。
  • ③hint:表示是互联网中根域名服务器。当服务器启动时,它使用根线索来查找根域名服务器,并找到最近的根域名服务器列表。
  • ④forward:一个forward zone是每个域的配置转发的主要部分。
  • ⑤stub:和slave类似,但是只复制主DNS服务器上的NS记录而不像辅助DNS服务器会复制所有区域数据。
  • ⑥delegation-only:用于强制区域的delegation.ly状态。

BIND

1、BIND:Berkeley Internet Name Domain,是一个域名服务软件包,Linux使用这个软件包来提供域名服务。BIND的服务端软件是被称作named的守护进程。

BIND的服务端软件是被称为named的守护进程,其主要功能如下:

若查询的主机名与本地区域信息中相应的资源记录匹配,则使用该信息来解析主机名并为客户机做出应答(UDP:53)。
若本区域信息中没有要查询的主机名,默认会以递归方式查询其他DNS服务器并将其响应结果缓存于本地。
执行“区传输(zone transfer)”,在服务器之间复制zone数据(TCP:53)。

2、解析器库程序:联系DNS服务器实现域名解析。

3、DNS的常用命令行:nslookup、host、dig。

项目实施

基本的DNS服务器的搭建流程主要分为五个步骤:

  • 安装bind软件包
  • 编辑主配置文件named.conf,设置DNS服务器管理的区域(zone)及这些区域所对应的区域文件名和存放目录;
  • 建立被主备配文件包含的区域文件named.rfc1912.zones;
  • 配置正向解析数据库文件和反向解析数据库文件;
  • 重新加载配置文件或重新启动named服务,使用配置生效。

安装DNS服务

yum -y install bind*

DNS服务器配置

  • 1、DNS服务的主配置文件named.conf:/etc/named.conf
    //常用配置全局字句
    options  {
      listen on port 53 { any;};   #指定监听的端口和接口的IPV4
      listen-on-v6 port 53 { ::1; };   #指定监听的端口和接口的IPV6
      directory  "/var/named";      #包含的区数据文件存储目录
      dump-file  "/var/named/data/cache_dump.db";     #服务器缓存信息存储文件
      statistics-file  "/var/named/data/named_stats.txt";    #统计信息存储文件
      memstatistics-file  "/var/named/data/named_mem_stats.txt"; 
      allow-query     { any; };      #允许查询的客户机列表,默认是所有主机。
      recursion yes|no;        #是否使用递归式DNS服务器,默认为yes。
      dnssec-enable yes|no;    #是否返回DNSSEC相关的资源记录。
      dnssec-validation yes|no;  #指定确保资源记录是经过DNSSEC验证为可信的,默认为yes。
    };
  • 2、主配置文件(/etc/named.conf)中配置区(Zone)声明
  • 3、DNS服务的主配置文件named.conf:/etc/named.conf
  • 4、主配置包含的区(Zone)配置文件(/etc/named.rfc1912.zones)
      //添加正向域声明
      zone “xxx.com" IN {
          type master;  主区域
          file "/var/named/xxx.com.zone"; #正向区域数据配置文件名
          allow-update { none; }; #允许动态更新客户端IP地址(none表示全部禁止)
      };
      //添加反向域声明
      zone “3.168.192.in-addr.arpa” IN { #某IP网段的反向解析
          type master; #主区域
          file "/var/named/192.168.3.zone"; #反向区域数据配置文件名
          allow-update { none; };
      }
  • 5、配置正向解析数据库文件(/var/named/xxx.com.zone
      $TTL 1D @       IN SOA  xxx.com. 123213123.qq.com (  
                           1       ; serial                
                           1D      ; refresh                
                           1H      ; retry                  
                           1W      ; expire                       
                           3H )    ; minimum         
              NS    dns.xxx.com. 
      dns     IN  A      192.168.3.166 
      www     IN  A      192.168.3.167
      ftp     IN  CNAME  www.xxx.com
      mail    IN  A      192.168.3.168
              IN  MX     mail.xxx.com.
  • 6、配置反向解析数据库文件/var/named/192.168.3.zone
     $TTL 1D @       IN SOA  xxx.com. 12123123.qq.com(                                      
                          0       ; serial                       
                          1D      ; refresh                  
                          1H      ; retry                 
                          1W      ; expire                 
                          3H )    ; minimum         
              NS      dns.xxx.com. 
      166     IN  PTR     dns.xxx.com. 
      167     IN  PTR     www.xxx.com.

    启动和检查DNS服务