HTTPDNS 解析

泄露秘密 提交于 2020-01-15 13:50:59

简介

HTTPDNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到阿里云的HTTPDNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题。
HTTPDNS是面向移动开发者推出的一款域名解析产品,具有域名防劫持、精准调度等特性。开通HTTPDNS服务后,您就可以在管理控制台添加要解析的域名,调用服务API进行域名解析。HTTPDNS是一款递归DNS服务,与权威DNS不同,HTTPDNS并不具备决定解析结果的能力,而是主要负责解析过程的实现。

众所周知,发送HTTP请求后,会通过DNS解析,找到服务器后再响应请求。不过,传统的DNS系统存在很多问题,最常见的就是DNS劫持、平均访问延迟较高、用户连接失败率较高这三个问题。其中最重要的是DNS劫持,因为DNS解析是交给运营商来做的,所以解析结果被运营商劫持插入广告,解析结果不按 TTL 缓存,解析被错误递归(跨地区甚至跨运营商)等问题导致我们不得不去寻找一种可以绕开运营商的办法来做【域名->IP】的映射方式,那就是HttpDNS。

HttpDNS是通过ip直接请求http获取服务器A记录地址,不存在向本地运营商询问domain解析过程,所以从根本避免了劫持问题。同时由于是ip直接访问省掉了一次domain解析过程,可以在一定程度上降低平均访问延迟。HttpDNS和LocalDNS最大的区别在与:前者使用HTTP协议进行域名解析;后者协议运行在UDP协议之上,使用端口号53。

DNS

什么是DNS

网络通讯大部分是基于TCP/IP协议的,而TCP/IP是基于IP寻址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名,而其中的转换工作就需要借助DNS域名解析服务。简单来说,DNS就是提供将主机名和域名转换为IP地址的工作,工作原理如下图。
在这里插入图片描述

DNS工作流程

事实上,DNS是一个应用层协议,他为其他应用层协议提供解析工作,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。具体的工作过程如下:
①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了;
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如http://www.baidu.com/, 并将这个主机名传送给DNS应用的客户端;
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作);
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址;
⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接。

DNS体系架构

可以发现,当应用程序发送网络请求时,会调用DNS的客户机端,并指明需要被转换的主机名。当用户主机的DNS客户端接收到请求后,会向网络中发送一个DNS查询报文。所有DNS请求和回答报文使用的UDP数据报经过端口53发送,经过若干ms到若干s的延时后,用户主机上的DNS客户端接收到一个提供所希望映射的DNS回答报文。因此,从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。但事实上,实现这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器以及定义了DNS服务器与查询主机通信方式的应用层协议组成。并且,全球的根域名服务器只有13个,为什么是13个,而不是更多,请看为何根域名服务器只有13个?

DNS的一种简单的设计模式就是在因特网上只使用一个DNS服务器,该服务器包含所有的映射,在这种集中式的设计中,客户机直接将所有查询请求发往单一的DNS服务器,同时该DNS服务器直接对所有查询客户机做出响应,尽管这种设计方式非常诱人,但他不适用当前的互联网,因为当今的因特网有着数量巨大并且在持续增长的主机,这种集中式设计会有单点故障(嗝屁一个,全球着急),通信容量(上亿台主机发送的查询DNS报文请求,包括但不限于所有的HTTP请求,电子邮件报文服务器,TCP长连接服务),远距离的时间延迟(澳大利亚到纽约的举例),维护开销大(因为所有的主机名-ip映射都要在一个服务站点更新)等问题。

DNS服务器一般分三种,根DNS服务器,顶级DNS服务器,权威DNS服务器,架构图如下。
在这里插入图片描述

  • 根DNS服务器:返回顶级域DNS服务器的IP地址
  • 顶级域DNS服务器:返回权威DNS服务器的IP地址
  • 权威DNS服务器:返回相应主机的IP地址

假设全国有多个数据中心,托管在多个运营商,每个数据中心三个可用区。对象存储通过跨可用区部署,实现高可用性。在每个数据中心中,都至少部署两个内部负载均衡器,内部负载均衡器后面对接多个对象存储的前置服务器。
在这里插入图片描述
在上面的DNS架构体系中,其工作的流程大体如下:

  1. 当一个客户端要访问object.yourcompany.com时,需要将域名转为ip,所以请求本地DNS解析器。
  2. 本地DNS解析器查看是否有本地缓存这个记录,如果有则直接使用
  3. 如果没有,请求本地的DNS服务器。
  4. 本地的DNS服务器一般部署在你的数据中心或所在运营商的网络中,本地DNS服务器需要查看本地是否有缓存,如果有则返回。
  5. 若无,本地DNS需要递归的从根DNS服务器,查到顶级域名服务器,最终查到权威DNS服务器,返回给本地DNS服务器。

DNS缺点

不过,正如文章开头说的,传统的DNS存在很多缺点:
域名缓存问题:本地做一个缓存,直接返回缓存数据。可能会导致全局负载均衡失败,因为上次进行的缓存,不一定是这次离客户最近的地方,可能会绕远路。
域名转发问题:如果是A运营商将解析的请求转发给B运营商,B去权威DNS服务器查询的话,权威服务器会认为你是B运营商的,就返回了B运营商的网站地址,结果每次都会夸运营商。
出口NAT问题:做了网络地址转化后,权威的DNS服务器,没法通过地址来判断客户到底是哪个运营商,极有可能误判运营商,导致跨运营商访问。
域名更新问题:本地DNS服务器是由不同地区,不同运营商独立部署的,对域名解析缓存的处理上,有区别,有的会偷懒忽略解析结果TTL的时间限制,导致服务器没有更新新的ip而是指向旧的ip。
解析延迟:DNS的查询过程需要递归遍历多个DNS服务器,才能获得最终结果。可能会带来一定的延时。

HTTPDNS

简介

HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外,由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确定位客户端地理位置、运营商信息,从而有效改进调度精确性。

正是由于传统的DNS存在诸多的缺点,所以现在稍微有点规模的公司都会自己搭建HTTPDNS服务器。HTTPDNS 的原理很简单,将 DNS 这种容易被劫持的协议,转为使用 HTTP 协议请求 Domain <-> IP 映射。 获得正确 IP 之后,Client 自己组装 HTTP 协议,从而避免 ISP 篡改数据。它的架构图也比较简单,如下图所示。
在这里插入图片描述

解决的问题

使用HttpDns,可以有效解决传统DNS的DNS劫持、访问时间延迟等问题。

  • Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。
  • 平均访问延迟下降:由于是 IP 直接访问省掉了一次 domain 解析过程,通过智能算法排序后找到最快节点进行访问。
  • 用户连接失败率下降:通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。

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 请求即可。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!