Loading...
墨滴

苏小迪

2021/04/18  阅读:133  主题:橙心

彻底搞懂系列之:DNS协议

1.域名系统(DNS)

域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP,端口号是53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成(此处以IPv4的地址为例,IPv6的地址同理),记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP的对应关系。

人们发明了域名(Domain Name),域名可将一个IP地址关联到一组有意义的字符上去。用户访问一个网站的时候,既可以输入该网站的IP地址,也可以输入其域名,对访问而言,两者是等价的。例如:微软公司的Web服务器的IP地址是207.46.230.229,其对应的域名是www.microsoft.com,不管用户在浏览器中输入的是207.46.230.229还是www.microsoft.com,都可以访问其Web网站。

Internet上的域名由域名系统(DNS)统一管理,DNS是一个分布式数据库系统,由域名空间,域名服务器和地址转换请求程序三部分组成。

2.域名系统结构

2.1 域名服务器层次结构

域名服务器提供了从域名到IP地址的解析服务,因特网上的域名数量极大,不可能所有的域名信息都保存在一个域名服务器中,也不能上述每个节点都采用一个域名服务器。在实际的公网DNS系统中,域名服务器采用划分区的方式来管理。DNS通过允许一个域名服务器把它的一部分域名服务“委托”给子服务器而实现了一种层次结构的名称空间。

一个服务器所负责管辖的范围叫做区(zone),如果我们把域名空间结构中的根比作国家,顶级域名比作省级行政单位,二级域名看作是市级单位、三级、四级看作是镇和乡,那么自然地,我们会想到管辖国家的是总理,管辖省级单位的是省长,下面还有市长、镇长等等。

像这种把一个域中的一部分子树分给另一个域名服务器管辖,叫做“授权委托”,做了“授权委托”以后的域名服务器很显然管理的范围就小了,它的子节点由被委任的下一级域名服务器管理了。

因特网上的域名结构呈树状分布,因此DNS服务器也是对应的树形结构,每一个DNS服务器能够提供部分域名(它管辖的域名)到IP地址的解析。

因特网上的DNS服务器按照层次安排,根据不同层次的域名服务器所起的作用,可以把域名服务器分为4种不同的类型。

  1. 根域名服务器 最高层次的域名服务器(就好像国家总理一样),也是最重要的域名服务器。全球有13个根域名服务器名称,它们是按照字母A至M排列命名的: [a-m].root-servers.net. 当然,并不是一个名字对应一台物理服务器的地址,一个根服务器的名字可以作为入口对应一组服务器集群来提供域名解析服务。
  2. 顶级域名服务器 就好像国家总理下面的各个省长,管辖省级单位。在DNS中,它们负责管理在该顶级域名服务器注册的下一级域名(二级域名)。所有顶级域名服务器的名称和IP地址都是在根服务器注册的,也就是说,根域名服务器知道所有的顶级域名服务器的名称和IP地址。
  3. 权威域名服务器 负责一个区的域名服务器,就好像省长以下的那些市长、镇长、乡长等行政官。顶级域名服务器也可以算作是权威域名服务器,只不过由于其特殊性,我们专门把它划分为一类。因此权威域名服务器通常是指顶级域名以下的管理二级、三级、四级等域名的服务器。

上面三种服务器的关系可以用这张图表示: dns_server_struct2

  1. 本地域名服务器 这类服务器不属于上面的层次结构,当一个主机(个人电脑)发出DNS请求时,查询请求就被发送到本地域名服务器,本地域名服务器负责回答这个查询,或者代替主机向域名空间中不同层次的权威域名服务器查询,再把查询的结果返回给主机。

2.2 域名结构

在DNS中,域名空间结构采用分层结构,包括:根域名,顶级域,二级域和主机名称。域名空间的层次结构类似一个倒置的树状,在域名层次结构中,每一层称作一个域,每个域用一个点号"."分开。 domain_struct2

  1. 根域 根(root)域就是“.”,它是由Inetnet名字注册授权机构管理,该机构把域名空间各部分的管理责任分配连接到Internet的各个组织。
  2. 顶级域 DNS根域的下一级就是顶级域,是由Inetnet名字授权机构管理。共有3种类型的顶级域,一般代表一种类型的组织机构或国家地区,如 net、com、org、edu、gov、mil、cn、jp、hk
  3. 二级域 用来标明顶级域内的一个特定的组织,国家顶级域下面的二级域名由国家网络部门统一管理,如 .cn 顶级域名下面设置的二级域名:.com.cn、.net.cn、.edu.cn …
  4. 子域 二级域下所创建的各级域统称为子域,各个组织或用户可以自由申请注册自己的域名
  5. 主机 主机位于域名空间最下层,就是一台具体的计算机,如 www、mail、都是具体的计算机名字,可用www.xxxx.com.cn、mail.xxxx.com.cn 表示我们要访问“xxxx.com.cn”域中一台名为“www”或“mail”的计算机。

