一、什么是DNS
DNS,就是Domain Name System的缩写,翻译过来就是域名系统,是互联网上作为域名和IP地址相互映射的一个分布式数据库。DNS能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析
从www.163.com 到 61.184.215.69的过程就叫做域名解析,域名解析需要由专门的域名解析服务器来完成;
二、DNS域名解析的全过程
1,浏览器发送一个域名(例如www.baidu.com)解析请求,先检查浏览器缓存中有没有对应域名解析的IP地址,如果有直接返回。
2,如果用户浏览器缓存没有查到的话,到操作系统的hosts文件中查找,有对应的域名IP地址的话直接返回。
3,如果本地hosts文件没有查到,会向外网的本地域名服务器(Local DNS)发起查询请求,本地域名服务器收到请求之后,会先查询本地缓存,如果有的话会直接返回。
(本地区域名服务器通常性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的。大约90%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作)
4,如果LDNS缓存没有结果的话,会向根域名服务器发起请求,根域名服务器返回来的是一个根的顶级域名服务器的地址,如.com,.cn、.org等。全球只有13台根域名服务器。
5,本地DNS得到顶级域名服务器的地址后,接着向顶级域名服务器下发请求。顶级域名服务器查找并返回负责此域名的对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
6,本地DNS得到了Name Server 服务器地址之后,Local DNS 再次向Name server 服务器发送请求,Name Server提供商是你申请的域名提供商,因此Name Server域名服务器会查询存储的域名和IP的映射关系表,返回对应的结果。
7,Local DNS 得到了www.baidu.com对应的ip地址与TTL值(Time to live 的缩写,也就是上面的588这个值)之后,会根据这TTL值缓存这个域名与ip的对应关系。
8,最终把该ip地址返回给浏览器
Local DNS --- root DNS --- 顶级DNS -- Name Server SDN
关于DNS解析的TTL参数:
我们在配置DNS解析的时候,有一个参数常常容易忽略,就是DNS解析的TTL参数,Time To Live。TTL这个参数告诉本地DNS服务器,域名缓存的最长时间。用阿里云解析来举例,阿里云解析默认的TTL是10分钟,10分钟的含义是,本地DNS服务器对于域名的缓存时间是10分钟,10分钟之后,本地DNS服务器就会删除这条记录,删除之后,如果有用户访问这个域名,就要重复一遍上述复杂的流程。
其实,如果网站已经进入稳定发展的状态,不会轻易更换IP地址,我们完全可以将TTL设置到协议最大值,即24小时。带来的好处是,让域名解析记录能够更长时间的存放在本地DNS服务器中,以加快所有用户的访问。
阿里云之所以只将TTL设置成10分钟,是为了让域名解析更快生效而已。因为之前的解析会在最长10分钟之后失效(本地DNS服务器将对应的解析条目删除),然后新的解析生效。如果是24小时,这个生效的时间最长就是24小时,甚至更长(本地DNS服务器要有用户请求,才会发起查询)。
三、DNS劫持的方法以及防范
1.DNS劫持的方法
下面大概说几种DNS劫持方法
1.本机DNS劫持
攻击者通过某些手段使用户的计算机感染上病毒之后,恶意修改本地DNS配置,比如修改本地浏览器缓存、系统的hosts文件
2. 路由DNS劫持
攻击者侵入到用户的路由器管理员账号中,修改路由器的DNS配置指向恶意的DNS服务器
3.攻击DNS服务器
攻击本地dns服务器,修改dns服务器的缓存,给用户返回来恶意的ip地址;
对DNS服务器进行DDOS攻击,使DNS服务器宕机并出现异常请求;
2.DNS的防范
1.加强本地计算机病毒检查,防止病毒感染计算机;
2.改变路由器默认密码,防止攻击者修改路由器的DNS配置指向恶意的DNS服务器;
3.企业的话可以准备两个以上的域名,一旦一个域名挂掉,还可以使用另一个;
4.用HTTP DNS 代替 Local DNS
四、HTTP DNS解析
HTTP DNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到自己的HTTP DNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题。
一般发送HTTP请求后,会通过DNS解析,找到服务器后再发送请求。传统的DNS系统存在很多问题,最常见的就是DNS劫持、平均访问延迟较高、用户连接失败率较高这三个问题。其中最重要的是DNS劫持,因为DNS解析是交给运营商来做的,所以DNS解析存在被运营商劫持插入广告、解析结果不按 TTL 缓存、解析被错误递归(跨地区甚至跨运营商)等问题导致我们不得不去寻找一种可以绕开运营商的办法来做域名解析,那就是HttpDNS。
HttpDNS是通过ip直接请求来获取服务器的IP,不存在向本地运营商去查询服务器的IP,所以从根本避免了劫持问题。同时由于是ip直接访问省掉了域名解析过程,可以在一定程度上降低平均访问延迟。HttpDNS和LocalDNS最大的区别在与:前者使用HTTP协议进行域名解析;后者协议运行在UDP协议之上,使用端口号53。
由于 HttpDNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确定位客户端地理位置、运营商信息,从而有效改进调度精确性。
正是由于传统的DNS存在诸多的缺点,所以现在稍微有点规模的公司都会自己搭建HTTPDNS服务器。HTTPDNS 的原理很简单,将 DNS 这种容易被劫持的协议,转为使用 HTTP 协议请求 Domain <-> IP 映射。 获得正确 IP 之后,客户端 自己组装 HTTP 协议,从而避免 运营商 篡改数据。它的架构图也比较简单,如下图所示。
HttpDNS的原理非常简单,主要有两步:
A、客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。(基于容灾考虑,还是保留次选使用运营商LocalDNS解析域名的方式)
B、客户端获取到IP后就直接往此IP发送业务协议请求。以Http请求为例,通过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求即可。
HTTPDNS改造
关于HTTPDNS改造的文章和方案也很多,如下: 【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解 沪江从DNS到httpdns的演进
除了自己搭建外,也可以直接使用第三方服务,国内有一部分厂商已经提供了这种解析服务,如阿里云HttpDNS。 阿里云的 HttpDNS 服务的 API 比较标准,直接发一个 Get 请求,带上请求参数,返回结果以 json 返回,如下所示。
http://203.107.1.1/d?host=www.linkedkeeper.com
请求成功时,返回结果如下所示:
{ "host": "www.linkedkeeper.com", "ips": [ "115.238.23.241", "115.238.23.251" ], "ttl": 57 }
在移动端,将由 HttpDns 获得的 IP 地址在原有 URL 的基础上,将域名替换为 IP,然后用新的 URL 发起 HTTP 请求即可。
参考: