DNS

因特网上的主机,可以使用多种方式标识,比如主机名或IP地址。

  • 一种标识方法就是用它的主机名(hostname),比如·www.baidu.com、www.google.com、gaia.cs.umass.edu等。这方式方便人们记忆和接受,但是这种长度不一、没有规律的字符串路由器并不方便处理。
  • 还有一种方式,就是直接使用定长的、有着清晰层次结构的IP地址,路由器比较热衷于这种方式。

为了折衷这两种方式,我们需要一种能进行主机名到IP地址转换的目录服务。这就是 域名系统(Domain Name System,DNS)的主要任务。

DNS是:

  • 一个由分层的DNS服务器实现的分布式数据库
  • 一个使得主机能够查询分布式数据库的应用层协议

而DNS服务器通常是运行BIND软件的UNIX机器,DNS协议运行在UDP上,使用53号端口,DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP等。其作用则是:将用户提供的主机名解析为IP地址。

DNS的一种简单设计就是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。很明显这种设计是有很大的问题的:

  • 单点故障:如果该DNS服务器崩溃,全世界的网络随之瘫痪

  • 通信容量:单个DNS服务器必须处理所有DNS查询

  • 远距离的集中式数据库:单个DNS服务器必须面对所有用户,距离过远会有严重的时延。

  • 维护:该数据库过于庞大,还需要对新添加的主机频繁更新。

所以,DNS被设计成了一个分布式、层次数据库。

DNS服务器

​ 为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。

​ 域名服务器是提供域名解析的服务器,在有基本的知识下,任何人都可以搭建域名服务器,甚至是根域名服务器,有名的软件有:BIND

​ 目前的DNS服务器大致分为3种类型的DNS服务器:根DNS服务器、顶级域DNS服务器、权威DNS服务器。

根DNS服务器

​ 因特网上有13个根DNS服务器(标号A到M),1个为主根服务器在美国。其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。

​ 这里的个并不是指物理意义上的单个服务器,它是一个逻辑概念,根DNS服务器可以由分布在全球的多个服务器组成,形成一个集群,对外统一为1台逻辑的根DNS服务器(即每个标号下的根DNS服务器的IP地址是一样的)。而实际物理意义上的根DNS服务器,已超过千台https://root-servers.org/ ,这里可以查到所有根DNS服务器的分布。

目前, 中国有19台根DNS服务器,分别位于:

  • 北京:F,I,J,L
  • 杭州:J
  • 澳门:F
  • 香港:A、D、E、F、F、I、J
  • 台北:E、F、F、I、K、L

顶级域(TLD)DNS服务器

​ 这些服务器负责顶级域名如com、org、net、edu和gov,以及所有国家的顶级域名如uk、fr、ca和cn。

权威DNS服务器

​ 在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。一个组织机构的权威DNS服务器收藏了这些DNS记录。

​ 除此之外,还有一种很重要的DNS,成为本地DNS服务器,其严格来说不属于该服务器的层次结构,但它对DNS层次结构是重要的。每个ISP (互联网服务提供商),比如一个大学,一个公司或一个居民区的ISP,都有一台本地DNS服务器。

DNS域名解析

​ 网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。

DNS做什么的?

​ DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

DNS域名称

​ 域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,例如:im.qq.com。完全限定的域名 (FQDN) 唯一地标识在 DNS 分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。 下图显示与主机称为 im 内 qq.com DNS 树的示例。 主机的 FQDN 是 im.qq.com。 DNS 域的名称层次结构。

DNS域名称空间的组织方式

​ 按其功能命名空间中用来描述 DNS 域名称的五个类别的介绍详见下表中,以及与每个名称类型的示例。

DNS 和 Internet 域

​ 互联网域名系统由名称注册机构负责维护分配由组织和国家/地区的顶级域在 Internet 上进行管理。 这些域名按照国际标准 3166。 一些很多现有缩写,保留以供组织中,以及两个字母和三个字母的国家/地区使用的缩写使用下表所示。一些常见的DNS域名称如下图:

资源记录

​ DNS 数据库中包含的资源记录 (RR)。 每个 RR 标识数据库中的特定资源。我们在建立DNS服务器时,经常会用到SOA,NS,A之类的记录,在维护DNS服务器时,会用到MX,CNAME记录。 常见的RR见下图:

所有DNS服务器都存储了资源记录(Resource Record,RR),其提供了主机名到IP的映射。 资源记录是一个包含以下字段的四元组:(Name,Value,Type,TTL)