顶级域名是域名的最后一个部分,即是域名最后一点之后的字母,例如在http://example.com这个域名中,顶级域是.com(或.COM),大小写视为相同。

二级域名是域名的倒数第二个部分,例如在http://example.com这个域名中,二级域名是example。以此类推。

3.域名解析

域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。也就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。

DNS查询有两种方式:递归迭代。客户端设置使用的DNS服务器(本地域名服务器)一般都是递归服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。而DNS服务器之间一般采用迭代查询方式。

  • 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询(可以理解为一层一层往外查询的过程),直到得到最终的IP地址告诉本机。
  • 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。 dns_search

以查询 www.example.com 为例:

  • 客户端发送查询报文"query www.example.com"至DNS本地服务器,DNS本地服务器首先检查自身缓存,如果存在记录则直接返回结果。
  • 如果记录老化或不存在,则:
    1. DNS本地服务器向根域名服务器发送查询报文"query www.example.com",根域名服务器返回顶级域.com的顶级域名服务器地址。
    2. DNS本地服务器向 .com域的顶级域名服务器发送查询报文"query www.example.com",得到二级域 www.example.com 的权威域名服务器地址。
    3. DNS本地服务器向 .example.com 域的权威域名服务器发送查询报文"query www.example.com",得到主机的IP记录(192.0.2.44),存入自身缓存并返回给客户端。
    4. 最后客户端将发起HTTP请求到真正的Web服务器192.0.2.44,最终返回HTTP响应数据。

理论上,所有域名的查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。事实上也确实如此,ICANN 维护着一张列表(根域名列表),里面记载着顶级域名和对应的托管商

4.DNS协议

DNS协议就是用来将域名解析到IP地址的一种通信过程,DNS协议通常由其他应用层协议使用(如HTTP、SMTP、FTP),DNS除了提供主机名到IP地址转换外,还提供如下服务:主机别名、邮件服务器别名、负载分配等。

DNS协议基于UDP和TCP协议的,端口号53,用户到服务器采用UDP,DNS服务器通信采用TCP。大型运营商、互联网机构等会向公众提供免费的DNS服务,例如,谷歌的8.8.8.8, 8.8.4.4; 阿里巴巴223.5.5.5, 223.6.6.6。如果DNS服务器down掉了,一般只能通过IP地址来访问服务了。

5.DNS协议报文格式

DNS 定义了两种报文 ,一种为查询报文;另一种是对查询报文的响应,称为响应报文。无论是查询报文还是响应报文,都有12个字节的头和查询问题。 segment

