关于httpdns

关于httpdns

背景

在排查视频播放失败的案例中发现,DNS解析失败导致播放失败的占比较高,HTTPDNS可以解决这类问题,所以接入阿里的HTTPDNS。

DNS

https://help.aliyun.com/document_detail/102237.html
http://www.52im.net/thread-2121-1-1.html
https://www.cloudflare.com/zh-cn/learning/dns/dns-server-types/

一次网络请求的过程

  1. www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
  2. 根据这个IP,找到对应的服务器,发起TCP的三次握手
  3. 建立TCP连接后发起HTTP请求
  4. 服务器响应HTTP请求,浏览器得到html代码
  5. 浏览器解析html代码、资源文件,对页面进行渲染呈现给用户
  6. 服务器关闭关闭TCP连接

DNS简介

域名(Domain Name,Domain) 是一个在互联网上标识主机或主机组的名称,相当于 IP 地址的别名,相对于难记的 IP 地址,域名更显得易于记忆。
域名系统(Domain Name System,DNS) 则是将域名解析 IP 地址的一项互联网基础服务,提供该服务的服务器称为 域名服务器(Domain Name Server)

DNS解析过程

image.png

本地域名服务器(Local Name Server,local DNS):local DNS 由互联网服务提供商(ISP,如联通、电信)提供
根域名服务器(Root Name Server):当 local DNS 查询不到解析结果时,第一步会向它进行查询,并获取顶级域名服务器的IP地址。全球一共有 13 个根域名服务器(除了它们的镜像),它们并不直接用于域名解析,仅用于指出可查询的顶级域名服务器。
顶级域名服务器(Top-level Name Server):负责管理在该顶级域名服务器下注册的二级域名,例如:**.com 顶级域名服务器**,而 baidu.com
权威服务器是注册在 .com 的权威域名服务器;
权威域名服务器(Authoritative Name Server):最终决定域名解析结果的服务器,开发者可以在权威DNS上配置、变更、删除具体域名的对应解析结果信息。域名注册服务商(阿里、腾讯等等)

下面以查询www.baidu.com为例,阐述一次 DNS 解析过程:

  • 0、客户端需要向 local DNS 发送查询请求报文
  • 1、客户端local DNS 发送查询报文 query www.baidu.comlocal DNS 首先检查自身缓存,如果存在记录则直接返回结果,查询结束;如果缓存老化或未命中,则:
  • 2、local DNS根域名服务器发送查询报文 query www.baidu.com,返回 .com 顶级域名服务器的地址
  • 3、local DNS.com 顶级域名服务器发送查询报文 query www.baidu.com,返回baidu.com所在的权威域名服务器的地址
  • 4、local DNSbaidu.com 权威域名服务器发送查询报文 query www.baidu.com,得到 ip 地址,存入自身缓存并返回给客户端
    image.png
    image.png

DNS存在的问题

查询延时

从上面可以看到一次完整的 DNS 查询过程需要查询很多次,访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的延时

缓存一致性

一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。为了改善时延,DNS 服务并不是每次请求都要去访问 DNS 服务器,而是访问过一次后将 DNS 记录缓存在本地。具体来说,DNS 服务是一个多级的缓存:
浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> local DNS 缓存 -> DNS 查询

DNS 请求域名服务器时返回应答报文中有个 TTL(Time to Live)值,它决定了 DNS 记录在缓存中的有效时间。单位:秒
dns在线查询

DNS 缓存的存在虽然减少了时延,却是以牺牲一致性(consistency)为代价的。具体来说:Local DNS 是分地区、分运营商的,在域名解析缓存的处理上,实现策略就不统一了。有时候 Local DNS 的解析结果 可能不是最近、最优的节点,有的时候并不会遵从 TTL 的限制,而是设置一个固定时间。这就会导致域名指向新的 IP 地址后,一些客户端依然访问了缓存中 旧的 IP 地址****。

攻击者可以通过 DNS 劫持,利用 DNS 的缓存机制不对应答数据做检查的漏洞,诱骗 DNS 服务器缓存较大 TTL 的虚假 DNS 记录,从而长期欺骗客户端。

DNS劫持(中间人攻击)

你需要知道的“DNS劫持”–web安全篇(1) - 掘金 (juejin.cn)
https://help.aliyun.com/document_detail/62842.htm?spm=a2c4g.435323.0.0.255248d1YSSQxp
由于 DNS 缺乏 加密、认证、完整性保护的安全机制,容易引发网络完全问题。最常见的域名劫持攻击是针对 DNS 报文首部的 事务 ID 进行欺骗,由于事务 ID 在查询报文和应答报文中是匹配的,因此伪装 DNS 服务器可以提前将事务 ID 相同的伪造报文发送到客户端,以实现域名劫持,把目标网站域名解析到错误的 IP 地址。

DNS劫持或DNS污染是一种恶意的网络攻击,其目的是将用户的DNS请求重定向到第三方的站点,从而引导用户进入恶意站点或展示广告等。这种行为通常是由ISP等在网络环节中的中间人所进行,因此称之为中间人攻击。
需要注意的是,有些广告提供商可能会通过向DNS服务器发送虚假的DNS查询请求来模拟用户域名解析的行为,从而将广告注入到用户的DNS访问过程中。因此,在使用DNS服务时,建议使用安全可靠的DNS服务器,如8.8.8.8(Google DNS)、114.114.114.114(114DNS)等。

调度不精准

权威的 DNS 服务器可能会误判客户端所在的位置和运营商,从而导致解析出跨运营商访问的 IP 地址,用户的访问速度降低。
还有是一种是运营商的LocalDNS还存在解析转发的现象。解析转发是指运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归DNS上的行为。

正常的LocalDNS递归解析过程是这样的:
image.png

而部分小运营商为了节省资源,就直接将解析请求转发到了其它运营的递归LocalDNS上去了:
image.png

这样的直接后果就是腾讯权威DNS收到的域名解析请求的来源IP就成了其它运营商的IP,最终导致用户流量被导向了错误的地方,用户访问变慢。

HTTPDNS

https://help.aliyun.com/document_detail/435220.html?spm=a2c4g.435221.0.0.194c29ec4zFiKi
https://www.alibabacloud.com/help/zh/httpdns/latest/resolve-a-domain-name
为什么DNS使用UDP而不是TCP? - 知乎 (zhihu.com)
https://developer.aliyun.com/article/769831

HTTPDNS是面向多端应用(移动端APP,PC端应用)的域名解析服务,使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到HTTPDNS服务端,从而绕过运营商的Local DNS,如下图所示:
image.png

优势

域名防劫持
使用HTTP(HTTPS)协议进行域名解析,域名解析请求直接发送至HTTPDNS服务器,绕过运营商Local DNS,避免域名劫持问题

降低时延
缩短了查询链路,不像 DNS 查询那样需要访问多台 DNS 服务器才能得到最终的结果

调度精准
由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确基于客户端位置、运营商信息,获得最精准的解析结果,让客户端就近接入业务节点
快速生效
域名解析结果变更时,HTTPDNS 服务没有传统DNS 服务多级缓存的影响,域名更新能够更快地覆盖到全量客户端。

项目集成

配置

https://pre-bookadmin.xesvip.cn/platform/generalSettings/configSet?id=8
通过云控配置,自营域名支持httpdns解析,播放器暂不支持,大概2.9支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"is\_need\_save\_local": 1,
"enable": 1,
"business\_data": {
"is\_support\_DNS": "1",
"ip\_update\_duration": "43200",
"hosts": \[
"[bookapp.xueersibook.com](http://bookapp.xueersibook.com/)",
"[pre-bookapp.xueersibook.com](http://pre-bookapp.xueersibook.com/)",
"[test-bookapp.xueersibook.com](http://test-bookapp.xueersibook.com/)",
"[test-cdn-source.xueersibook.com](http://test-cdn-source.xueersibook.com/)",
"[cdn.xueersibook.com](http://cdn.xueersibook.com/)",
"[aliyun-source.xueersibook.com](http://aliyun-source.xueersibook.com/)",
"[private-source.xueersibook.com](http://private-source.xueersibook.com/)",
"[talbook-courseware.xueersibook.com](http://talbook-courseware.xueersibook.com/)"
\],
"is\_ipv4\_only": "1",
"ipv6\_appversion": "4.0.0"
}
}

降级容灾策略

  1. 接口失败:请求阿里云HTTPDNS更新IP,如果还是失败,清除缓存走系统dns
  2. 定时更新:打开APP更新、根据配置的ip_update_duration APP自动更新
  3. 更新云控:通过修改配置文件、关闭开关降级,使用系统 dns

总结

HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外也减少了平均访问的的延迟、降低了用户连接的失败率。后期观察效果好的话,可以推广所有域名使用。

扩展阅读
httpdns对比dns有什么优势,集成httpdns有什么意义    还做了本地缓存,就是0延时

httpdns到底快了多少 httpdns 1毫秒  dns 10毫秒  快了10倍

HTTPDNS服务通常是通过客户端的网络请求获取客户端IP地址的。当客户端发起网络请求时,HTTPDNS服务可以通过提取请求中的IP地址信息来获取客户端IP地址。
具体来说,当客户端向服务器发送网络请求时,请求中通常会包含客户端的IP地址信息。这个信息可能包含在请求头中的”X-Forwarded-For”字段或者”Remote Address”字段中。HTTPDNS服务可以通过解析这些字段来获取客户端IP地址,并根据客户端IP地址来进行精准的域名解析和调度。
需要注意的是,客户端IP地址可能会被代理服务器等中间设备篡改,因此HTTPDNS服务在获取客户端IP地址时需要对异常情况进行处理,以保证获取到的IP地址是正确的。


关于httpdns
http://peiniwan.github.io/2024/04/40b079fc7fe0.html
作者
六月的雨
发布于
2024年4月6日
许可协议