2014年1月21日全國DNS污染始末以及分析
大概1月21日15:30的時候,Ovear正在調試新的服務器,結果發現腫么突然上不去了。。結果ping了以下,結果發現Ovear的域名都指向到[65.49.2.178]這個IP。Ovear***反應就是,DNSPOD又被黑了! 為什么說DNSPOD被黑了呢,其實以前DNSPOD就出過一次類似的問題,導致所有的域名都跪了,剛好Ovear這個域名還有測試的幾個域名都是那里的,然后就到某交流群吐槽。結果管理員說他們的DNS被污染了,Ovear心想不會是全國DNS都被污染了吧。結果烏鴉嘴說中了。還真的是全國劫持。
然后Ovear就很好奇,到底是怎么回事呢~有誰能做到這樣的事情~于是就有了以下的分析和科普~
—————–以下內容為Ovear家電腦中病毒所致,跟本人無任何關系,謝絕跨省————————
balablabala說了這么久,肯定有同學問了,窩又不是學計算機的,dns是什么,跟我有什么關系!
那么DNS是什么呢,Ovear就來科普下。
我們訪問一般是通過域名[Domain]來訪問的,咦DNS怎么也是D開頭的,難道有關系?說對了!就是有關系:DNS的全稱其實是[Domain Name System]翻譯過來就是域名系統。
在互聯網中,是只存在IP的,IP其實就是一串數字,相當于你家里的門牌號,大家在網絡中想找到你,必須通過這個,所以IP對于每個人來說是***的。但是第四代IP都是http://XXX.XXX.XXX.XXX這樣的,多難記啊,誰會沒事記住IP呢,更何況以后天那么長的IPV6,要記住不是得要人命!
這時候一個聰明的科學家出來,我們給IP加一個別名,大家通過別名不就可以不記住這個IP,也可以知道這個IP了!于是就有了域名[Domain]這個東西.
當你訪問Ovear's Blog的時候
電腦的DNS解析系統就會自動問DNS服務器:尼知道Ovear's Blog對應的IP地址是神馬么?
DNS:窩幫你查查,奧,找到了,IP是[122.10.94.169]. Ovear的電腦:謝啦,再見 DNS:恩
對應現實就是,問知道張三的人:尼知道張三家在哪里么? 回答 在南山區 balabalabla。
當然這樣解釋還是不怎么恰當的,因為一個DNS服務器是不可能知道所有域名的地址的,因為這需要耗費極大地代價,所以這時候就出現了遞歸DNS和根DNS。
(由于篇幅原因,Ovear就簡單的說一下,其實還是有問題的。Ovear以后再寫一篇文章詳細闡述下DNS的工作原理,或者看[Domain Name System] QAQ)
(補充:QAQ這里Ovear說的有點過簡單了,其實根DNS(ROOT DNS)指的是全球一共13臺的根DNS,負責記錄各后綴所對應的TOPLEVEL Domain Server[***域名根服務器],然后接下來的就是[權威DNS服務器],就是這個域名用的DNS服務器(可以在whois中看到)
總結一下:
[根服務器]:全球一共13個A-M[.http://root-servers.net],儲存著各個后綴域名的[***域名根服務器] [***域名根服務器]:每個后綴對應的DNS服務器,存儲著該[后綴]所有域名的權威DNS [權威DNS]:這個域名所使用的DNS,比如說我設置的DNSPOD的服務器,權威DNS就是DNSPOD。在WHOIS(一個查看域名信息的東西)中可以看到。儲存著這個域名[對應著的每條信息] 如IP等~
所以正確的解析過程應該跟下面的圖一樣
用戶使用的DNS(邊緣DNS)->(還會網上推很多級最終到)根DNS->***域名根服務器->權威DNS)
根DNS是什么呢?大家想想,每個域名都有一個后綴,比如說ovear是[.info]后綴的。那么就有一個專門記錄[.info]后綴的dns服務器,其他后綴也一樣。這個DNS就是該域名的根DNS。
那么遞歸DNS呢?其實遞歸DNS就是一個代理人,是用來緩解[根DNS]壓力的,如果大家都去問[根DNS],那[根DNS]不早就跪了。畢竟一個人(網站)的地址不是經常變的,所以就有了TTL這一說法,根據DNS的規定,在一個TTL時間呢,大家就認為你家里(域名所指向的IP)的地址是不會變的,所以代理人[遞歸DNS]在這個時間內,是只會問一次[根DNS]的,如果你第二次問他,他就會直接告訴你域名所指向的IP地址。這樣就可以解決[根DNS]負載過大的問題啦。
順便這一張圖也可以很準確反映出來之前所說的~
說了這么久,口水都干了,那么DNS到底跟這次事件有什么關系呢~
首先來看張圖
瓦特!腫么這么多域名都指向同一個IP了,這是什么情況0 0。其實這就是典型的[DNS污染]了。
我們知道互聯網有兩種協議,一種是TCP,一種則是UDP了(知道泥煤啊(╯‵□′)╯︵┻━┻都說我不是學計算機的了)。
TCP和UDP的主要差別就是:能不能保證傳遞信息的可靠性。UDP是不管消息是否到達了目標,也不管通過什么途徑的,他只管我發出去了就好,所以UDP比TCP快得多,但是可靠性沒有TCP好。
而DNS查詢默認就是用的是UDP,那么就很好劫持啦。在UDP包任何傳輸的路途上,直接攔截,然后返回給接收端就行了。
嘖嘖,說道這大家也隱隱約約知道這次事件的問題了吧,范圍如此之廣的劫持,必須要在各個省市的主干網上進行,而能處理這么大數據,同時能控制這么多主干網的。。嘖嘖嘖。。。沒錯!就是***了~至于***是什么,Ovear在這就不說了,不然可能大家都見不到Ovear了QAQ。
說道這里,Ovear就準備手動查一下,到底是不是所推測的***呢?于是拿到了這個圖(From XiaoXin)
與此同時運維也在各地的服務器上開始了跟蹤查詢,發現全國各地解析時間均為25ms左右。這時候結論就出來了。
這樣就明顯了,肯定是***做的了~~于是Ovear又好奇的查了下,這個IP是什么來頭,為什么都要指向到這里去,于是Ovear發現了一些好玩的東西~(65.49.2.0/24)
從側面點出了此次事件的始作俑者。
那么某FW為什么要這么做呢?Ovear在這里做一個無責任的推測,最有可能的就是:某FW的員工本來是想屏蔽這個IP段的,但是呢一不小心點進去了DNS污染這個選項,然后又沒寫污染目標,于是就全局污染了嘖嘖嘖~
但是有些童鞋會問了,為什么他們都說用8.8.8.8就沒事了~
其實這樣子說是不正確的,因為Ovear之前用的就是8.8.8.8,上面也說了DNS查詢默認使用的UDP查詢,所以不管你用什么,照樣劫持不誤。其實8.8.8.8沒問題是因為污染事件已經基本結束導致的,那么為什么污染結束后其他國內DNS都不能用,而Goole的DNS確可以正常的使用~于是Ovear就找到了張有趣的圖片~
我先來解釋下上面命令的用途吧~這個命令是用來直接向DNS服務器查詢域名的~
其中的[-vc]參數是強制使用TCP來查詢DNS服務器,這樣就可以避免UDP污染的地圖炮。
那么為什么污染結束后,DNS還會受到污染呢?其實原因很簡單。Ovear之前說了,[遞歸DNS]是需要詢問[根DNS]的,而默認的詢問方式是采用的UDP,所以在國內的DNS服務器,自然就受到污染了。而之前Ovear也提到過TTL這件事~
在TTL周期內,根據協議[遞歸DNS]是直接吧結果緩存在自己那,是不會再去查詢[根DNS]的,所以國內的DNS就把錯誤的結果緩存起來了~
而Google的DNS服務器基本都是在國外,所以查詢的時候影響并不大,但是國內挺多域名使用DNSPOD啦,DNSLA的DNS,所以Google進國內查,還是會受到一定影響的。
因此,如果要完全避免這次的影響,有兩個條件
1、你的域名的DNS必須是在國外
2、你查詢的DNS必須在國外,而且如果在污染期需要通過TCP查詢。
這樣就可以避免這個問題了。
然后Ovear又手賤查了下這次的TTL,嘖嘖
如果沒有人員來手動干預,這次的事件還是要持續蠻久的~。