詳解Http與Dns劫持污染的技術原理和排查預防

負責過互聯網系統建設和質量保障的基本都會遇到一個問題——劫持,所謂劫持就是把請求通過技術手段引導到指定的服務器代理一遍,通俗點講就是過一遍手,過一遍手可做的文章就大了,可以監聽信息、緩存內容也可以篡改內容,甚至拿到用戶的登陸權限,如果別有用心是可以做很多非法的事情的,其中也有一種合法的代理應用叫CDN加速,CDN的存在可以提高用戶體驗,提升網站的訪問速度,但很多業務其實是不適合代理的,因此強硬的劫持代理可能直接導致系統不可用,或者出現各種異常,所以互聯網服務提供商很忌諱劫持的事情,一旦碰到基本無能爲力,只能在技術上想各種預案來規避。

那麼爲什麼還是很多廠商要不顧風險做這個事兒呢?一個字“利”,簡單說一下劫持後的掙錢方法,最常規的方式有兩種,一是清洗流量加cache掙帶寬費,二是內容篡改加廣告其他靠獲取用戶權限信息掙錢的明顯違法,故很少見。清洗流量一般指將視頻、圖片等靜態資源在網內指定的出口服務器存儲一份,降低出網帶寬賺差價,一些大中小運營商都在幹,本來這個事情對用戶是透明無感的,但由於很多cache廠家技術不行,不該劫持的也劫持了,導致很多請求劫持後無法響應,造成用戶APP或者各種使用異常,有些瀏覽器打着雲加速的旗號其實也是乾的劫持緩存的事兒;加廣告一般指劫持後對內容進行了篡改,追加了廣告代碼,如果是簡單的html頁面,nginx配置一下都是可以實現的,加廣告這種方式相比更是不合規甚至違法的,所以現在劫持的事情很多都是在偷着幹。當然不否認,對運營商而言還是有個爲用戶提速目的的,畢竟很多資源都在聯通、電信上,其他運營商的網內用戶每次請求要跨網,速度太慢,慢了用戶就要流失。

劫持和引導的方式有很多,但不外乎5類,1是網內直接給用戶分配自建私有的LocalDns地址,域名解析不走根域走自定義,2是通過forword方式將特定域名引導至私有自建Dns解析,同樣不走根域走自定義,3是cname引導,通常作爲cdn的接入方式,4是透明代理,將設備作爲路由器的一跳串聯到網絡傳輸中,5是劫持污染,又分爲Http劫持和DNS劫持(污染),劫持和污染在操作上一般會在入口鏈路上使用分光設備將流量複製一份,複製後的流量使用流量分析設備進行分析,將符合條件的域名或者請求進行處理,達到重新引導流量的目的。

對於1、2、3的方式基本是通過正常的方式配置引導,技術上不做解說,着重講一下4、5。

1、DNS劫持(污染)

DNS一般用的是udp53號端口,udp其中的一個特點是沒有驗證機制,非常容易僞裝,當系統將DNS查詢請求發出後,系統會接受第一個返回的結果作爲使用,其後的將會被拋棄,劫持污染就是利用了udp的這種特性。

在操作上,將劫持設備放在網內(運營商內部),更靠近網民,同時監聽分光流量的DNS查詢請求,當分析到符合要求的域名後(一般爲預先設置的一份白名單),搶先僞裝一個DNS查詢結果回覆給用戶,由於不論是時延還是鏈路質量,網內的要比網間的快太多好太多,所以用戶肯定會第一個收到劫持設備的DNS回覆,將其後出網查詢到的結果拋棄,所以就達到了劫持的目的,這時候請求就被順利的引導到指定的設備上了。

特徵:DNS污染的典型特徵就是解析出來的IP地址非互聯網系統提供的地址。

2、Http請求劫持

Http請求劫持是在http請求階段進行的,此種方式沒有改變Dns的解析,而是通過302/301重定向將請求引導到了指定的設備上,因爲效率比Dns低而且技術上有跨域問題,一般在對時延不敏感的文件下載中使用,技術上同樣利用了網內和網間的時延差做文章,下面看圖詳解一下這個過程。

222.png

根據上圖,我們看一下整個過程,首先是客戶端與源站建鏈發送http請求,與此同時流量分析設備分析到了這個請求,並讀取了請求頭,第2步在讀取http請求並判斷符合劫持規則後,僞裝客戶端向源站發送了reset標記,斷開了客戶端與源站的交互,第3步僞裝原站向客戶端發送重定向302,將請求成功引導到指定設備,第4步是客戶端訪問劫持代理服務器。

