HttpDNS的坑以及一个针对安卓不太完善的测试方案

Posted 逐日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpDNS的坑以及一个针对安卓不太完善的测试方案相关的知识,希望对你有一定的参考价值。

 

背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案。

          想法是美好的,现实是残酷的。没引入这个机制还好,引入后问题更多。

 

坑1: 因为DNSPod收费,为了节省费用,我们采用了优先使用本地DNS的策略,服务器出现非200错误码,就切HttpDNS。结果服务器一个接口出现问题,导致大批量流量走HttpDNS。

解决方案:非502和非200返回码才走HttpDNS

坑2:在测试环境测试OK,在正式环境很多用户访问时nginx不能进行负载均衡,返回404页面

原因:现网环境是多个出口ip同一个nginx去负载,反向代理到十几个业务。数据经过某些网关或者代理时,头部的host信息被替换成url中的ip,导致到了nginx没有了域名信息,区分不了业务。

解决方案1:消息头中加入Host的同时,加入X-Online-Host(具体没验证)

解决方案2:代理环境不要走HttpDNS,具体原因可以通过接下来的不太完善测试方案看出问题来

坑3:https证书验证问题

解决方案:参考下文链接:HTTPS(含SNI)业务场景“IP直连”方案说明

 

总体来说:这项技术还不成熟(特别是腾讯的DNSPod文档粗糙简陋),未知的网络问题估计还有不少。

这里先放出阿里上比较完善的一些帮助文档,建议仔细看完后再考虑是否用,怎么用

HTTPDNS iOS、android(安卓)平台:HTTPDNS接入过程中需要注意哪些问题?

https://help.aliyun.com/knowledge_detail/41956.html?spm=5176.11065259.1996646101.searchclickresult.779a5af6PUztAf

HTTPDNS Android SDK开发指南

https://help.aliyun.com/document_detail/30140.html?spm=a2c4g.11174283.6.576.2UQ2EO

HTTPS(含SNI)业务场景“IP直连”方案说明

https://help.aliyun.com/document_detail/30143.html

 

接下来,说下我这个针对安卓不太完善的测试方案:

准备工具:

          1.支持设置手动代理的移动设备一台

          2.在PC机上安装Fiddler工具

          3.已经集成HttpDNS的App

操作步骤:

  1. 修改Fiddler脚本,显示相关的抓包信息

         

 

       

          在Main函数中添加:

          FiddlerObject.UI.lvSessions.AddBoundColumn("TrueServerIP",120,"X-HostIP");
          FiddlerObject.UI.lvSessions.AddBoundColumn("HeaderHost",120,"X-Original-Host");

          其中TrueServerIP标识最终访问服务器采用的Ip,HeaderHost标识App端头信息中指定URL IP地址对应的域名服务

        

         修改完毕后点击保存

       

 

 

         拖动分割栏可以看到新增的列,可以将其拖动到前几列去

       

       

        修改OnBeforeRequest,修复Fiddler清理头文件中Host的问题,在函数尾部加上

       if (oSession.BitFlags & SessionFlags.ProtocolViolationInRequest)
        {
            var sOverride = oSession["X-Original-Host"];
            if (!String.IsNullOrEmpty(sOverride))
            {
                oSession.oRequest["Host"] = sOverride;
                oSession["X-overrideHost"] = sOverride;
                oSession["ui-backcolor"] = "yellow";

                // Be sure to bypass the gateway, otherwise overrideHost doesn\'t work
                oSession.bypassGateway = true;
                // FiddlerApplication.Log.LogFormat("host {0}, {1}", oSession["X-Original-Host"], oSession["X-overrideHost"]);
            }  
        }

        

         保存修改

        2.修改Fiddler Host文件,实现域名劫持

        

        

         配置一个不存在的Ip

        3.设置移动设备网络代理服务器IP为测试PC的ip,端口为8888(默认)

        4.进入集成HttpDNS的App验证相关功能,使用无缓存接口进行测试

        5.查看Fiddler 抓包信息,验证httpDNS效果

       

        如图显示说明走httpDNS成功

       6.第一次切httpDNS效果稍有不同(如果实现方案走的是先采用本地DNS,当出现异常才走httpDNS),抓包数据如下:

        

         第一次请求TureServerIp显示是Host中配置的ip 1.2.3.4 且HeaderHost未显示域名,说明:未走httpDns采用了域名访问;

         访问失败后,app会自动走HttpDns获取到真实ip再请求一次服务器

         此后App将会一直采用Ip直连

         可以对比没用httpDns的和用了httpDns的app,抓包数据HeaderHost和TrueServerIp会明显不同。

 

 

以上是关于HttpDNS的坑以及一个针对安卓不太完善的测试方案的主要内容,如果未能解决你的问题,请参考以下文章

什么是HTTPDNS?HTTPDNS有哪些作用?

实现简单的httpDNS的一种思路

httpdns

安卓自动化测试:Robotiumpage object 模式完善测试框架

解决「 HTTPDNS + HTTPS 」的证书校验问题

Redis Scan的使用方式以及Spring redis的坑