浅谈HttpDNS
阅读原文时间:2023年07月08日阅读:1

  今天了解了腾讯云的HTTPDNS,这里使用腾讯的资料以及网上查阅的资料做个记录。

  对互联网高度依赖的企业,不可避免的需要通过域名来提供互联网服务,而在复杂的互联网环境下,域名被缓存,被劫持导致的业务影响屡见不鲜。HTTPDNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS解析协议,将域名解析请求直接发给权威服务器,从而绕过Local DNS,防止劫持、缓存的风险。本文主要简单介绍了HTTPDNS的基本原理

  传统的基于 UDP 协议的公共 DNS 服务极易发生 DNS 劫持,从而造成安全问题。

首先,我们梳理一下DNS的解析原理。

  • Root 域名:DNS 域名使用时,规定由尾部句号来指定名称位于根或更高级别的域层次结构

  • Top Level 顶级域名:用来指示某个国家、地区或组织使用的名称的类型名称。如 .com

  • Second Level 域名:个人或组织在 Internet 上使用的注册名称。如 linkedkeeper.com

  • Third Level 域名:已注册的二级域名派生的域名。如 misc.linkedkeeper.com

  • DNS解析过程

1. 浏览器中输入 www.linkedkeeper.com,发出解析请求。

2. 本机的域名解析器 resolver 程序查询本地缓存和 host 文件中是否为域名的映射关系,如果有则调用这个 IP 地址映射,完成解析。

3. 如果 hosts 与本地解析器缓存都没有相应的网址映射关系,则本地解析器会向 TCP/IP 参数中设置的首选 DNS 服务器(我们叫它 Local DNS 服务器)发起一个递归的查询请求。

4. 服务器收到查询时,如果要查询的域名由本机负责解析,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由 Local DNS 服务器解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。

5. 如果 Local DNS 服务器本地区域文件与缓存解析都失效,则根据 Local DNS 服务器的设置(是否递归)进行查询,如果未用开启模式,Local DNS 就把请求发至13台 Root DNS。如果用的是递归模式,此 DNS 服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。

6. Root DNS 服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。

7. Local DNS 服务器收到 IP 信息后,将会联系负责 .com 域的这台服务器。

8. 负责 .com 域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com 域的下一级 DNS 服务器地址给本地 DNS 服务器。

9. 当 Local DNS 服务器收到这个地址后,就会找 linkedkeeper.com 域服务器,10、11重复上面的动作,进行查询。

10. 最后 www.linkedkeeper.com 返回需要解析的域名的 IP 地址给 Local DNS 服务器。

11. Local DNS 服务器缓存这个解析结果(同时也会缓存,6、8、10返回的结果)。

12. Local DNS 服务器同时将结果返回给本机域名解析器。

13. 本机缓存解析结果。

14. 本机解析器将结果返回给浏览器。

15. 浏览器通过返回的 IP 地址发起请求。

  • 递归查询和迭代查询

        递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。

        迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:你下一步应当向哪一个域名服务器进行查询。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。

        由此可见,客户端到 Local DNS 服务器,Local DNS 与上级 DNS 服务器之间属于递归查询;DNS 服务器与根 DNS 服务器之前属于迭代查询。

        实际环境中,因为采用递归模式会导致 DNS 服务器流量很大,所以现在大多数的 DNS 都是迭代模式。

  • 传统DNS存在多个隐患

1. 查询路径过长导致业务访问延时,DNS查询时间通常在毫秒级,但是如果存在多个域名需要查询或者网络质量不佳,可能导致时延大量增加。

2. LDNS的缓存时间不规范,域名缓存是为了降低对根服务器的查询压力同时加快相同域名的查询时间而设计,但是LDNS通常由各个网络运营商自己维护,部分运营商会修改域名缓存的时间,导致网站IP更新不及时导致业务影响。

3. LDNS域名解析失败率高,公共的LDNS由于业务量大,再加上DNS是基于UDP协议的非可靠传输,在网络抖动、服务器压力过大时会出现大概率解析失败的情况。

4. 域名劫持。部分运营商会在LDNS劫持域名解析结果,在访问网站过程中插入广告,如果被黑客劫持了LDNS,则会造成更为严重的后果,比如个人信息泄漏、密码获取,进一步造成财产信誉的损失。

5. 根服务器停止服务的风险,域名查询都是从根服务器开始递归,根服务器一旦被攻击或者关闭服务,将导致全球互联网瘫痪。

6. 无法精准调度用户流量。大部分DNS权威服务器都具备智能解析的功能,DNS服务器依据DNS请求的源IP地址判断用户所处的位置和运营商,以此分配离用户最近的访问节点IP给用户。但是DNS服务器上可以看到的都是LDNS的IP,也就意味着如果用户使用其他运营商的LDNS来进行域名解析将无法获取到最佳的访问节点地址。

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

