当我们谈网络时,我们谈些什么2(2)DNS

序言

准备了很久,之前自己理解不够通彻的,这里自己参阅相关书籍,进行了又一个整理。下篇更新TCP/UDP相关。进入正题,网域名称系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。上述为来自维基百科对于DNS的描述,通过简单概述,我们知道了这个系统是什么了。

  • 那么为什么要有这么个系统呢?互联网将我们每一个人连接起来,当我们想通过互联网进行沟通,分享,那么首先我们需要一个标示来代表网络中的每一个人,独一无二的,现实生活中我们采用了身份证ID,网络中采用了IP地址,除了唯一性,其还具备一个共性就是其数字的排列在一定程度上具备区域性,比如山东人的身份证前几位可能就都是相同的,同理山东的一些地区的IP地址的前几位也是相同的。而我们平时生活中见了人是不会说hi,371909933的,我们会叫名字,为什么,因为不需要把百度的IP记录下来,然后每次要搜索东西的时候,都要输入IP,有了它我们只需要输入www.baidu.com就可以了,非常方便。

  • 这个系统为什么要做成分布式的呢?首先我们想到的一个策略是将IP和域名的对应存放在一个集中的服务器上,然后当我们需要访问转化的时候,带着我们的域名发送网络请求,然后系统根据我们的域名找到相对应的IP,然后再返回IP地址给我们,我们通过IP地址
    DNS运行在UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

按照之前的描述思路,我们先从报文格式入手,然后从其作用,解析流程,DNS污染劫持,DNS攻击来讲解DNS系统。

DNS记录和报文

DNS是一个分布式的数据库,那么数据库中记录了什么呢?DNS存储的记录提供了从主机名到IP地址的映射,我们称之为资源记录,而资源记录的格式则为一个四元组(Name,Value,Type,TTL),四元组中的每一个元素代表什么呢?

  • TTL:记录的生存时间,决定了记录从缓存中删除的时间。

  • Name/Value:值取决于Type

  • Type:

    • A:Name:主机名 Value:IP地址

    • NS:Name:域 Value:获取主机IP地址的权威DNS服务器主机名

    • CNAME:Name:主机名 Value:规范主机名(bd.com dl.bd.com)用来简化记忆

    • MX:Name:主机名 Value:邮件服务器的规范主机名
      DNS具备

当我们谈网络时,我们谈些什么2(2)DNS

这个报文由12字节长的首部和4个长度可变的字段组成。
标识字段由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。

