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會明顯不同。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM