一、摘要
移动应用出现域名劫持、解析结果修改生效慢、跨运营商跨地域访问问题?阿里云HTTPDNS可以解决这类问题。
二、域名解析阿喀琉斯之踵
域名解析是终端设备访问互联网的第一步,扮演着至关重要的角色。同时,域名解析服务是当前整个互联网基础设施中最脆弱的几个环节之一。移动互联网时代,由于接入智能终端数量激增,问题愈加严重。
案例1: 域名解析问题导致访问流量减半
2017年2月24日21:20-2月25日1:00之间,某App A在江苏省某ISP访问流量减半,排查后发现为递归DNS故障导致。
图1 递归DNS故障导致业务访问受害
如图1所示,正常访问期间,App业务访问大致分为四步:
- Step 1: App发起业务域名解析
- Step 2: 递归DNS返回域名解析结果IP
- Step 3: App根据返回的IP向业务服务器发起请求
- Step 4: 业务服务器返回响应,交互结束。
故障发生时,递归DNS在第二步无法返回解析结果或者返回错误的结果,导致App无法正确获取业务服务器的IP,最终业务访问受到巨大影响。
案例2: 域名解析结果修改不生效导致流量无法迁移
2016年11月中旬,由于某App B访问的节点存在服务质量方面问题,计划通过修改域名解析记录将流量切走,但由于域名解析不生效,导致流量无法调走,最终4个小时后节点服务质量恢复了业务才回归正常。
图2 域名解析不生效的恶果
如图2所示,正常访问期间,App业务访问的细化步骤可以分解成六步:
- Step 1: App发起业务域名解析
- Step 2: 递归DNS向权威DNS发起域名解析结果
- Step 3: 权威DNS返回域名对应的IP给递归DNS
- Step 4: 递归DNS给App返回域名解析结果
- Step 5: App根据返回的IP向业务服务器发起请求
- Step 6: 业务服务器返回响应,交互结束。
故障发生时,尽管权威DNS的解析记录已经修改,但递归DNS的解析结果却没有任何变化(常见原因是递归DNS不遵循返回结果的TTL,私自设置缓存时间),仍然返回之前的结果,导致了故障的发生。
案例3: 不能碰的递归DNS节点
2011年,某公司流量峰值期间,运维人员计划通过修改CDN的智能DNS系统配置将某一地区的部分流量从负载高的CDN节点到相对流量小的CDN节点去。实施过程中,发现某一个DNS IP对应的流量到达5G+,无法实现“调部分流量”的目标。
案例4: 客户端调度不准
客户反馈的服务质量问题往往是由于调度不准确导致的。参见以下案例。
图3 手机DNS配置不准导致跨ISP跨地域访问
根据IP地址来判断,案例中的用户位于武汉联通,而递归DNS却配置成了上海电信的DNS服务器,导致最终调度系统会按照上海电信区域来做就近接入,出现了跨运营商、跨地域访问问题。
三、问题溯源
3.1 域名劫持问题
现网上DNS解析一般基于UDP来实现,由于UDP自身的脆弱性,很容易被劫持。
图4 域名劫持原理
根据多种渠道统计数据,国内现网的周劫持率在3%-5%左右(对于某一个业务,一周之内曾经被劫持过的用户占比),部分地区部分时段的劫持率超过20%。
基于国内严重的流量劫持情况,腾讯、小米等六公司与2015年底联合声明抵制流量劫持等违法行为,但当前的形式仍不容乐观。
域名劫持的危害性在于隐蔽性强、品牌伤害严重、解决难度大。
- 隐蔽性强。 劫持偶发,难以复现,举证难。
- 品牌伤害严重。 劫持后往往弹出涉黄、涉赌等内容,严重伤害应用品牌。
- 解决难度大。 确认域名劫持后,一般开发者没有渠道去解决问题。
3.2 递归DNS数量少且分布不均导致无法就近接入
在国内,递归DNS数量较少且分布不均。据统计,top 200的递归DNS承担国内90%+的DNS访问流量。这样少的递归DNS是无法承载就近接入需求的。
3.3 终端手机的Local DNS配置错误导致无法就近接入
上节的案例4就是典型的递归服务器配置错误导致的就近接入问题。
四、阿里云飞天的解决之道
4.1 小工具大本领:HTTPDNS
- HTTPDNS原理
图5 HTTPDNS服务原理
如图5所示,HTTPDNS与传统的DNS对比起来,有以下几项功能:
- 使用HTTP协议进行域名解析,极大增强了域名解析的安全性
- 绕过了递归DNS服务器,最大限度防止域名劫持的发生
- HTTPDNS服务自身利用IP地址而非域名对外提供服务,防止HTTPDNS自身域名被劫持
- HTTPDNS想权威请求解析结果时,使用客户端IP进行解析
4.2 适用对象
有自己App的开发者,并且需要一定的App编码能力(接入HTTPDNS必须修改App源码)。
4.3 如何使用
五、案例
手机淘宝、支付宝钱包等阿里系App都已经接入HTTPDNS产品,治愈了上面提到的一系列顽疾。
案例中App B尝试接入阿里云飞天HTTPDNS后,在2017年2月24日的故障中,新版本未受任何影响,老版本则遇到了App A类似的问题。