当我们谈网络时,我们谈些什么2(2)DNS

  • QR是1bit字段:0表示查询报文,1表示响应报文。

  • opcode是一个4bit字段:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。

  • AA是1bit标志,表示“ 授权回答(authoritativeanswer)”。该名字服务器是授权于该域的。

  • TC是1bit字段,表示“可截断的(truncated)”。使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节。

  • RD是1bit字段表示“期望递归”。该比特能在一个查询中设置, 并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为 0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。在后面的例子中,我们将看到这两种类型查询的例子。

  • RA是1bit字段,表示“ 可用递归”。如果名字服务器支持递归查询,则在响应中将该比特设置为 1。在后面的例子中可看到大多数名字服务器都提供递归查询,除了某些根服务器。

  • 随后的3 bit字段必须为0。

  • rcode是一个4bit的返回码字段。通常的值为0(没有差错)和3(名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。

  • 随后的4个16bit字段说明最后4个变长字段中包含的条目数。对于查询报文,问题数通常是1,而其 他3项则均为0。类似地,对于应答报文,回答数至少是1,剩下的两项可以是0或非0。
    当我们谈网络时,我们谈些什么2(2)DNS

查询名是要查找的名字,它是一个或多个标识符的序列。查询类型是我们上述所提到的type中的几个类型,查询类通常是1,指互联网地址。
DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR的相同格式。
当我们谈网络时,我们谈些什么2(2)DNS

前面几个字段和请求报文的字段的报文相同,这里不再详细介绍,着重介绍下后续几个字段。生存时间字段是客户程序保留该资源记录的秒数。资源记录通常的生存时间值为两天。资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于A类型资源数据是4字节的IP地址。

DNS作用

DNS提供的服务除了对于域名到IP地址的转化之外,还提供了那些功能呢?有以下几点

  • 主机别名
    有些主机名可能会拥有多个主机别名,别名会更容易辨识,DNS则提供了一种服务,用来进行将别名到主机名的映射,然后找到主机的IP地址并返回。

  • 邮件服务器列表
    电子邮件应用可以进行DNS请求,对提供的邮件服务器别名进行解析,然后获得主机的规范主机名和IP地址。

  • 负载均衡
    考虑一个问题,如果我们的一个域名对应一个IP地址,一个IP地址也就对应一台主机,当用户量非常大的时候,我们在访问的过程中,则会将服务器淹没,因此会将域名对应一个IP地址集合,通过这个集合,每次再有DNS请求,则会循环读取IP地址,然后下发IP地址。

DNS解析流程

这里我们通过浏览器输入百度的IP地址来作为实例。

  • 当我们在浏览器输入了网址,然后浏览器这个时候会调用操作系统提供的DNS转化服务

  • 首先是检测本地host文件,是否有缓存,而且未过期,则使用

  • 如果不存在,则会向向本地DNS服务器的发送了DNS解析请求,如果本地DNS服务器缓存了百度的DNS记录,则使用

  • 如果本地DNS服务器没有该记录就回向根服务器请求,然后根服务器收到请求后,会返回给本地服务器相应的顶级域名DNS服务器地址。

  • 以www.baidu.com为例,就回返回解析com顶级域名的服务器,然后本地服务器知道顶级域的DNS服务器的地址后就会向该服务器发送解析请求,然后顶级域服务器返回给本地DNS服务器百度的权威服务器的IP地址。

  • 同上,本地DNS服务器向百度的权威DNS服务器发起查询请求。就会得到百度权威DNS服务器返回给本地服务器的百度服务器的IP地址。

  • 最后,本地DNS服务器会把百度服务器的IP地址返回给你的电脑,同时将这条记录缓存在本地DNS服务器。
    递归查询的图示

当我们谈网络时,我们谈些什么2(2)DNS

Note:以上是通过递归的方式进行的查询操作,当然还存在其他的查询方式如仅仅的”递归“,通过对于报文头部字段的修改即可改变该种方式。

DNS劫持污染

DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。国内对于一些国外的网站的墙的手法中,DNS劫持污染就是一种,将一些要墙掉的网站指向一些不可访问的地址,同时当前运营商也在干一件比较恶心的事情,也是让当前很多互联网公司比较头疼的一个问题,运营商为牟利将一些公司的域名进行劫持到其它的公司。比较有名的几个劫持事件都发生在百度身上,最大规模被域名劫持祸害过的其实就是百度,2010年百度域名被伊朗网军劫持过,整整八个小时用户上不去百度,是百度成立以来最严重的服务器故障,据说直接损失直接超过700万,间接损失更多。百度当时也是一边紧急启动备用登陆进行恢复,一边痛骂劫持方。后来百度一直痛恨数据劫持,之前360浏览器使用百度时,会给360引流。(流氓之间互掐)当然现在很多大厂也开始提供公共DNS,来对恶意网站进行拦截,智能解析防止被劫持和广告的插入。

说道DNS污染,不得不提的是DNSCrypt,其实现原理通过对DNS请求内容进行加密的方式来巧妙的绕过墙。

DNS安全性

常见的DNS攻击方式DDos带宽洪泛攻击,中间人攻击,发射攻击。

  • DDos:常见的一种攻击方式,通过向目标主机发送大量的分组,来使得合法的请求得不到相应,但是由于DNS的缓存服务,使得对于一些根服务器或者是权威服务器的攻击得到很好地缓解,即使顶级服务器无法正常响应了,但是本地的DNS服务器中都有缓存,我本身就无需访问顶级服务器。

  • 中间人攻击:通过对于DNS包的拦截,返回制定的恶意地址,然后将用户引向恶意的源地址。该种方式可以通过向一些DNS服务器中发送伪造的记录,从而造成一个区域内的某些域收到感染。

  • 发射攻击:反射攻击不再是对DNS服务器的攻击,而是借助于DNS的特性,将攻击目标主机的IP作为源地址发送大量的请求包到DNS服务器,然后服务器的响应就会指向本地,特别是对于一些请求内容比响应内容要小很多的类型,我们自己无需很大的流量就可以把目标主机淹没。

《计算机网络自顶向下》《TCP/IP详解》两本书结合着加上自己之前的整理来完成了本篇博客,以后要加快更新速度了。网络结束之后,操作系统,编译原理的Flag也要跟进了。

相关推荐