DNS是name的缩写,有些地方也叫名字。它是一个将域名和IP地址相互映射的分布式数据库,可以让人们更方便地访问互联网。很多人都知道DNS域名解析的大致过程,但是有些细节很容易忘记。下面我总结分析了一些与DNS相关的知识,希望能够帮助大家了解和熟悉DNS。
1. DNS 基础知识
DNS主要是用来将域名解析为IP地址的协议,有时也用于将IP地址反向解析为域名,所以DNS可以实现双向解析。
DNS可以使用TCP和UDP的53端口,基本都使用UDP协议的53端口。
1. 域名的分类
域是分级管理的,类似中国的行政级别。
最高级别的域名是根域名(root),是一个圆点,就像一个国家的总统一样。全球只有13个根域名服务器,大部分都在美国,中国没有一个根域名服务器。
根域名下一级是第二级顶级域名(TLD),即各省省长。顶级域名的划分一般有两种方式:按国家划分和按组织划分。
顶级域名下面就是普通域名,企业或者个人在互联网上注册的域名一般都是这些普通域名,比如。
2. 主机名、域名、FQDN
我们以百度()和百度贴吧()为例。
不管是还是,它们的域名严格来说都是“.”这是百度购买的com域名的子域名。
对于 ,主机名为 www,对于 ,主机名为 tieba。严格来说, 和 是主机名,它们都是域下的主机。一个域下可以定义多台主机,只需要配置其主机名和对应主机的 IP 地址即可。
FQDN 是 Fully Name 的缩写,全称为完全限定域名 (Fully Name)。是指包含所有域的主机名,包括根域。FQDN 可以说是主机名的完整表述,从逻辑上准确地表明了主机位于何处。
例如 的FQDN为“.”,com后面有一个点,即根域; 的FQDN为“。”。
3. 域的分级授权
域的授权是从上到下的,每一层只对自己的直属下级负责,不负责下级。例如,根域授权顶级域,顶级域授权普通域,但根域不授权普通域。与现实世界的行政管理不同,域的授权和管理永远不会往下跳,因为它不知道下级层的域名是否存在。
4.DNS解析过程
仍以访问为例。
(1)当客户端要访问一个文件的时候,它会先搜索本地的DNS缓存,再搜索自己的hosts文件,如果找不到,它才会搜索DNS服务器(这个DNS服务器就是计算机指向的DNS)。
(2)DNS服务器收到查询请求后,首先检查自己是否有缓存,如果有,则直接返回给客户端,如果没有,则向上级到根域“.”进行查询。
(3)根域看到自己在寻找.com域名,就把到.com域名的路径(地址)告诉DNS服务器,要求DNS服务器去寻找.com。
(4)DNS服务器查找.com。当它发现“.com”在其管辖范围内时,它会将IP地址提供给DNS服务器,并要求其查找。
(5)DNS发现DNS服务器正在寻找自己区域内的www主机,于是就把这个主机的IP地址给DNS服务器。
(6)DNS服务器将IP结果告诉客户端,并在自己的机器上缓存一份该结果(由于服务器允许客户端进行递归,所以默认会缓存,否则不会缓存非权威性数据)。
(7)客户端收到响应的IP地址后,进行缓存,然后访问页面,并将页面内容发送给客户端,也就是百度页面。
最后我想指出的是:
1. 如果本机搜索缓存后没有找到结果,就会先搜索hosts文件,如果还是没有找到结果,就会向DNS服务器发送查询。不过这只是默认的情况,默认的顺序是可以改变的。在/etc/.conf中有一行“hosts:files dns”定义了是先搜索hosts文件还是先提交给DNS服务器。如果修改这一行“hosts:dns files”,就会先提交给DNS服务器。这种情况下,hosts文件几乎用不到了。
2.由于缓存是多级的,实际查询可能没有那么多步骤。上图中的步骤是完全不需要缓存的查询。如果一个主机已经向DNS服务器提交了查询,那么DNS服务器除了缓存的记录外,还缓存了“.com”和“”的记录。如果另一个主机向DNS服务器提交查询,则会跳过“.”和“.com”的查询过程,直接向 发送查询请求。
5./etc/.conf 文件
此文件主要用于定义DNS指向,即指定查询主机名时使用哪个DNS服务器。此文件的详细说明请参见Linux网络管理:/etc/.conf。
比如这个文件中指定了“8.8.8.8”,那么每当你要查询主机名的时候,就会向DNS服务器8.8.8.8发起递归查询,这个DNS服务器会帮忙找到最终的结果并返回给你。
当然,在后面的实验测试过程中,还采用了另外一种方式来指定需要使用的DNS服务器:在dig命令中使用“@”。
DNS 术语
1. 递归和迭代查询
例如主机A想查询域C中的某个主机,A指向的DNS服务器是B,其递归和迭代查询方法如下:
递归查询:A --> B --> C --> B --> A
迭代查询:A --> BA --> C --> A
将递归查询和迭代查询放入查询过程如下图所示。(指向的DNS服务器未标注)
换句话说,递归就是问谁谁就得给谁答案。允许递归就是帮忙找位置。比如A允许B递归,那么B问A的时候,A就会帮忙找答案。如果A不允许B递归,那么A就会把下一层域的地址告诉B,让B自己找。
可以想象,如果整个域名体系都采用递归查询的话,那些公共的根域和顶级域将会忙死,所以更好的解决办法是将压力分散到各个个性化的DNS服务器上。
因此,DNS解析过程如下图所示,从客户端到DNS服务器的阶段是递归查询,DNS服务器之后的阶段是迭代查询。也就是说,出于性能考虑,顶级域和根域不允许递归提供给任何其他机器。
为什么客户端对 DNS 服务器的查询是递归查询呢?因为客户端本身不是 DNS 服务器,它无法在互联网上查找域名地址,所以只能向 DNS 服务器询问,而 DNS 服务器最终必须返回答案,所以 DNS 服务器需要为这个客户端允许递归。因此 DNS 解析器发出的查询(host、dig 等)都是递归查询。
2. 权威服务器和(非)权威响应
权威服务器()可以理解为直接上级域的DNS服务器,比如这台主机的上级域是,那么对于www来说,它的权威服务器就是本域内负责解析的DNS服务器,而对于这台主机来说,它的权威服务器就是.com域内负责解析的DNS服务器。
更具体的说,一个域的权威服务器是一个能够直接查看域数据(即区域数据文件)的DNS服务器,主DNS服务器和辅DNS服务器都是权威服务器。
只有权威服务器给出的答案才是权威答案,否则就是非权威答案。为什么呢?因为一个域内的所有主机都记录在DNS服务器中的区域数据文件中。对于主机来说,它们的位置只有其直接上层知道。
因此,如果希望在解析时获得权威的答案,就应该将DNS指向该域中负责解析的DNS服务器。
只有权威服务器直接给出的答案才是永远正确的,通过缓存得到的答案基本都是非权威答案。当然这也不一定,因为权威服务器给出的答案也是缓存中的结果,但它是权威答案。DNS服务器缓存数据库进行解析的时间长短由权威服务器决定。
3. DNS 缓存
在DNS服务器等定制化的DNS解析系统中,会使用缓存来加速解析,以减少网络流量和查询压力,即使无法解析的否定答案也会被缓存。
但是访问的主机IP地址可能会变化,使用缓存得到的答案不一定正确,所以缓存的答案是非权威的,只有该主机的给出的答案才是权威的答案,缓存的非权威答案应该设置一个缓存时间,这个缓存时间的长短由权威机构指定。
另外,如果你访问某个域中不存在的主机,这个域的DNS服务器也会给出答案,但是这是否定答案。否定答案也会被缓存,并且有缓存时间。比如你请求某个域中的FTP主机,但实际上该域下可能没有这样的FTP主机,那么就会给出否定答案。为了防止FTP的持续访问而造成破坏,负责解析这个域的DNS服务器需要为否定答案指定一个缓存时间。
4. 主 DNS 服务器和辅助 DNS 服务器
DNS服务器又叫域名服务器,每个域都必须有一台DNS服务器来解析与该域相关的数据。但是DNS服务器负责整个域的数据解析,压力比较大,一旦出现问题,整个域就崩溃了,无法对外提供服务,这是非常严重的事情。所以,无论是为了负载均衡,还是域数据的安全性和可用性,两台DNS服务器都是最低要求,大多数情况下应该配置更多的DNS服务器。
DNS服务器有主、辅之分,主DNS服务器称为主(),从DNS服务器称为从(Slave),从(Slave)上的域数据都是从主()获取的,这样,从(Slave)和从(Slave)都可以对外提供名称解析服务。
5. 资源记录(RR)
对于提供DNS服务的系统(DNS服务器),需要将域名相关数据存储在文件(区域数据文件)中。这些数据被分成多个类别,每个类别存储在对应的资源记录(RR)中。也就是说,资源记录用于区分域数据的类型,并存储对应的域数据。
DNS类中的资源记录有很多种,常用的有SOA记录、NS记录、A记录(IPV6的AAAA记录)、PTR记录、CNAME记录、MX记录等。
其中:(下面的内容如果不理解,可以跳过,配置区域数据文件的时候再回来看)
(1).SOA记录:start of,起始权限。该记录存储了一系列数据。如果对SOA记录不了解,请参考下面的NS记录。关于SOA的更多信息,请参见“”部分。格式如下:
longshuai.com. IN SOA dnsserver.longshuai.com. mail.longshuai.com. (
3h
1h
1w
1h )
第四列指定“.”作为域的 DNS 服务器。
第五列是域管理员的电子邮件地址,但请注意,您不能使用 @ 格式的电子邮件地址。相反,您必须将 @ 符号替换为点“。”,就像上面的例子一样,“。”实际上意味着“”。
第六列用括号将几个数值括起来。第一个数值是区域数据文件的序号,每次修改这个区域数据文件时,都需要修改该数值,以便从 DNS 服务器同步该区域数据文件。第二个数值是刷新时间间隔,表示从 DNS 服务器寻找 DNS 服务器更新区域数据文件的时间间隔。第三个数值是重试时间间隔,表示从 DNS 服务器在无法联系到 DNS 服务器更新区域数据文件时,会等待多长时间才进行重试。这个数值一般比时间短,否则这个数值代表的重试就失去了意义。第四个数值是过期时间值,表示从 DNS 服务器上的区域数据文件过期多长时间。第五个数值是 ttl,表示客户端寻找 DNS 服务器进行解析时,否定答案被缓存的时间长度。这些数值可以写在单独的行中,也可以直接写在同一行中,并用空格隔开。因此,上述 SOA 记录可以写成以下格式:
longshuai.com. IN SOA dnsserver.longshuai.com. mail.longshuai.com. ( 1 3h 1h 1w 1h )
前三列为声明性语句,表示域“.”中的起始权限为第四列值“.”所代表的主机。第五列和第六列为SOA的附加属性数据。
每个区域数据文件有且只能有一个 SOA 记录,一般定义为区域数据文件中的资源记录。
注意,资源记录的作用之一是存储域相关的对应数据,因此第4、5、6列代表SOA记录中存储的相关值。
(2)NS记录:名称,存储域中DNS服务器的信息。也就是说,NS记录标识了哪个服务器是DNS服务器。格式如下:
longshuai.com. IN NS dnsserver.longshuai.com.
前三列依然是声明性语句,表示“.”域中的DNS服务器(名称)是第四列的值所代表的“.”主机。
如果一个域中有多个DNS服务器,那么肯定有一个主服务器和一个辅服务器,也就是从服务器。但是主辅关系无法体现在NS记录中。例如:
longshuai.com. IN NS dnsserver1.longshuai.com.
longshuai.com. IN NS dnsserver2.longshuai.com.
意思是主机“.”和主机“.”都是域“.”内的DNS服务器,但是没有主DNS服务器和辅DNS服务器之分。
很多人对 SOA 记录不了解,很容易把 SOA 和 NS 记录混淆。其实就其主要作用而言,NS 记录只声明域中哪台主机是 DNS 服务器,用于提供名称解析服务。NS 记录并没有区分哪台 DNS 服务器是从属的。SOA 记录用于指定 NS 记录对应的哪台主机是 DNS 服务器,也就是从多台 DNS 服务器中选择一个,指定为域中的 DNS 服务器,其他的都是从属的,需要从其那里获取域相关数据。因此,SOA 的“ ”这个名字的含义就很容易理解了。
(3).A记录:存储该域中主机名对应的IP地址,格式如下:
dnsserver.longshuai.com. IN A 172.16.10.15
客户端之所以能解析出主机名对应的IP地址,是因为DNS服务器中的A记录保存了主机名与IP的对应关系,AAAA记录保存了主机名与IPv6地址的对应关系。
(4).PTR记录:相对于A记录来说,它存储的是IP地址对应的主机名,此记录只存在于反向解析区域数据文件中(不一定存在),格式如下:
16.10.16.172.in-addr.arpa. IN PTR www.longshuai.com.
表示解析地址172.16.10.16,得到主机名“.”的结果。
(5)CNAME记录:name表示规范名称,它所代表的记录通常被称为别名记录,之所以这样称呼,是因为给规范名称赋予了别名。那么什么是规范名称呢?可以简单认为是fqdn。格式如下:
www1.longshuai.com. IN CNAME www.longshuai.com.
最后一列是规范名称,第一列是规范名称的别名,也就是最后一列。当查询“。”时,DNS服务器会找到它的规范名称“。”,然后查询该规范名称的A记录,进而获取对应的IP地址返回给客户端。
CNAME记录非常重要,很多时候使用CNAME可以解决非常复杂的问题。另外,常用的CDN技术中的一个步骤就是在DNS服务器上设置CNAME记录,将客户端对资源的请求导向到具有相同网络环境(电信、网通)、地理位置相近的缓存服务器上。关于CDN的介绍,可以看下文CDN与DNS的关系。
(6)MX记录:mail,邮件交换记录。负责域名内部的邮件转发或者处理。跟邮件服务器有关,话题比较大,就不细说了,如果需要深入了解,请参考《dns & bind》中的“5.DNS与邮件”。
关于资源记录,需要明确的最重要的概念是:它不仅用于区分和标识区域数据的类型,还用于存储相应的域数据。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。