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
操作步驟:
- 修改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的坑以及一個針對安卓不太完善的測試方案