《TCP/IP协议族》:DNS协议一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yexiangCSDN/article/details/86165374

一. DNS协议理论知识

域名系统 DNS (Domain Name System),域名系统并不像电话号码通讯录那么简单,通讯录主要是单个个体在使用,同一个名字出现在不同个体的通讯录里并不会出现问题,但域名是群体中所有人都在用的,必须要保持唯一性。为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法。

DNS是一个分布式的C/S网络数据库,分布式的原因是:互联网中没有单独的一个站点能够知道所有的信息。

域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器。访问DNS是通过地址解析器的应用程序库来完成。

如果说ARP协议是用来将IP地址转换为MAC地址,那么DNS协议则是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。 
我们都知道,TCP/IP中使用的是IP地址和端口号来确定网络上某一台主机上的某一个程序,不免有人有疑问,为什么不用域名来直接进行通信呢? 
1. 因为IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不便于计算机处理。 
2. IP地址对于用户来说不方便记忆,但域名便于用户使用,例如www.baidu.com这是百度的域名比记住百度的IP地址方便多了。

总结一点就是IP地址是面向主机的,而域名则是面向用户的。

域名和IP的对应关系保存在一个叫hosts文件中。 

DNS包含三个主要组成部分:

1. 域名空间(Name Space)和资源记录(Resource Record)。

2. 域名服务器(Name Server) 用以提供域名空间结构以及信息的服务器程序。

3. 解析器(Resolver) 作用是应客户程序的要求从域名服务器抽取信息。

二、DNS域名结构

2.1 域名空间层次结构

域名系统必须要保持唯一性。 为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法: 

1. 每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成 