因爲重定向時跨域改變了url,這裏面需要設置一套規則,簡單舉個例子,比如說客戶端要下載的是www.aaa.com/123.mp4,指定的cache設備是1.1.1.1,被劫持後會發一個http://1.1.1.1/www.aaa.com/123.mp4的302重定向給客戶端,客戶端收到這個url後再進行拆解代理。

特徵:典型特徵就是重定向,用curl看一下是否將請求重定向就可以了。

3、透明代理

透明代理是將代理設備作爲中間網關串聯到鏈路中去,作爲網關其實說白了代理設備同時要開啓路由轉發,承擔路由器的作用,假設代理設備是個cache,很多大的企事業單位爲了節約流量,會在其出口上安裝一臺這樣的設備,比如說原來需要買兩個G帶寬,在做了透明代理後只需要買1.5個G了,對於用戶而言沒有任何需要操作的,所以叫透明代理,而且比較難分析。

透明代理也有兩種方式,都是基於iptable,一種是基於端口轉發,將目的地址是80的請求,轉發到本地啓用的比如說8080的cache應用上,由cache應用處理後爲客戶提供服務,這種方式的弊端是有可能影響一些服務,因爲80端口過來不一定全是http請求。另外一種是採用tcp旁路監聽代理的方式tproxy,此種方式是非常好的,配置iptable的mangle表的PREROUTING鏈,對tcp的socket的連接打上mark標記,然後新建路由表讓打過標記的tcp通過,監聽目的端口是80的tcp通過tproxy代理至8080的cache應用上,由cache應用處理後爲客戶提供服務。

操作上,服務器要開啓路由轉發、開啓iptable,要安裝代理軟件,然後進行相應的配置,當然在高可用性上要做到對路由的心跳,一旦代理服務器故障,直接跳過代理服務器到下一跳,保證業務的持續性。

特徵:這種方式基本上無法排查,從外部很難找到證據。

4、排查和預防

1)排查

排查的目的是找到證據,說明請求被劫持代理了,常用的方式如下:

  • 【dns篡改】在問題網絡環境dig域名查找A記錄,對比是否是互聯網系統提供的ip地址,如果不是說明Dns解析被篡改了,具體是哪種方式改的,需要繼續排查;

  • 【dns篡改】Dns劫持是基於udp的特性來實現的,所以不使用udp測試就可以繞過劫持,公共的dns服務都是支持tcp的,所以可以用tcp的方式進行驗證,具體命令是 dig  +tcp ,兩個結果做對比;

  • 【dns篡改】如果分析後確定解析被篡改了,dig裏面有個trace的參數,可以詳細查詢到dns的解析過程,幫助我們分析是哪個dns篡改了我們的解析,具體命令是 dig +trace ,很好用;

  • 【http劫持】這個在排查很簡單,只要在問題網絡環境裏curl -I看頭信息是否被重定向了就可以,如果被重定向那就是被劫了;

  • 【透明代理】看解析和url都是沒問題的,但是在某個網絡環境裏就是異常,很有可能是這個原因,廠家代理技術不過硬,沒能正常處理所有請求,這個時候可以拿問題和正常環境下的信息做多方面對比,比如head頭信息,分別在問題和正常環境curl -I對比頭部各字段信息,如果不一致,那麼肯定是在中間某個環節給篡改了;

  • 【工具推薦】有一些在線工具可以輔助我們拿到用戶的信息,一旦遇到小白用戶可以直接用,推薦騰訊華佗、阿里崑崙。

2)預防

說預防的原因是因爲很難根除,只能儘量通過技術手段規避,有些預防的方式如下:

  • 客戶端類的應用可以使用httpdns,httpdns可以在一定程度上防止劫持,但對於https的業務牽涉到domain證書的問題,需要找方案解決;

  • 大廠業務上儘量使用一個主域名,劫持的目的是爲了在不影響用戶功能使用的前提下盈利,大廠服務的主域名用戶量大,在沒有把握的前提下廠商一般不太會動手劫持;

  • 盈利的方式是劫持後資源的緩存或者篡改,如果無法緩存或者篡改,也就沒有了劫持的意義,所以業務儘量使用https證書,證書可以讓劫持本身變的毫無價值,劫持廠商腦袋沒進水是不會去花錢劫持https類業務的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章