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会明显不同。

原文地址:https://www.cnblogs.com/zhuri/p/9007479.html

时间: 2024-10-15 10:35:49

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

继上一个坑有一个坑(微信小程序一键登录之无法识别json数据)

前言:  作为一个运维人员不背锅,谁背呢! 正文: 开发人员和前端人员写好了微信小程序,然后坑出现了,安卓上打死不能一键登录.然后开始排查, 开始从数据上着手,不管是使用postman进行模拟测试数据,还是通过抓包查看数据,无任何问题,但是就是微信小程序无法判断改数据是json数据. 后来继续测试,打console.log 断点,抛数据出来查看发现 该数据 确实也存在问题,直接使用res.data 使用typeof 查看 确实为字符串,但是使用JSON.parse 却抛的微信小程序 百度都不能百

分享一个用安卓手机就能引导pc安装linux系统办法

1.首先安卓手机下载软件DriveDroid.apk http://pan.baidu.com/s/1qW4pbT6 2.下载linux镜像文件放手机存储卡存储,放到Download/images/下面 3.打开软件会自动读取这个文件夹下面镜像,也可以在软件里面下载需要的镜像文件 4.软件设置usb连接模式 5.然后手机usb通过数据线连接电脑,电脑选择手机引导,便开始进入linux引导安装界面进行安装,我使用的linux deepin2014的镜像使用uefi引导安装,完美进行安装,安装完进行

更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools

作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools 安卓软件开发包更新 确保 你有最新的特性和 增强. 安卓工作室将更新下面的组件: 安卓模拟器 新版本 26.1.2 谷歌仓库新版本 57 安卓7.

自己编写的一个有关安卓应用开发培训PPT

这个是我自己编写的一个有关安卓应用开发培训PPT,适合新手. 在这里下载PPT

星云精准测试对安卓底层驱动代码的测试案例分析

Android原生底层驱动应用面极广,但一直没有很好的办法进行质量追踪.本文借助星云精准测试的高可靠性的测试技术手段,针对Android原生底层驱动进行分析.插桩.编译.采集数据.数据分析等,逐步讲解精准测试是如何实现android原生底层驱动的对接. 在本文中,我们可以清晰地查看到如何进行技术对接的每一步,比如如何使用星云精准测试进行代码插桩.实现测试用例与采集底层驱动运行代码的数据追溯.对最终采集的数据进行一系列分析等. 一.安卓源码精准测试流程概述 经分析android源码的编译主要依靠A

自己根据网上资料做的一个记事本,有些功能还不太完善。

这个记事本主要是在学习javaGUI及其基本知识后,参考网上资料做出.在制作过程中,同时也发现了java中lastIndex()方法存在不能准确删选数据的情况,然后自己进行了修改. 以下是代码部分: package com.Program;import java.awt.*;import java.awt.datatransfer.*; import javax.swing.*;import javax.swing.event.ListSelectionEvent;import javax.sw

xcode创建一个工程的多个taget,便于测试和发布多个版本

背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块,当需要测试B写的代码时,我们需要到B那里去装一遍,如果只有一个target的话,那么A的将会被覆盖 还有些时候,我们需要确定到底是A的问题还是B的代码出了问题,这时候都需要建立一个工程能够编译多个版本出来,下文就介绍怎么在一个工程中编译多个版本 好了,闲话不多少,下面正式开始: 我们建立一个默认的

"iOS push全方位解析(三)【译文】"——一个极简的demo,并测试一下push

这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1. push的概述 2. 生成push证书,生成Provisioning Profile 3. 一个极简的demo,并测试一下push.(本博文) 这里查看原文 一个极简的demo 到目前为止,上面还不是做的还不够让人兴奋,但是那些准备工作还是很有必要的.本教程像你详细展示了如何生成证书,因为每天都会用到证书,而且没有证书push就不好.刚才你刚搞

A Cost-Effective Recommender System for Taxi Drivers(一个针对出租车司机的有效花费的推荐系统)

这是一篇2014KDD,地理位置服务方面的论文. 论文内容: 1)首先,作者提出了一个有价值的问题:给出租车司机推荐能够以最少代价载到客人的路线 2)其次,问题的新颖性是,以前都是推荐分散的点,本论文是推荐路线,可以说提供的位置服务更进一步 3)然后,指出该问题的两个子问题:a)如何计算每条路段的收益b)如何从复杂的路段中找到最优路段 4)接着,对第一个子问题,作者列出了目标函数:对第二个子问题,作者提出了2种方法a)蛮力法b)递归方法:同时作者也针对过载情况,提出了K-top推荐,解决对同一地