1. 程式人生 > >DNS“遞迴與快取分離”架構評測

DNS“遞迴與快取分離”架構評測

近幾年來,DNS解析服務頻繁受到攻擊。僅以國內為例,2009年5月19日晚21時左右,江蘇、河北、山西、廣西、浙江、天津、內蒙古、黑龍江、廣東等省市出現大範圍網路故障,各地網民均遇到網路不暢通、網頁無法開啟等問題。據工業和資訊化部通訊保障局釋出的公告,確認該事件是由於暴風網站域名解析受到網路攻擊,導致電信運營商的遞迴域名解析伺服器收到大量異常請求而引發擁塞。此後不久又發生了百度域名被劫持事件,2010年1月12日,國內最大的中文搜尋引擎公司百度的域名被解析到非法地址,導致網民無法正常登陸百度網站達8小時。這是百度成立以來最嚴重的訪問故障事件,給該公司造成的直接損失超過700萬元。

在諸多安全事件的背景下,DNS伺服器的效能和安全性受到了空前關注。部分研究人員借鑑了被廣泛採用的Web快取技術,提出了“遞迴與快取分離”的架構解決方案。該方案使用兩臺伺服器來做DNS解析,其中一臺只做DNS遞迴解析,另一臺只做DNS快取查詢。研究人員認為這個方案與Web快取技術一樣,會帶來兩大優點:首先是整體效能的提升,因為DNS解析的兩個過程已經被進行了分解,絕大多數情況下可以從快取中得到結果,只有在必要時才需要遞迴解析,因而提高了效能;二是在受到攻擊時具有更好的安全性,因為DNS攻擊往往是針對遞迴解析的,由於兩臺伺服器各司其職,至少可以保證快取查詢伺服器的安全執行。

從表現上看來,“遞迴與快取分離”架構確實有一定的吸引力,但事實真的如此嗎?我們對這種架構進行了研究測試,得到這樣一個結論:DNS技術與Web快取技術存在本質區分,兩者並不能夠混為一談。儘管“遞迴與快取分離”架構可能會給效能和安全性帶來一定程度的提升,但同時也存在更大的隱患,並不是一個理想的架構。

首先,讓我們來看一看“遞迴與快取分離”架構給效能帶來的影響。據統計,正常應用環境下,超過90%的DNS解析請求在DNS系統穩定執行後是可以快取命中的,只有少量解析請求需要遞迴進行,新架構對效能的提升可能會比較有限。為了驗證這一點,我們做了一個傳統的通用快取架構和“遞迴與快取分離”架構的效能對比測試。測試環境中共有5臺配置相同的伺服器(

[email protected] x 2/8GB記憶體/雙千兆網絡卡),統一連線到一臺千兆乙太網交換機。其中3檯安裝了在國內擁有較大市場份額的IDNS服務軟體,另2臺作為高效能發包機使用。3臺IDNS伺服器中,1臺為通用快取架構,其餘2臺配置為“遞迴與快取分離”的部署架構。(測試拓撲見圖1)

接下來,我們在發包機上通過resperf工具,採用現網的域名日誌分別對通用快取架構和“遞迴與快取分離”架構進行了壓力測試。這個步驟一共進行5次,取最終穩定的QPS(query per second,每秒請求數)值做為結果。最終,通用快取架構的QPS值穩定在20萬,而“遞迴與快取分離”架構的QPS值為20.2萬。我們可以看出,DNS系統執行穩定後,“遞迴與快取分離”架構只會面臨很少量的遞迴請求,因此實際效能與通用快取架構趨於一致,而不是大幅提升。