5.1 报文头部

  1. 标识: 请求客户端设置的16位标识,服务器给出应答的时候会带相同的标识字段回来,这样请求客户端就可以区分不同的请求应答了。

  2. 标志:标志位一共两个字节16位,它的结构如下: dns-header-flag

    QR - 1个比特位用来区分是请求(0)还是应答(1)。

    OPCODE - 4个比特位用来设置查询的种类,应答的时候会带相同值,可用的值如下:

    • 0 标准查询 (QUERY)
    • 1 反向查询 (IQUERY)
    • 2 服务器状态查询 (STATUS)
    • 3-15 保留值,暂时未使用

    AA 授权应答(Authoritative Answer) - 占1个比特位,这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。

    TC 截断(TrunCation) - 占1个比特位,用来指出报文比允许的长度还要长,导致被截断。

    RD 期望递归(Recursion Desired) - 占1个比特位,这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。

    RA 支持递归(Recursion Available) - 占1个比特位,这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。

    Z 保留值 - 占3个比特位,暂时未使用。在所有的请求和应答报文中必须置为0。

    RCODE 应答码(Response code) - 占4个比特位,这4个比特位在应答报文中设置,代表的含义如下:

    • 0 没有错误。
    • 1 报文格式错误(Format error) - 服务器不能理解请求的报文。
    • 2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。
    • 3 名字错误(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在。
    • 4 没有实现(Not Implemented) - 域名服务器不支持查询类型。
    • 5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。
    • 6-15 保留值,暂时未使用。
  3. 问题数(Questions): 无符号16位整数表示报文请求段中的问题记录数。

  4. 资源记录数(Answer RRs): 无符号16位整数表示报文回答段中的回答记录数。

  5. 授权资源记录数(Authority RRs): 无符号16位整数表示报文授权段中的授权记录数。

  6. 额外资源记录数(Additional RRs): 无符号16位整数表示报文附加段中的附加记录数。

5.2 查询问题区域(Queries)

该部分中每个字段含义如下:

  • 查询名:一般为要查询的域名,有时也会是IP地址,用于反向查询。

  • 查询类型:DNS查询请求的资源类型。通常查询类型为A类型,表示由域名获取对应的IP地址。

    类型 助记符 说明
    1 A 由域名获得IPv4地址
    2 NS 查询域名服务器
    5 CNAME 查询规范名称
    6 SOA 开始授权
    11 WKS 熟知服务
    12 PTR 把IP地址转换成域名
    13 HINFO 主机信息
    15 MX 邮件交换
    28 AAAA 由域名获得IPv6地址
    252 AXFR 传送整个区的请求
    255 ANY 对所有记录的请求
  • 查询类:地址类型,通常为互联网地址,值为1。

5.3 捕获Query数据包

下面是访问www.baidu.com捕获的数据包, dns-pkg-request-Snipaste_2021-04-16_15-48-21

5.4 资源记录(RR)区域

该区域有三个,但格式都是一样的。这三个区域分别是:回答区域授权区域附加区域,格式如下: records

  1. 域名(2字节或不定长) 它的格式和Queries区域的查询名字字段是一样的。有一点不同就是,当报文中域名重复出现的时候,该字段使用2个字节的偏移指针来表示。比如,在资源记录中,域名通常是查询问题部分的域名的重复,因此用2字节的指针来表示,具体格式是最前面的两个高位是 11,用于识别指针。其余的14位从DNS报文的开始处计数(从0开始),指出该报文中的相应字节数。一个典型的例子,C00C(1100000000001100,12正好是头部的长度,其正好指向Queries区域的查询名字字段)。
  2. 查询类型 表明资源纪录的类型,见1.2节的查询类型表格所示
  3. 查询类 对于Internet信息,总是IN
  4. 生存时间(TTL) 以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。
  5. 资源数据 该字段是一个可变长字段,表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等。

5.5 捕获Response数据包

下面给出wireshark抓包的记录,感兴趣的可以根据上面介绍的协议报文格式手动解析一下,可以加深理解: image-20210417154607579

具体数据如下:

Domain Name System (response)
    Transaction ID: 0x22e6
    Flags: 0x8180 Standard query response, No error
        1... .... .... .... = Response: Message is a response
        .000 0... .... .... = Opcode: Standard query (0)
        .... .0.. .... .... = Authoritative: Server is not an authority for domain
        .... ..0. .... .... = Truncated: Message is not truncated
        .... ...1 .... .... = Recursion desired: Do query recursively
        .... .... 1... .... = Recursion available: Server can do recursive queries
        .... .... .0.. .... = Z: reserved (0)
        .... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server
        .... .... ...0 .... = Non-authenticated data: Unacceptable
        .... .... .... 0000 = Reply code: No error (0)
    Questions: 1
    Answer RRs: 3
    Authority RRs: 0
    Additional RRs: 0
    Queries
        www.baidu.com: type A, class IN
            Name: www.baidu.com
            [Name Length: 13]
            [Label Count: 3]
            Type: A (Host Address) (1)
            Class: IN (0x0001)
    Answers
        www.baidu.com: type CNAME, class IN, cname www.a.shifen.com
            Name: www.baidu.com
            Type: CNAME (Canonical NAME for an alias) (5)
            Class: IN (0x0001)
            Time to live: 20 (20 seconds)
            Data length: 15
            CNAME: www.a.shifen.com
        www.a.shifen.com: type A, class IN, addr 14.215.177.39
            Name: www.a.shifen.com
            Type: A (Host Address) (1)
            Class: IN (0x0001)
            Time to live: 549 (9 minutes, 9 seconds)
            Data length: 4
            Address: 14.215.177.39
        www.a.shifen.com: type A, class IN, addr 14.215.177.38
            Name: www.a.shifen.com
            Type: A (Host Address) (1)
            Class: IN (0x0001)
            Time to live: 549 (9 minutes, 9 seconds)
            Data length: 4
            Address: 14.215.177.38
    [Request In: 387]
    [Time: 0.000811000 seconds]

6.回顾

我们这节以问题与回答的形式回顾上面我们的内容,加深理解。

6.1 DNS劫持

DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址或者被转向了各种推送广告等网站,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。

对于DNS劫持,可以采用使用国外免费公用的DNS服务器解决。例如OpenDNS(208.67.222.222)或GoogleDNS(8.8.8.8)。

举个例子易于理解:说到劫持,我们可能联想到一个坏蛋劫持了DNS服务器,拿着刀架在脖子上。这时候你问DNS服务器,博主帅吗?(发出请求)。DNS服务器听到了,他心里的答案是,好帅哦(返回正确ip地址)。由于坏蛋控制了他,并且对他做了修改。所以DNS服务器只好不情愿的说,你真丑(错误的ip地址)。这个过程中,你和DNS服务器之间,一来一回,流程上没有任何问题,唯一的问题就是,DNS服务器告诉了你错误的ip地址。DNS服务器也不想啊,但是有人控制了他的权限,或者修改了他的记录值等等。我们称为DNS劫持。类似我们使用网络的时候,明明访问的是普通网站,却突然跳到什么电信什么宣传页面一样。

6.2 DNS域名解析是用UDP还是TCP

首先,DNS占用53号端口,同时使用TCP和UDP协议。那么DNS在什么情况下使用这两种协议?

简单来说,DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。

DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,叫做区传送(zone transfer)。也可以说,DNS区域传送,就是DNS主从复制的实现方法,DNS主从复制是DNS区域传送的表现形式。 这种情况下,使用TCP协议。

  • 为什么域名解析用UDP协议?

    客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

  • 为什么区域传送用TCP协议?

    1. 辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。

    2. TCP是一种可靠连接,保证了数据的准确性。

6.3 DNS服务器负载均衡技术

DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。

直到现在,很多网站仍然使用DNS负载均衡来保证网站的运行和可访问性。从其实现和效果来看,主要有以下优缺点:

主要优点

  • 技术实现比较灵活、方便,简单易行,成本低,适用于大多数TCP/IP应用。不需要网络专家来对之进行设定,或在出现问题时对之进行维护。

  • 对于Web应用来说,不需要对代码作任何的修改。事实上,Web应用本身并不会意识到负载均衡配置,即使在它面前。

  • Web服务器可以位于互联网的任意位置上。

主要缺点

DNS负载均衡技术在具有以上优点的时候,其缺点也非常明显,主要表现在:

  • 不能够按照Web服务器的处理能力分配负载。DNS负载均衡采用的是简单的轮循负载算法,不能区分服务器之间的差异,不能反映服务器的当前运行状态。所以DNS服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况。如果后台的Web服务器的配置和处理能力不同,最慢的 Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用。不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。
  • 不支持高可靠性,DNS负载均衡技术没有考虑容错。如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS 请求分配到这台故障服务器上,导致不能响应客户端。
  • 可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
  • 一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。

不过,事实上,目前大多数大型网站是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供服务的物理服务器,而是同样提供负载均衡服务器的内部服务器,这组内部负载均衡服务器再进行负载均衡,把请求发到真实的服务器上,最终完成请求。

6.4 DNS污染

又称为域名服务器缓存污染(DNS cache pollution)或者域名服务器快照侵害(DNS cache poisoning)。 DNS污染是指一些刻意制造或无意中制造出来的域名服务器分组,把域名指往不正确的IP地址。它是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,是一种DNS缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,因此DNS的查询非常容易被篡改,通过对UDP端口53上的DNS查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。DNS污染是发生在用户请求的第一步上,直接从协议上对用户的DNS请求进行干扰。

DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。

目前一些被禁止访问的网站很多就是通过DNS污染来实现的,例如YouTube、Facebook等网站。

还是举个例子易于理解:这招是GFW常用的。你访问google.com 因为人家服务器在国外,你的DNS过去解析,肯定要走国际带宽的出口,然后就被GFW逮住了。因为DNS走的是UDP协议,且UDP又没有什么校验机制,只管发送。所以这时候,GFW就假装成DNS服务器回应你了,而此时真正的请求可能正在被真正的DNS服务器处理,假的已经返回给你了,浏览器就选择了最快返回的那个地址去解析了。当然是一个不可用的地址啦。

6.5 递归查询迭代查询

所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

递归查询是一种DNS服务器的查询模式,在该模式下DNS服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS服务器本地没有存储查询DNS信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。

DNS服务器另外一种查询方式为迭代查询,DNS服务器会向客户机提供其他能够解析查询请求的DNS服务器地址,当客户机发送查询请求时,DNS服务器并不直接回复查询结果,而是告诉客户机另一台DNS服务器地址,客户机再向这台DNS服务器提交请求,依次循环直到返回查询的结果为止。

迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

苏小迪

2021/04/18  阅读:133  主题:橙心

作者介绍

苏小迪