2.1 HttpDNS的工作模式

  HTTPDNS不走传统的DNS解析,而是自己搭建基于HTTP协议的DNS服务器集群,分布多个地点和多地运营商,当客户端需要DNS解析的时候,就通过HTTP协议进行请求这个服务器集群。到就近的地址。

  • * 使用HTTPDNS的,往往是手机应用,需要在手机端嵌入支持HTTPDNS的客户端SDK;

    • 客户端的SDK里动态请求服务端,获取HTTPDNS服务器的IP列表,缓存到本地。随着不断地解析域名,SDK也会在本地缓存DNS域名解析的结果。当手机应用要访问一个地址的时候,首先看是否有本地的缓存,如果有就直接返回。缓存属于手机应用,并非整个运营商来统一。如何更新、何时更新,手机应用的客户端可以和服务器协调来做这件事情;

    • 如果本地没有,就需要请求HTTPDNS的服务器,在本地HTTPDNS服务器的IP列表中,选择一个发出HTTP的请求,会返回一个要访问的网站的IP列表;

        手机客户端自然知道手机在哪个运营商、哪个地址。由于是直接的 HTTP 通信,HTTPDNS服务器能够准确知道这些信息,因而可以做精准的全局负载均衡。

2.2 HttpDNS的缓存设计

  • 传统DNS存在的问题:

解析 DNS 过程复杂,通信次数多,对解析速度造成很大影响。为了加快解析,因而有了缓存,但是这又会产生缓存更新速度不及时的问题。

  • HTTPDNS解决方案:

1. 解析的过程,不需要本地 DNS 服务递归的调用一大圈,一个 HTTP 的请求直接搞定,要实时更新的时候,马上就能起作用;

2. 为了提高解析速度,本地也有缓存,缓存是在客户端 SDK 维护的,过期时间、更新时间,都可以自己控制。

  HTTPDNS缓存设计策略,分为客户端、缓存、数据源三层。

  • * 对于应用架构来讲,就是应用、缓存、数据库。常见的是Tomcat 、Redis、MySQL。
    • 对于HTTPDNS来讲,就是手机客户端、DNS缓存、HTTPDNS服务器

  只要是缓存模式,就需要解决缓存的过期、更新、不一致的问题;

  SDK中的缓存会严格按照缓存过期时间,如果缓存没有命中,或者已经过期,而且客户端不允许使用过期的记录,则会发起一次解析,保障记录是更新的;

  • 同步解析:

    • 直接调用HTTPDNS的接口,返回最新的记录,更新缓存;
    • 优点:实时性好
    • 缺点:如果有多个请求都发现过期的时候,同时会请求HTTPDNS多次;
    • 更新方式:Cache-Aside机制,先读缓存,不命中读数据库,同时写入缓存;

  • 异步解析:

    • 添加一个解析任务到后台,由后台任务调用HTTPDNS的接口;
    • 优点:可以将多个请求都发现过期的情况,合并为一个对于HTTPDNS的请求任务,只执行一次,减少HTTPDNS的压力。同时创建一个任务进行预加载,防止过期之后刷新;
    • 缺点:当前请求拿到过期数据的时候,如果客户端允许使用过期数据,需要冒一次风险。如果过期的数据还能请求,就没问题;如果不能请求,则失败一次,等下次缓存更新后,再请求方能成功;
    • 更新方式:Refresh-Ahead机制,业务仅仅访问缓存,当过期的时候定期刷新;

2.3 HTTPDNS的调度设计

客户端:

客户端中嵌入了SDK,,HTTPDNS服务端可以根据手机是哪个国家、哪个运营商、哪个省,甚至哪个市,选择最佳的服务节点返回;

多个节点还需要考虑虑错误率、请求时间、服务器压力、网络状况等,并非只有地理位置;

客户端还需要具备一定的逃生容错处理能力,例如当出现解析失败的情况下,能回退到传统DNS解析方式进行解析访问;

服务端:

应用可以通过调用HTTPDNS的管理接口,配置不同服务质量的优先级、权重。

  • * HTTPDNS会根据这些策略综合地理位置和线路状况算出一个排序,优先访问当前那些优质的、时延低的IP地址。
    • HTTPDNS通过智能调度之后返回的结果,也会缓存在客户端。为了不让缓存使得调度失真,客户端可以根据不同的移动网络运营商WIFI的SSID来分维度缓存。不同的运营商或者WIFI解析出来的结果会不同。

2.4 HttpDNS解决的主要问题

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

2.5 小结

传统的DNS:解析慢、更新不及时。因为缓存、转发、NAT问题导致客户端误会自己所在的位置和运营商,从而影响流量的调度。

HTTPDNS通过客户端SDK和服务端,通过HTTP直接调用解析DNS的方式,绕过了传统DNS的这些缺点,实现了智能的调度。

  目前,国内有一部分厂商已经提供了这个解析服务,可以直接使用第三方服务。目前,提供 HttpDns 解析服务的有:阿里云,腾讯云,如需要接入,具体翻阅云平台官方文档。