實際上,“遞迴與快取分離”架構在實際使用中也帶來了更多的安全問題。一方面,遞迴與快取分離帶來了新故障點,它們彼此間又相互影響,使維護監控工作變得複雜。另一方面,由於快取服務是從遞迴服務處取得解析結果,“遞迴與快取分離”架構在遞迴服務受到快取汙染攻擊後會出現汙染放大效應,且不容易被查覺,可能導致更嚴重的安全事件。此外,由於這種架構有著相對特殊的業務模型,快取伺服器受到的壓力通常遠大於遞迴伺服器,因此惡意攻擊者可以採用比快取伺服器小得多的攻擊流量對遞迴伺服器進行攻擊。這是一個相當嚴重的問題,因為它來源於“遞迴與快取分離”架構本身。一些研究者認為採用隱藏遞迴伺服器IP外加訪問控制策略的手段可以防止有針對性的攻擊,但雖然大部分遞迴伺服器的IP地址不會被公開,通過建立一個授權DNS的方式卻可以很容易地得到遞迴伺服器IP,並且如果攻擊者採用了源埠為53的攻擊方式,傳統的訪問控制手段顯然也難以阻擋。

一些研究者還指出,採用“遞迴與快取分離”架構可在DNS系統受到攻擊,當大量遞迴請求產生導致遞迴伺服器崩潰而無力返回解析結果時起到一定的保護作用。理由是快取伺服器的域名在TTL時間內快取,還能夠做有限度的正常解析,從而可以在類似2009年5月19日暴風影音攻擊那樣的情況下起到保護作用。其實,這種正常解析的效果是相對有限的,因為目前大型網站的域名傾向於使用較短的TTL,如百度、谷歌都只有20分鐘。因此,“遞迴與快取分離”架構可能能夠正常解析一段時間,但肯定比較短暫。

還有一些觀點認為,在缺乏專業抗攻擊安全裝置的情況下,使用者可以測試使用不同的DNS系統或不同的功能模組或外掛,利用合理的策略配置,在一定程度上應對攻擊。我們也做了一個測試去驗證這一觀點,利用上一個測試環境,我們移除了一臺伺服器,將其餘4臺分別配置為發包機、壓力機、BIND伺服器及IDNS伺服器。作為開放原始碼的DNS伺服器軟體,BIND已經成為世界範圍內使用最為廣泛的產品,在測試中具有一定的代表性。壓力機使用的是開源的dnsflood攻擊工具,分別針對IDNS伺服器和BIND伺服器進行攻擊。在此前提下,發包機再採用resperf工具及現網域名日誌進行測試,觀察www.baidu.com以及www.google.com的解析情況。(測試拓撲見圖2)

我們在測試中注意到,針對標準的BIND伺服器進行dnsflood攻擊,很快便不能夠解析包括www.baidu.com和www.google.com在內的所有域名;針對IDNS伺服器進行攻擊,可以解析出大部分域名,並能夠正確解析www.baidu.com和www.google.com。這個差異來源於DNS服務系統的設計,根據文件說明,IDNS針對解析佇列進行了一定程度的優化,在擁塞時將採用概率智慧拋棄策略,隨時保證到達的請求有機會獲得解析。而對於百度、谷歌等實際中訪問量較大的常見域名來說,獲得解析結果的機會更大一些,從而在DNS系統受到攻擊時仍然能夠保持訪問相對正常。

事實證明,隨著技術的發展進步,DNS系統對類似暴風影音那一類的拒絕服務攻擊已經可以做到一定程度的防護。使用者在部署時可以通過測試、試用等手段評估更多的軟體解決方案。而目前業界比較關注的DNS“遞迴與快取分離”架構,還存在著較多的安全隱患,選擇時宜慎重。

相關推薦

DNS快取分離架構評測

近幾年來,DNS解析服務頻繁受到攻擊。僅以國內為例,2009年5月19日晚21時左右,江蘇、河北、山西、廣西、浙江、天津、內蒙古、黑龍江、廣東等省市出現大範圍網路故障,各地網民均遇到網路不暢通、網頁無法開啟等問題。據工業和資訊化部通訊保障局釋出的公告,確認該事件是由於暴風網

DNS查詢迭代查詢

DNS遞迴查詢與迭代查詢 summary 一直以來對於DNS查詢的“遞迴”與“迭代”方式感到困惑。一般人就直接跟你說“DNS客戶端向DNS伺服器請求叫遞迴查詢”,“DNS伺服器之間的查詢請求是迭代查詢”,聽了之後根本不知所謂。。。直到我看了《網路作業系統——windows se

Python迭代

