iOS面试题收纳-网络之DNS

171 阅读7分钟

什么是DNS

  1. 域名系统(DomainNameSystem,缩写:DNS)是一个使得主机能够查询分布式数据库的应用层协议
  2. 一个由分层的DNS服务器实现的将域名和IP地址相互映射的一个分布式数据库
  3. DNS通常是由其他应用层协议所使用的,包括HTTPSMTP等。其作用则是:将用户提供的主机名解析为IP地址
  4. DNS协议运行在UDP上,使用53号端口

DNS服务器

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

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

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

根DNS服务器

因特网上有13个根DNS服务器(标号A到M),这里的个并不是指物理意义上的单个服务器,它是一个逻辑概念,根DNS服务器可以由分布在全球的多个服务器组成,形成一个集群,对外统一为1台逻辑的根DNS服务器

顶级域DNS服务器

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

权威DNS服务器

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

DNS解析过程

递归查询

dns_parse.png

很清晰地显示出了一条DNS查询链:本地DNS服务器-->根DNS服务器-->顶级域DNS服务器-->权威DNS服务器 ,所有查询都是递归的。

迭代查询和递归查询

dns_parse_img.png

这种利用了迭代查询递归查询,从Client与本地DNS之间是递归查询,其余则是迭代查询

总结

  1. 所谓 递归查询过程 就是 “查询的递交者” 更替, 而 迭代查询过程 则是 “查询的递交者”不变。
  2. 在实际过程中,更常用的是图上 从请求主机到本地DNS服务器的查询是递归,其余查询是迭代的

DNS缓存

为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。

在一个请求链中,当某DNS服务器接收一个DNS回答时,它能将该回答中的信息缓存在本地存储器中。

DNS解析过程

dns_parse_flow.png

  1. 发起基于域名的请求后,首先检查本地缓存(浏览器缓存-->操作系统的hosts文件)
  2. 如果本地缓存中有,直接返回目标IP地址,否则将域名解析请求发送给本地DNS服务器
  3. 如果本地DNS服务器中有,直接返回目标IP地址,到这一步基本能解析80%的域名。如果没有,本地DNS服务器将解析请求发送给根DNS服务器
  4. 根DNS服务器会返回给本地DNS服务器一个所查询的TLD服务器地址列表
  5. 本地DNS服务器再向上一步返回的TLD服务器发送请求,TLD服务器查询并返回域名对应的权威域名服务器的地址
  6. 本地DNS服务器再向上一步返回的权威域名服务器发送请求,权威域名服务器会查询存储的域名和IP的映射关系表,将IP连同一个TTL(过期时间)值返回给本地DNS服务器
  7. 本地DNS服务器会将IP和主机名的映射保存起来,保存时间由TTL来控制
  8. 本地DNS服务器把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束

DNS记录和报文

资源记录

所有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,则Value是别名为Name的主机对应的规范主机名。该记录能够向查询的主机提供一个主机名对应的规范主机名,如(foo.com,replay1.bar.foo.com,CNAME)
  • Type = MX,则Value是个别名为Name的邮件服务器的规范主机名。如(foo.com,main.bar.foo.com,MX)

DNS报文

dns_message_structure.png

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

  • 前12个字节是首部区域。 标识符用于标识该查询,这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。 标志字段中含有若干标志。1比特的“查询/回答”标志位指出报文是查询报文(0)还是回答报文(1)。当某DNS服务器是所请求名字的权威DNS服务器时,1比特的“权威的”标志位被置在回答报文中。此外,还有“希望递归”、“递归可用”等标志位。 在首部中,还有4个数量相关的字段,指出来在首部后的4类数据区域出现的数量,其中RR是资源记录的意思。
  • 问题区域包含着正在进行的查询信息。该区域包括:️名字字段,指出正在被查询的主机名字;️类型字段,指出有关该名字的正被查询的问题类型,即上边说的四元组中的Type
  • 回答区域包含了对最初请求的名字的资源记录。在回答区域中可以包含多条RR,因此一个主机名理论上能够有多个IP地址(不同用户在不同地点访问同一个域名,可能会访问到不同的IP地址)
  • 权威区域中包含了其他权威服务器的记录
  • 附加区域包含了其他有帮助的记录

得知DNS的报文格式后,我们也就可以手动发送DNS查询包了。

一个在线DNS查询的工具:tool.lu/dns/index.h…

DNS解析安全问题

DNS劫持

image.png

  1. 一种可能的域名劫持方式即黑客侵入了宽带路由器并对终端用户的本地DNS服务器进行篡改,指向黑客自己伪造的本地DNS服务器,进而通过控制本地DNS服务器的逻辑返回错误的IP信息进行域名劫持。

  2. 另一方面,由于DNS解析主要是基于UDP协议,除了上述攻击行为外,攻击者还可以监听终端用户的域名解析请求,并在本地DNS服务器返回正确结果之前将伪造的DNS解析响应传递给终端用户,进而控制终端用户的域名访问行为。

缓存污染(DNS污染)

  1. 在接收到域名解析请求时,本地DNS服务器首先会查找缓存,如果缓存命中就会直接返回缓存结果,不再进行递归DNS查询。
  2. 这时候如果本地DNS服务器针对部分域名的缓存进行更改,比如将缓存结果指向第三方的广告页,就会导致用户的访问请求被引导到这些广告页地址上。

如何解决DNS劫持

  1. DNS解析发生在HTTP协议之前,DNS解析和DNS劫持和HTTP没有关系
  2. DNS协议使用的是UDP协议向服务器的53端口进行请求。

解决DNS劫持

  • 可以使用HttpDNS的方案:使用 HTTP协议向DNS服务器的80端口进行请求, 来规避DNS劫持 比如:http://119.29.29.29/d?dn=domain&ip=clientIp
  • 在终端上,可以更换DNS服务器,不管手机还是电脑,都能手动配置DNS