计算机网络(浅谈DNS协议)

来源:互联网 发布:mac office 2016 很卡 编辑:程序博客网 时间:2024/05/31 15:19
    DNS我们并不陌生,全名叫域名解析系统,其核心功能就是将主机名转换成IP地址,但是DNS远远比我们想象的要复杂得多。
    人类能以很多方式来标识,例如我们的名字,用来标识一个人。在因特网上,主机和人类一样能使用多种方式进行标识。第一种是用主机名,应该可以理解为域名,例如cloudker.com,人们乐意用这种方式,因为便于记忆嘛。然而,这些由不定长字母数字组成的字符串,却没有提供主机在因特网位置的信息,而且路由器难以处理。因此,主机也可以使用所谓的IP地址进行标识,但是IP地址绝不只是为了提供位置信息。IP地址由4个字节组成,有严格的结构层次。
    主机名是面向用户的,IP地址可以是面向路由器的,谁愿意看就面向谁,为了折衷这些不同的偏好,我们需要一种能将主机名转换成IP地址的服务,于是DNS出现了。DNS是一个分层的DNS服务器实现的分布式数据库,一个使得主机能够查询分布式数据的应用层协议。DNS协议运行在UDP之上,使用53号端口,DNS使用客户-服务器模式运行在通信的端系统之间。
    DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP和FTP,将用户提供的主机名解析为IP地址。但我们用浏览器请求URL www.cloudker.com/category/c 首先发一个HTTP请求到Web服务器www.cloudker.com,该用户主机必须获得www.cloudker.com的IP地址。做法如下:
    ·同一台用户主机上运行着的DNS应用的客户端
    ·浏览器从上述URL中取出主机名,并将这太主机名传给DNS应用的客户端
    ·DNS客户向DNS服务器发送一个包含主机名的请求
    ·DNS客户收到一份回答报文,其中含有对应主机名的IP地址
    ·一旦浏览器接收到DNS传来的IP地址,就可以通过80端口的HTTP服务器进程发起一个TCP连接

    我们在命令行下利用ping也可以查一个主机名的IP地址,例如ping www.cloudker.com,就会自动转换成IP地址,可见ping也有利用DNS。
    DNS不仅仅是一台服务器,因为因特网上有着数以亿计的主机,没有一台DNS服务器拥有因特网上所有主机的映射,大致来说有三种类型的DNS服务器,分别是根服务器、顶级域DNS服务器和权威DNS服务器。假设一个DNS客户要得到www.cloudker.com的IP地址,客户首先与根服务器之一联系,它将返回顶级域名com的TLD服务器的IP地址,该客户则与这些TLD服务器之一联系,它将为cloudker.com返回权威服务器的IP地址,最后权威服务器返回该主机名的IP地址。
    根DNS服务器存放顶级域DNS服务器的IP地址,而顶级域DNS服务器存放权威DNS服务器的IP地址,分层次数据库。现在的根服务器貌似已经有几百个了,顶级域DNS服务器处理各自的域,例如Verisign Global Registry Servies公司维护com顶级域的TLD服务。
    还有另外一类DNS服务器叫本地DNS服务器,一般都是在ISP商那里,这个服务器起到代理的作用,我们发出DNS请求时,该服务器转发到DNS服务器层次结构中。
    然而DNS查询有两种方式,一种是递归查询一种是迭代查询。
    迭代查询:如果我们需要得到一个主机名的IP地址,就要发送报文给本地DNS服务器,本地DNS服务器将请求报文转发给根DNS服务器,根DNS服务器再返回顶级域TLD DNS服务器的IP地址,本地DNS服务器再发送给顶级域TLD DNS服务器,TLD DNS服务器返回权威DNS服务器的IP地址,本地DNS服务器再发给权威DNS服务器,权威DNS服务器返回该主机名的IP地址。
    递归查询:首先客户发送给本地DNS服务器,本地DNS服务器再发给根DNS服务器,跟DNS服务器发送给TLD DNS服务器,TLD DNS服务器发送给权威DNS服务器,然后再一层一层返回。
    中国有句古话:NO pic you say a J8!

    迭代查询:

递归查询:

    DNS缓存是DNS系统的一个非常重要的特色,为了改善时延性能并减少传输的DNS报文数,所以广泛采用了DNS缓存技术。当某DNS服务器接收到一个DNS回答时,它能将该回答中的信息缓存在本地存储器中。跟Web缓存器差不多,作用都一样。但是有些主机并不是永久的用一个IP地址,所以DNS服务器会在一段时间后丢弃缓存的信息。


    DNS分布式数据库的所有DNS服务器存储了资源记录,资源记录提供了主机名到IP地址的映射。
    资源记录包含四元组:(Name,Value,Type,TTL)
    TTL是该记录的生存时间。
    Type = A,则Name是主机名,Value是该主机名对应的IP地址,所以A资源记录提供了标准的主机名到IP的映射。
    Type = NS,则Name是个域,Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名,这个记录用于沿着查询链来路由DNS查询。
    Type = CNAME,则Name是别名为Name的主机对应的规范主机名,该记录能够向查询的主机提供一个主机名对应的规范主机名。
    Type = MX,则value是个别名为Name的邮件服务器的规范主机名,MX记录允许邮件服务器主机名具有简单的别名。通过MX记录,公司的邮件服务器和其他服务器可以使用相同的别名,为了获得邮件服务器的规范主机名,DNS客户应当请求一条MX记录。


    DNS报文格式:

    前12个字节是首部区域,包含几个字段,第一个字段(标识)是一个16比特的数,用于标识该查询。这个标识会被赋值到对查询的回答报文中,以便客户用它来匹配发送的请求和接收到的回答。标志字段用1比特用来支出报文是查询报文还是回答报文。首部区域后4类字段,是有关数据区域出现的数量。
    问题区域包含着正在进行的查询信息,包括名字字段(主机名字)、类型字段(类型A或者类型MX等)。
    回答区域包含对最初请求的名字的资源记录,授权区域包含其他权威服务器的记录。
    附加区域包含了其他有帮助的记录。
    
    我们能利用命令行下nslookup程序,向任何DNS服务器发送DNS查询报文。

    DNS脆弱性在于针对DNS服务器的分布式拒绝攻击(DDOS),攻击者试图向每个DNS根服务器发送大量分组,让这些服务器无法正常工作。现在许多DNS服务器受到了分组过滤器的保护,配置的分组过滤器阻挡了所有向根服务器的ICMP ping报文。
    当然也有不针对根服务器,而针对顶级域名服务器发送大量的DNS请求的攻击,顶级域名服务器不向根服务器那么容易绕过,但这种攻击的严重性通过本地DNS服务器中的缓存技术可将部分缓解。
    还有其他的攻击方式,攻击者截获来自DNS基础设施请求并返回伪造的回答,也就是DNS欺骗。
    DNS反射攻击现在也很流行,伪造DNS请求,让DNS服务器向目标主机发送它们的回答,也就是“放大”。

0 0
原创粉丝点击