域名结构
级别最低的域名写在最左边,而级别最高的字符写在最右边。
- 根域名:www.tungee.com 真正的域名是www.tungee.com.root,所有的域名的根域名都是.root 所以默认都是省掉的
- 顶级域名:比如.com .net
- 次级域名(权限域名),比如www.tungee.com里面的tungee,这级域名用户是可以注册的。
- 主机名:比如www.tungee.com里面的www,又称为"三级域名",这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
主机名.次级域名.顶级域名.根域名
www.tungee.com.root
首先本地DNS服务器向根域名发起请求,
"根域名服务器"查到"顶级域名服务器"的NS记录和A记录(IP地址)
从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录(IP地址)
从"次级域名服务器"查出"主机名"的IP地址
每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。
- 根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
- 根域名服务器目前全球一共只有十三台,已经内置在本地DNS服务器中了
- 顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。
- 权限域名服务器(次级域名):负责一个“区”的域名服务器。比如www.tungee.com里面的tungee,这级域名用户是可以注册的。
- 本地域名服务器:本地服务器不属于上图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
查询大致过程
- 从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址)
- 从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址)
- 从”次级域名服务器”查出”主机名”的IP地址
DNS 协议
- DNS 在大多数情况下主要使用 UDP 协议进行通信
- DNS 查询多数时候对传输的速度和实时性有更高的要求
- DNS 查询通常包含少量数据,可以容纳在单个 UDP 数据包当中(使用最大 512 字节的数据包)
- 在某些情况下,DNS 可能会使用 TCP 协议,例如:
- 当 DNS 响应数据较大,无法容纳在单个 UDP 数据包中时。
- 当使用 DNSSEC(域名系统安全扩展)时,因为其需要验证响应的完整性和签名,可能会导致响应数据较大。
- 当 UDP 查询因某种原因丢失或出错时。
DNS 缓存
- DNS域名查找先在客户端进行递归查询,在任何一步找到就会结束查找流程,而整个过程客户端只发出一次查询请求
- 浏览器缓存:浏览器首先会在自己缓存中查找是否有该域名对应的IP地址
- 系统缓存:当浏览器缓存中无域名对应IP则会自动检查用户计算机系统 Hosts 文件 DNS 缓存是否有该域名对应 IP
- 路由器缓存:当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的 DNS 缓存
- 互联网服务提供商 ( ISP ) DNS 缓存:
- 当在用户客服端查找不到域名对应IP地址,则将进入互联网服务提供商 ( ISP ) DNS缓存中进行查询
- 比如用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找
查询详细过程
-
浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
-
如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
-
如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
-
如果本地域名服务器(LDNS)仍然没有命中,就直接跳到根域名服务器(Root Server) 域名服务器请求解析
-
根域名服务器(Root Server) 返回给本地域名服务器一个所查询域的顶级域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
-
此时本地域名服务器(LDNS)再发送请求给上一步返回的顶级域名服务器(gTLD)
-
接受请求的顶级域名服务器(gTLD)查找并返回这个域名对应的权威域名服务器(Name Server)的地址,这个权威域名服务器(Name Server)就是网站注册的域名服务器
-
得到了权威域名服务器(Name Server)服务器地址之后,Local DNS 再次向权威域名服务器(Name Server)服务器发送请求,权威域名服务器(Name Server)根据映射关系表找到目标ip,返回给本地域名服务器(LDNS)
-
本地域名服务器(LDNS)缓存这个域名和对应的ip,然后该解析器将 IP 地址返回给操作系统,最后操作系统将 IP 地址返回给浏览器。
-
本地域名服务器(LDNS)把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
a)本机向Local DNS请求域名http://www.a.com的解析
b)Local DNS向根域.进行请求,根域.返回com.域的服务器和ip地址
c)向com.域请求http://www.a.com的解析,com.域返回a.com.域的服务器和ip地址
d)向a.com.域请求http://a.com的解析,a.com.域返回http://a.com的ip地址
e)Local DNS返回http://www.a.com的解析记录
DNS优化
-
TTL(生存时间)
-
DNS解析的TTL参数,Time To Live。TTL这个参数告诉本地DNS服务器,域名缓存的最长时间。用阿里云解析来举例,阿里云解析默认的TTL是10分钟,10分钟的含义是,本地DNS服务器对于域名的缓存时间是10分钟,10分钟之后,本地DNS服务器就会删除这条记录,删除之后,如果有用户访问这个域名,就要重复一遍上述复杂的流程。
其实,如果网站已经进入稳定发展的状态,不会轻易更换IP地址,我们完全可以将TTL设置到协议最大值,即24小时。带来的好处是,让域名解析记录能够更长时间的存放在本地DNS服务器中,以加快所有用户的访问。设置成24小时,其实,还解决了Googlebot在全球部署的服务器抓取网站可能带来的问题
阿里云之所以只将TTL设置成10分钟,是为了让域名解析更快生效而已。因为之前的解析会在最长10分钟之后失效(本地DNS服务器将对应的解析条目删除),然后新的解析生效。如果是24小时,这个生效的时间最长就是24小时,甚至更长(本地DNS服务器要有用户请求,才会发起查询)。
-
-
负载均衡
- 在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,通过将不同地域的用户引导到最近的服务器节点来减少网络延迟。此方法还有助于分散负载
DNS劫持、流量劫持
- 本机DNS劫持。攻击者通过某些手段使用户的计算机感染上木马病毒,或者恶意软件之后,恶意修改本地DNS配置,比如修改本地hosts文件,缓存等
- 路由DNS劫持。很多用户默认路由器的默认密码,攻击者可以侵入到路由管理员账号中,修改路由器的默认配置
- 攻击DNS服务器。直接攻击DNS服务器,例如对DNS服务器进行DDOS攻击,可以是DNS服务器宕机,出现异常请求,还可以利用某些手段感染dns服务器的缓存,使给用户返回来的是恶意的ip地址
防止手段:
多域名
- 准备两个以上的域名,一旦黑客进行DNS攻击,用户还可以访问另一个域名
HTTP DNS
- HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外,由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确定位客户端地理位置、运营商信息,从而有效改进调度精确性
工作流程:
- 使用HTTPDNS的,往往是手机应用,需要在手机端嵌入支持HTTPDNS的客户端SDK;
- 客户端的SDK里动态请求服务端,获取HTTP DNS服务器的IP列表,缓存到本地。随着不断地解析域名,SDK也会在本地缓存DNS域名解析的结果。当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。缓存属于手机应用,并非整个运营商来统一。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情;
- 如果本地没有,就需要请求HTTPDNS的服务器,在本地HTTPDNS服务器的IP列表中,选择一个发出HTTP的请求,会返回一个要访问的网站的IP列表;
优点:
- 防止 Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。
- 访问延迟下降:由于是 IP 直接访问省掉了一次 domain 解析过程,通过智能算法排序后找到最快节点进行访问。
- 用户连接失败率下降:通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。
- 快速更换 IP(不受TTL的限制)
DNSSEC
- DNSSEC(Domain Name System Security Extensions): DNSSEC 是为 DNS 查询提供安全性和完整性验证的一种扩展技术。它通过为 DNS 查询每一级别都添加了数字签名添加数字签名来保证数据的完整性和来源的真实性,防止 DNS 缓存污染和其他攻击形式。
DNS over HTTPS
- 对于无法验证来源和完整性的 HTTP DNS 请求和响应数据,攻击者仍有可能篡改内容或劫持流量。
- DNS over HTTPS:DNS over HTTPS (DoH) 是一种将 DNS 查询通过 HTTPS 加密通道发送的方法。它通过使用安全连接保护 DNS 查询的内容,防止网络窃听者截获或篡改 DNS 查询数据。
CSP
- 指定每种资源的 URL 白名单规则,降低插入流量劫持脚本的可能性
利用DNS攻击
- 利用DNS服务器进行DDOS攻击。正常的DNS服务器递归查询过程可能被利用成DDOS攻击。假设攻击者已知被攻击机器的IP地址,然后攻击者使用该地址作为发送解析命令的源地址。这样当使用DNS服务器递归查询后,DNS服务器响应给最初用户,而这个用户正是被攻击者。那么如果攻击者控制了足够多的肉鸡,反复的进行如上操作,那么被攻击者就会受到来自于DNS服务器的响应信息DDOS攻击。攻击者由于没有直接与被攻击主机进行通讯,隐匿了自己行踪,让受害者难以追查原始的攻击。
- DNS缓存感染。攻击者使用DNS请求,将数据放入一个具有漏洞的的DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给用户,从而把用户客户对正常域名的访问引导到入侵者所设置挂马、钓鱼等页面上,或者通过伪造的邮件和其他的server服务获取用户口令信息,导致客户遭遇进一步的侵害。
- DNS重定向。攻击者将DNS名称查询重定向到恶意DNS服务器上,被劫持域名的解析就完全在攻击者的控制之下。