TTL是该记录的生存时间,决定了资源记录应当从缓存中删除的时间。 Name和Value的值取决于Type(以下涉及的foo,bar均为伪变量):

  • Type = A,则Name是主机名,Value使其对应的IP地址。这也是一个标准的主机名到IP地址的映射。如(replay1.bar.foo.com,145.37.93.126,A)

  • Type = NS,则Name是个域(如foo.com),而Value是个知道如何获取该域中主机IP地址的权威DNS服务器的主机名,如(foo.com,dns.foo.com,NS)

  • Type = CNAME,则Name是别名为Name的主机对应的规范主机名。该记录能够向查询的主机提供一个主机名对应的规范主机名,如(foo.com,replay1.bar.foo.com,CNAME)

  • Type = MX,则Value是个别名为Name的邮件服务器的规范主机名。如(foo.com,main.bar.foo.com,MX)

DNS服务的工作过程

​ 当 DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS 服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。 ● 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 。 ● 指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。 ● DNS域名的指定类别。 ​ 对于DNS 服务器,它始终应指定为 Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如im.qq.com,并且指定的查询类型用于通过该名称搜索地址资源记录。 ​ DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他 DNS 服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归。 ​ 另外,客户机自己也可尝试联系其他的 DNS 服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代,即DNS服务器之间的交互查询就是迭代查询。

DNS查询过程如下图所示:

1、在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。

6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

由此可以看出, 从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

1628330746186

DNS报文

DNS只有查询和回答两种报文,这两种报文格式是一样的。

  • 前12个字节是首部区域。

    标识符用于标识该查询,这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。

    标志字段中含有若干标志。1比特的“查询/回答”标志位指出报文是查询报文(0)还是回答报文(1)。当某DNS服务器是所请求名字的权威DNS服务器时,1比特的“权威的”标志位被置在回答报文中。此外,还有“希望递归”、“递归可用”等标志位。

    在首部中,还有4个数量相关的字段,指出来在首部后的4类数据区域出现的数量,其中RR是资源记录的意思。

  • 问题区域包含着正在进行的查询信息。该区域包括:️名字字段,指出正在被查询的主机名字;️类型字段,指出有关该名字的正被查询的问题类型,即上边说的四元组中的Type

  • 回答区域包含了对最初请求的名字的资源记录。在回答区域中可以包含多条RR,因此一个主机名理论上能够有多个IP地址(不同用户在不同地点访问同一个域名,可能会访问到不同的IP地址)

  • 权威区域中包含了其他权威服务器的记录

  • 附加区域包含了其他有帮助的记录

得知DNS的报文格式后,我们也就可以手动发送DNS查询包了。 一个在线DNS查询的工具:https://tool.lu/dns/index.html

1628400356831

1628400374769

1628400402980

DNS解析安全问题

DNS劫持

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

DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。

解决方法

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

总结

DNS劫持就是指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例,网通、电信、铁通的某些用户有时候会发现自己打算访问一个地址,却被转向了各种推送广告等网站,这就是DNS劫持。

DNS污染

DNS污染(DNS cache pollution)是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,是一种DNS缓存投毒攻击(DNS cache poisoning)。

其工作方式是:由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,因此DNS的查询非常容易被篡改,通过对UDP端口53上的DNS查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。

DNS污染发生在用户请求的第一步上,直接从协议上对用户的DNS请求进行干扰。 DNS污染症状:目前一些被禁止访问的网站很多就是通过DNS污染来实现的,例如YouTube、Facebook等网站。

解决办法

对于DNS污染,可以说,个人用户很难单单靠设置解决,通常可以使用VPN或者域名远程解析的方法解决,但这大多需要购买付费的VPN或SSH等,也可以通过修改Hosts的方法,手动设置域名正确的IP地址。

验证dns是否被污染

  1. 点“开始”-“运行”-输入CMD,再输入 ipconfig /all ,在下“DNS SERVER”里找到你使用的DNS服务器地址。

    1628397932426

  2. 再输入 nslookup abc.com(你的域名) 你的DNS服务器IP ,来查看是否能解析。

    1628398001781

    1628398138989

  1. 再输入 nslookup abc.com 8.8.8.8 使用Google的DNS服务器验证。

    1628398033693

1628398200485

总结

DNS污染,指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。范例,访问Youtube、Facebook之类网站等出现的状况。

参考资料

https://blog.51cto.com/369369/812889

https://zhuanlan.zhihu.com/p/101908711/

https://blog.csdn.net/u012094456/article/details/102957456