你们好,我的网工朋友,今天和你聊聊DNS。
mac地址诞生,可是太不容易记忆了,出现了简化了IP形式,它被直接暴露给外网不说,还让人类还是觉得比较麻烦,干脆用几个字母算了,也就是域名了。
域名不仅仅能够代替IP,还有很多其他的用途比如在web应用中用来标识虚拟主机。
说了这么多,协议头部,到底有哪些字段,其含义是什么都还不知道,那怎么去分析报文,下面我们一起再看看报文什么样子:
DNS报文基础部分为DNS首部。其中包含了事务ID,标志,问题计数,回答资源计数,回答计数,权威名称服务器计数和附加资源记录数。
基础结构中的标志字段细分如下:
当值为0时,表示没有错误;
当值为1时,表示报文格式错误(Format error),服务器不能理解请求的报文;
当值为2时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;
当值为3时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;
当值为4时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;
当值为5时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
该部分是用来显示DNS查询请求的问题,其中包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。
资源记录部分包含回答问题区域,权威名称服务器区域字段、附加信息区域字段,格式如下:
知道了DNS大概是什么,它的域名结构和报文结构,是时候看看到底怎么解析的以及如何保证域名的解析比较稳定和可靠DNS核心系统。
举个例子,假设我们访问"http://www.google.com"
目前全世界13组根域名服务器还有上百太镜像,但是为了让它能力更强,处理任务效率更高,尽量减少域名解析的压力,通常会加一层"缓存",意思是如果访问过了,就缓存,下一次再访问就直接取出,也就是咱经常配置的"8.8.8.8"等。
操作系统中同样也对DND解析做缓存,比如说曾访问过"http://www.google.com"。
其次,还有我们熟知的hosts文件,当在操作系统中没有命中则会在hosts中寻找。
这样依赖,相当于有了DNS服务器,操作系统的缓存和hosts文件,能就近(缓存)完成解析就好,不用每次都跑到很远的地方去解析,这样大大减轻的DNS服务器的压力。
画了一个图,加深印象。
嗯?想必应该知道这个过程了,我们再举个例子,假设我们访问http://www.qq.com
这里主要分享DNS(GSLB)的全局负载均衡。不是所有的互联网服务都适用于GSLB。
全局负载均衡采用的主要技术是智能DNS,它综合多种不同的策略(比如根据地理位置或者根据繁忙程度的权重)将客户访问的域名解析到不同的线路上。
开启介绍之前,再一次复习下DNS中A记录和NS记录:
A记录是名称解析的重要记录,它用于将特定的主机名映射到对应主机的IP地址上。你可以在DNS服务器中手动创建或通过DNS客户端动态更新来创建
NS记录此记录指定负责此DNS区域的权威名称服务器。
A记录直接给出目的IP,NS记录将DNS解析任务交给特定的服务器,NS记录中记录的IP即为该特定服务器的IP地址。
在全局负载均衡解决方案中,NS记录指向具有智能DNS解析功能的GSLB设备,通过GSLB设备进行A记录解析。
为了保证高可用,如果为多地部署GSLB,则均配置记录。
另外,GSLB设备还会对所在的后端服务器公网IP进行健康检查,其结果通过自有协议在不同的的GLSB设备间同步。
解析的步骤如下图:
智能DNS解析:
使用工具为wireshark,访问http://www.baidu.com:
分析DNS请求帧,如下图所示:
从上图我们可知道请求计数为1,请求的域名为http://dss0.bdstatic.com
分析DNS响应帧:
从响应头可以知道,问题计数为1,正好对应请求帧1个问题。回应了2个问题。分别为:
answers:
从上图可以得出当前共有13个权威域名服务器,当然每一个的服务器地址不同,其中类型为NS代表权威域名服务器服务器。
这一次从浏览器角度回答,相信大家已经了解一部分浏览器知识了,我们先看看URL到网页展示的完整流程是什么样子:
在地址栏输入相应的内容,如果为关键字,如果直接输入搜索内容,浏览器默认引擎会合成为URL,如果符合URL规则,加上协议合成完整URL,回车就会出现加载页面,也就是等待提交文档的阶段
此时浏览器进程将URL通过进程间通信的方式发送给网络进程,开启真正的请求流程。注意了,网络进程这里也有缓存,它会现在本地缓存查看是否缓存了资源,如果有则直接返回。如果没有,那就需要DNS解析获取服务器IP地址(HTTPS还少不了TLS连接)。
此时使用IP和服务器建立三次握手。连接成功开始构造请求头等信息。
服务器收到请求信,根据请求信息生成响应信息给网络进程。然后开始解析响应头内容。
如果返回值为302/301,说明需要跳转到其他URL,如果为200则继续处理该请求。
URL的请求数据类型多种,对于浏览器而言是怎么区分的呢这个时候就必须强调下Content-type了,因为他明确服务器返回响应体数据属于什么类型,此时的浏览器也会根据Content-type对决定响应体是什么内容。
通常情况下,当前多进程架构的浏览器对于每一个页面都有一个渲染进程,前提是如果从X页面打开Y页面,x和y属于同一个"站点"(使用相同的协议和根域名),此时y页面会复用x页面,否则y页面会单独对应一个渲染进程。
渲染进程收到浏览器进程的"提交文档"后,通过和网络进程使用"管道"的方式通信。一旦这些文档数据传输完成,渲染进程就会告诉浏览器进程"确认提交",此时浏览器进程收到"确认提交"就会更新地址栏的URL,历史状态等,这就是为什么当我们在地址栏输入地址信息后需要加载一小会儿到另一个页面。
文档提交以后,此时就需要使用js,css等美化页面,并通过构建DOM树等让用户有更好的使用体验。
到这里我们至少知道了DNS可以将域名映射为IP,并且知道了使用了多种缓存方案来减少DNS访问的压力。
那么DNS一旦出错,很可能将域名解析到其他IP地址,这样我们也就无法正确访问网页(PS是不是有的时候发现开启不了网页但是qq等可以使用,很可能就是DNS搞鬼了)。
什么是DDOS,我们应该知道SYN Flood,是一种DoS(拒绝服务攻击)与DDOS(分布式拒绝服务攻击的方式),利用大量的伪造TCP请求让被攻击方资源榨干。
我们假设攻击者已经知道了攻击者IP(如果需要了解这一部分内容,可以去搜索主动被动信息搜集/sodan等关键字),此时攻击者使用此地址作为解析命令的源地址,当DNS请求的时候返回恰巧也是被攻击者。
此时,如果足够多的请求(群肉鸡)就很容易使网络崩溃。
我们已经知道了在DNS查询过程中,会经过操作系统的缓存,hosts文件等,如果将数据放入有漏洞的服务器缓存中,当进行DNS请求的时候,就会将缓存信息返回给用户,这样用户就会莫名访问入侵者所设置的陷阱页面中。
看到这里的小伙伴,先思考一个问题,在TCP/IP协议栈中,三次握手中的序列号到底什么意思?
其功能之一就是避免伪装数据的插入。
我们知道,如果我们知道DNS报文中的ID,我们就可以知道这个ID请球员位置。作为攻击者,会通过旁路监听客户端和服务端的会话,拿到DNS中的ID,此时相当于在DNS服务器之前拿到ID,伪装DNS服务器回复客户端,引导客户端访问恶意的网站。
电脑小故障:
比如qq可用但是浏览器就是不好使:
方法2:修改路由器password
保护域名/尽量避免攻击
整理:老杨丨10年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部