2. 标号序列总长度不能超过255个字符(完全限定域名FQDN,它由点号分割成一个个的标号(label) 

3. 每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。 

4. 级别最低的域名写在左边,级别最高的域名写在右边。 

5. 域名服务主要是基于UDP实现的,服务器的端口号为53。 用户到服务器采用UDP,DNS服务器通信采用TCP

2.2 域名空间的分级 (树形结构)

  注意: 箭头有点偏移

例子:cs.nankai.sed.cn表示的是南开大学计算机系的主机。 

Linux目录结构一样,现代因特网采用层次树状结构的命名方法,任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,该名字称为域名

域名的分级:域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。

1. 国家顶级域名 nTLD:如: .cn 表示中国,.us 表示美国,.uk 表示英国,等等。

2. 通用顶级域名 :

.com (公司和企业)    .net  (网络服务机构)

.org  (非赢利性组织)   .edu  (美国专用的教育机构()

.gov  (美国专用的政府部门)  .mil   (美国专用的军事部门)

.int   (国际组织) .aero (航空运输企业)

.biz  (公司和企业) .cat   (加泰隆人的语言和文化团体)

.coop  (合作团体) .info  (各种情况)

.jobs  (人力资源管理者) .mobi  (移动产品与服务的用户和提供者)

.museum  (博物馆) .name   (个人)

.pro  (有证书的专业人员) .travel  (旅游业)

3. 反向域名(基础结构域名(infrastructure domain)):只有一个arpa,用于PTR查询(IP地址转换为域名) 。

比如:本网站的域名 jocent.me,由点号分割成了两个域名jocent 和 me,其中 me是顶级域名(TLD,Top-Level Domain), jocent是二级域名(SLD,Second Level Domain)。

注意:最开始的域名最后都是带了点号的,比如 jocent.me 搁以前的话应该是 jocent.me. ,最后面的点号表示根域名服务器,后来发现所有的网址都要加上最后的点,就简化了写法,干脆所有的都不加,但是你在网址后面加上点号也是可以正常解析的。

2.3 域名的完整性

域名的完整性根据域名的完整性,我们将域名分为FQDN和PQDN。

FQDN(Full Qualified Domain Name):完全合格的域名,也称为绝对域名(还记得绝对路径吗?Linux中的绝对路径是以/开头,而此处的绝对域名则是已.结尾)。

PQDN(Partiallly qualified domain name):标号不是以.结束,在将该地址传递给DNS服务器之前,本主机的DNS客户进程中的解析程序可以补充缺少的部分(称为后缀),使得PQDN变为FQDN,显然DNS客户程序通常保存了一份有关后缀的列表

三、DNS域名服务器

域名服务器(Name Server): 用以提供域名空间结构以及信息的服务器程序。

Linux 默认是BIND,提供域名解析服务。

域名是分层结构,域名服务器也是对应的层级结构。

域名服务器实际上就是装有域名系统的主机。

由高向低进行层次划分,可分为以下几大类:

分类 作用

根域名服务器

最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助.

根服务器主要用来管理互联网的主目录。 所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。全球共有13台根服务器。1个为根服务器架构主根服务器,放置在美国。其余12个均为辅根服务器,其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。 据说,在主根服务器系统上还有一个更高级的、隐藏着的母服务器,当然也在美国,而全世界所有的顶级域名都是由这台母服务器来确定的。 
中国还没有自己的根服务器。都是根服务器的镜像(5个)

顶级域名服务器

负责管理在该顶级域名服务器下注册的二级域名。比如.com顶级域名服务器里就存放了所有xxx.com域名和ip地址映射表。

权限域名服务器

负责一个区的域名解析工作. 当一个权限域名服务器还不能给出最后的查询回答时,就会告诉查询请求的DNS客户进程,下一步应当找哪一个权限域名服务器;这类服务器负责某一特定域名的域名解析,很多公司都有权限域名服务。比如腾讯有它的权限域名服务器,里面存储了腾讯域名和ip地址的映射关系。

本地域名服务器

可以看成是默认域名服务器。这台服务器的ip地址就是我们电脑里配置的dns,本地域名服务器一般离用户是比较近的,当本地主机无法解析域名就会首先给本地域名服务器发送请求。

一个域名服务器所负责的范围,或者说有管理权限的范围,就称为,每一个区中所有的结点必须是连通的,每一个区中都设置相应的权限域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。所以,DNS服务器的负责范围不是以“域”为单位的,而是以“区”为单位,区可能小于或等于域,但一定不会大于域,区是“域”的子集

注意:同一个区可能存在多个权限域名服务器。

为了保证数据的安全性,一个区域的管理者必须为该区域提供一个主域名服务(primaryserver)和 辅助域名服务器(secondary server)。主域名服务器从磁盘文件中调入该区域的所有信息,而辅助域名服务器则从主域名服务器调入所有信息,我们将辅助域名服务器从主域名服务器调入信息的过程称为区域传送。当主域名服务器的磁盘文件更新时,辅助名字服务器会定时(通常为3h)向主域名服务器询问是否有数据更新,如果有,则通过区域传送方式获得新数据。建立辅助域名服务器的目的是为了保证数据的安全性,当主域名服务器出现故障时间,其辅助域名服务器可以继续对客户提供服务。

注意:一个服务器可以是某个区域的主域名服务器,同时又是另一个区域的辅助域名服务器。

四、DNS工作流程

下图来描述整个dns请求的流程,整个过程采用迭代查询注意权限域名服务器一般是不会采用递归查询的,它会直接返回ip地址让请求着再去访问这个ip。

递归查询:就好比是我问A同学一个问题,他不知道,于是他就去问B同学,如果B知道,就告诉A,A再告诉我结果,如果B也不知道,那么就继续向C问,C知道了告诉B,B再告诉A,A知道答案,告诉我,最终也是A和我直接交互。 

迭代查询:就好比是我问A同学问题,A不知道,但是A告诉我,B知道,你去问B吧,B知道,最终是B告诉了我答案。

上述过程具体可描述如下: 

1. 主机首先查找自身的DNS缓存,如果有就直接访问,如果没有,则查询本机的 /etc/host 文件。(域名和IP的对应关系保存在一个叫hosts文件中),如果还没有,则主机就向本地DNS服务器进行递归查询 . /etc/resolv.conf是DNS客户机配置文件.主要是nameserver  关键字 ,定义DNS服务器的IP地址,如nameserver 202.102.192.68。
2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询 
3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的IP地址 
4. 本地域名服务器向顶级域名服务器进行查询 
5. 顶级域名服务器告诉本地域名服务器,下一步查询权限服务器的IP地址 
6. 本地域名服务器向权限服务器进行查询 
7. 权限服务器告诉本地域名服务器所查询的主机的IP地址 
8. 本地域名服务器最后把查询结果告诉主机 

查询过程中,递归查询和迭代查询可能会都使用,客户和服务器之间采用递归查询,服务器之间采用迭代查询,可能会多次迭代。 

域名的解析过程 :

主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文。本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。

本地域名服务器采用迭代查询:

本地域名服务器采用递归查询:

假如用户希望通过FTP客户进程来访问运行在一台远程主机上的FTP服务器,该FTP服务器的域名为xxx.com.,给出整个处理流程大致描述:

1.用户将xxx.com.传递给其主机上的FTP客户进程;

2.FTP客户程序将xxx.com.传递给DNS客户进程;

3.由于每一台主机在加载内核后都能获得其DNS服务器的IP地址,DNS客户进程便通过该IP地址向DNS服务器发送DNS查询报文,要求服务器给出xxx.com对应的IP地址;

4.DNS服务器进程在收到该DNS查询报文后,通过一系列的查询操作(递归查询或迭代查询)获得xxx.com对应的IP地址后将xxx.com的IP地址写入到DNS响应报文中发回给DNS客户进程;

5.DNS客户进程将获得的xxx.com的IP交付给FTP客户进程;

6.FTP客户进程在收到FTP服务器的IP地址后,就可以访问FTP服务器了。

五、DNS查询过程

Linux下可以用 nslookup 查询:具体用法请自行 man nslookup

yexiang@ubuntu:<~>$ nslookup dnsserver
Server:         210.22.84.3
Address:        210.22.84.3#53

Non-authoritative answer:
Name:   dnsserver
Address: 220.250.64.225

yexiang@ubuntu:<~>$ nslookup
> set type=a
> baidu.com
Server:         210.22.84.3
Address:        210.22.84.3#53

Non-authoritative answer:
Name:   baidu.com
Address: 123.125.115.110
Name:   baidu.com
Address: 220.181.57.216
>

六、DNS请求中UDP和TCP的选择

DNS可以使用UDP/53,也可以使用TCP/53,当响应报文的长度小于512B时就使用UDP(因为UDP的最大报文长度为512B),若响应报文的长度超过512B,则选用TCP。DNS协议关于UDP和TCP的选择通常为以下两种情况:

(1)若DNS客户程序事先知道响应报文的长度512B,则应当使用TCP连接;

NOTICE:主域名服务器与辅助域名服务器在进行区域传送时,通常数据量都比较大,所有DNS规定,区域传送使用TCP协议。

(2)若解析程序不知道响应报文的长度,它一般使用UDP协议发送DNS查询报文,若DNS响应报文的长度大于512B,服务器就截断响应报文,并把TC(truncated)位置1,在这种情况下,DNS客户程序通常使用TCP重发原来的查询请求,从而它将来能够从DNS服务器中收到完整的响应。

结论:DNS客户程序在不知情(不知道DNS响应报文的长度是否超过512B)的情况下通常采用UDP与DNS服务器程序连接,在知情的情况下则采用TCP进行连接

七、 高速缓存Caching 

DNS客户程序将查询报文交给某个DNS服务器后(通常是主机域名服务器),若被查询的域名不在该DNS服务器的映射表中,则该DNS服务器会向另外一个DNS服务器请求 映射并在接收到响应后,把该映射信息返回给DNS客户程序之前,先要将该映射存储在自己的Caching中。若同一个客户或另一个客户请求同样的映射时,它就检查caching,并能够快速实现解析。当然,由于该服务器不是DNS程序的所请求域名的权限服务器,为了告知DNS客户程序这个响应是来自caching,而不是一个授权的信息源,这个服务器要把响应标记为未授权的。

Caching可以提高解析效率,当然“如何更新Caching”是一个问题。可以采取如下方案反正Caching过时:

方案一权限域名服务器把TTL的信息添加到映射上,因为TTL定义了接收信息的服务器可以把映射信息放入Caching的时间长度(通常为2天),经过这段时间后,这个映射就变为无效的,因而任何查询都必须在发送给权限服务器。

方案二DNS要求每一个权限服务器对Caching中的每一条映射都有保持一个TTL计数器。Caching必须定期地搜索并清除那些TTL到期的映射。

八、DNS的安全隐患

目前对于DNS的安全隐患主要分为2类,一类是攻击真实的域名服务器让服务器掉线,比如利用服务器软件漏洞,曾经还发生过对根域名服务器的成功攻击。另一类是抓住dns协议的漏洞来进行攻击。dns协议很简单,就一个请求和回复,在这个过程中会对服务器返回结果的ip地址和首部中16位标识进行验证,如果ok那dns客户端总是相信服务器返回的结果是正确的。正是这个地方攻击者可以做手脚,比如DNS缓冲区中毒攻击,它需要攻击者能够看到dns服务器的查询数据包,有了查询数据攻击者才能伪造回应信息给dns服务器。它的原理是攻击者替换dns服务器中的多行数据从而导致客户端收到错误的ip地址,然后去访问攻击者想要客户端访问的网站。现在关键是攻击者如何才能将恶意数据放入dns服务器中呢?可以想象攻击者要么获得对服务器的访问,要么向发送请求的dns服务器回应错误的信息,以达到伪造的目的。对于这种攻击可以采用dns数据加密的方式。还有一种攻击类似于syn flood,假设攻击者给很多服务器发送大量请求报文,这可能造成网络的流量猛增而瘫痪。不过dns是采用无连接的udp,当udp缓冲区被塞满时将会丢弃多余的数据包,而dns客户端请求不到ip地址将会重试几次请求或者用户重新在浏览器点击链接。因此这种攻击只要采用防火墙进行过滤网络就会快速恢复。

九、常用公共DNS

谷歌DNS

主DNS:8.8.8.8

辅DNS:8.8.4.4

114DNS

主DNS:114.114.114.114

辅DNS:114.114.115.115

阿里DNS

主DNS:223.5.5.5

辅DNS:223.6.6.6

360DNS

主DNS:101.226.4.6

辅DNS:123.125.82.6

猜你喜欢

转载自blog.csdn.net/yexiangCSDN/article/details/86165374