1. 程式人生 > >HttpDNS的坑以及一個針對安卓不太完善的測試方案

HttpDNS的坑以及一個針對安卓不太完善的測試方案

spm 腳本 knowledge 效果 host css {0} session form

背景:單位因為域名劫持(具體表象是某個地區的用戶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的坑以及一個針對安卓不太完善的測試方案