1、遞迴與迭代: 遞迴和迭代都是迴圈的一種。簡單地說,遞迴是重複呼叫函式自身實現迴圈。迭代是函式內某段程式碼實現迴圈,而迭代與普通迴圈的區別是:迴圈程式碼中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。 遞迴迴圈中,遇到滿足終止條件的情況時逐層返回來結束。迭代則使用計數器結

演算法分析 分治

1.  Fibonacci數列    無窮數列1,1,2,3,5,8,13,21,34,55,……,稱為Fibonacci數列。它可以遞迴地定義為: 第n個Fibonacci數可遞迴地計算如下: int fibonacci(int n)  

[計算機程式設計C++] Fibonaci數列的演算法實現

本文是對西安交通大學C++慕課第三章程式設計練習的16題的講解。 參考部落格:https://blog.csdn.net/zombie_slicer/article/details/38871799 題目內容: 編寫程式,顯示Fibonaci序列的前n項(從

樹的前、中、後序遍歷演算法()、層序遍歷

二叉樹層次遍歷 非遞迴 void LevelOrder(Tree* T) { if(T == nullptr) return ; queue<Tree *> myqueue; myqueue.push(T); while(!myqueu

斐波那契(

遞迴 long jumpFloor(int number) { if(number <= 0) return 0; else if(number == 1 ) return 1; return jumpFloor(number-1)

二叉樹的映象

//*** 遞迴 **// void MirrorRecursively(TreeNode *pRoot) { if((pRoot == NULL) || (pRoot->left == NULL && pRoot->right == NULL))

斐波那契數列(

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e2+10; ll a[MAXN]; ll F[MAXN]; ll f(ll n) ///遞迴 { if

n的階乘(

#include <bits/stdc++.h> using namespace std; typedef long long ll; ll f(ll n)///遞迴演算法 { if(n==0 || n==1) return 1; else return n * f

資料結構之DFS遍歷鄰接表存圖

學習鄰接表存圖請看:https://blog.csdn.net/HPU_FRDHR/article/details/83957240  DFS (深度優先搜尋)        深度優先搜尋演算法(英語:Depth-First-S

小論c語言

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

揹包問題的演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

迭代的聯絡以及優缺點(以c++為例)

 1.遞迴的定義: 程式直接或間接的呼叫自身的方法。 遞迴演算法的特點:(1) 遞迴就是在過程或函式裡呼叫自身。(2) 在使用遞迴策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。(3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。(4) 在遞迴呼叫

迴圈、棧

遞迴與迴圈的共同點:同一計算被執行多次; 遞迴與棧的共同點:遞迴依靠棧幀來儲存先進後出的計算,棧儲存先進後出的資料;共同點是儲存。   或者可以這麼理解:遞迴解決的是有依賴順序關係的多個問題。   遞迴與棧的關係 因為程式中的棧結構是順序棧,因此,如果遞迴的次數過多,程式中的資

演算法導論 第二章 分治

階乘函式  斐波那契數列 #include <iostream> #include <cstring> #include <algorithm> using namespace std; // 階乘函式 int fact(in

後續遍歷--(java版)

先訪問左右孩子,再訪問根節點。同樣還是採用棧的形式,但是問題是,先訪問左孩子出棧,根節點不能刪除,再訪問右孩子出棧,最後訪問根節點出棧。我們的思路是這樣的: 對於某個節點p:    1)將p壓入棧中,並將p所有的左孩子,全部壓入棧中: while(stk.

函式二分法(python3入門)

1 import sys 2 3 print(sys.getrecursionlimit()) # 查詢遞迴保護限制次數 4 5 # 函式遞迴:在呼叫函式的過程中又 直接或者間接的呼叫該函式本身,稱之為函式的遞迴呼叫 6 7 # 函式遞迴必須滿足: 8 # 1 必須有一個明確的結

牛客網-------迴圈

題目一 :斐波那契數列                                       &nb

二叉樹深度(Depth)```非`

二叉樹 (`Depth`)遞迴 深度優先遍歷 DFS 二叉樹的高度(深度)為二叉樹結點層次的最大值,也可以認為在根節點不為 nullptr 的情況下左右子樹的最大高度 + 1; 先序(後序)遍歷求解二叉樹高度(Depth)的遞迴演算法 演算法描述:深度優先遍歷