BlackHole開發日誌--防止DNS污染

DNS污染原理

DNS污染是比DNS劫持更加難以防護的一種攻擊,受攻擊者訪問網站時可被導向其餘域名,例如某「不存在的網站」被導向了一個「不存在的IP地址」。html

DNS污染的原理以下:git

DNS查詢也是一個經典的請求-回答模式。首先,客戶端發起DNS查詢,這是一個UDP包。路由器在轉發IP包時,對其內容作解析,若發現其是使用53端口的UDP包,而且其內容符合某些特徵(普通的DNS請求都是明文),則從旁路直接返回一個僞造的應答,將其應答指向某個特定IP。由於這個返回速度很是快,因此先於正常請求到達客戶端。而客戶端收到一個返回包,就認爲獲得了答案,再也不繼續接收,而正確的請求結果就被忽略了!github

dns-cache-poison

通常防止DNS污染有幾種方法:緩存

  • 修改系統hosts文件服務器

    系統的hosts文件能夠配置某個域名對於的IP地址,而且會優先於DNS服務器的響應,因此此方法穩定高效,缺點是host地址須要不斷更新。dom

  • 改用TCP協議而不是DNS協議發送DNS請求工具

    DNS也支持TCP協議傳輸,而TCP協議沒有收到污染,因此能夠改用TCP做爲DNS下層協議。缺點是TCP速度慢,而且DNS服務器支持度有限。表明工具:Tcp-DNS-proxy https://github.com/henices/Tcp-DNS-proxy網站

  • 使用IPv6地址發送DNS請求google

    某些站點能夠經過IPv6地址訪問。表明工具:dnsproxycn http://code.google.com/p/dnsproxycn/code

  • 根據污染特徵過濾僞造DNS答案

    先截獲DNS污染結果,而後分析其特徵,而後將判斷爲污染的DNS包過濾掉。表明工具:AntiDnsPollution http://www.williamlong.info/archives/2184.html

BlackHole解決方案

BlackHole解決方案是第4種:向一個不存在的地址發送DNS查詢,正常狀況下不會有應答;若觸發DNS污染,則只會有僞造包返回。記錄這個僞造包的特徵(通常是A記錄的IP地址),加入黑名單,下次若是收到這些包,則直接過濾。

其實開發BlackHole時不知道有AntiDnsPollution這款工具,完成了才知道,採起的方法不謀而合。只不過BlackHole作的更復雜一點,增長了一些功能:

  • DNS污染黑名單持久化

    全部污染IP都會存入"安裝路徑/blacklist"文件,每次重啓可繼續讀入,也支持手工修改。

  • 可用IP導出host

    BlackHole會對IP地址作可達性判斷(根據ICMP協議請求),存在DNS污染的域名,若正確DNS地址中,同時有可達IP,則會產生一條"IP domain"的DNS記錄到"安裝路徑/safehost"文件中,與hosts文件格式一致,能夠粘貼進去,從而無須再啓動BlackHole。

  • 支持多DNS服務器請求

    BlackHole能夠同時向多個DNS服務器請求,並採用最早返回的正確結果做爲答案返回;同時後臺會繼續接收響應,並根據最終答案中IP地址的可用性進行判斷,去掉不可用的IP。你能夠將BlackHole的轉發DNS配置爲:一個ISP提供的服務器,速度較快;另外一個權威的DNS服務器,結果較可信。對於大多數請求,ISP提供的DNS能夠知足須要,從而下降查找時間。同時若是在公司內網中使用,還能夠將公司內部DNS服務器地址配置進去,這樣能夠保證內部配置的某些DNS的有效性。

  • 支持緩存

    BlackHole使用ehcache做爲緩存,而且能夠持久化,下次啓動時可直接載入上次緩存結果。

  • 可配置

    BlackHole仍是修改hosts文件的替代方案。經過修改"config/zones"能夠自定義DNS攔截規則,支持通配符"*"。

BlackHole的源碼地址:https://github.com/code4craft/blackhole

相關文章
相關標籤/搜索