閱讀223 返回首頁    go 阿裏雲 go 技術社區[雲棲]


深入淺出DDoS攻擊防禦——防禦篇

1. 防禦基礎

 

1.1. 攻擊流量到底多大
談到DDoS防禦,首先就是要知道到底遭受了多大的攻擊。這個問題看似簡單,實際上卻有很多不為人知的細節在裏麵。

 

以SYN Flood為例,為了提高發送效率在服務端產生更多的SYN等待隊列,攻擊程序在填充包頭時,IP首部和TCP首部都不填充可選的字段,因此IP首部長度恰好是20字節,TCP首部也是20字節,共40字節。

 

對於以太網來說,最小的包長度數據段必須達到46字節,而攻擊報文隻有40字節,因此,網卡在發送時,會做一些處理,在TCP首部的末尾,填充6個0來滿足最小包的長度要求。這個時候,整個數據包的長度為14字節的以太網頭,20字節的IP頭,20字節的TCP頭,再加上因為最小包長度要求而填充的6個字節的0,一共是60字節。

但這還沒有結束。以太網在傳輸數據時,還有CRC檢驗的要求。網卡會在發送數據之前對數據包進行CRC檢驗,將4字節的CRC值附加到包頭的最後麵。這個時候,數據包長度已不再是40字節,而是變成64字節了,這就是常說的SYN小包攻擊,數據包結構如下:

|14字節以太網頭部|20字節IP頭部|20字節TCP|6字節填充|4字節檢驗||目的MAC|源MAC|協議類型| IP頭 |TCP頭|以太網填充 | CRC檢驗 |

 

到64字節時,SYN數據包已經填充完成,準備開始傳輸了。攻擊數據包很小,遠遠不夠最大傳輸單元(MTU)的1500字節,因此不會被分片。那麼這些數據包就像生產流水線上的罐頭一樣,一個包連著一個包緊密地擠在一起傳輸嗎?事實上不是這樣的。

 

以太網在傳輸時,還有前導碼(preamble)和幀間距(inter-frame gap)。其中前導碼占8字節(byte),即64比特位。前導碼前麵的7字節都是10101010,1和0間隔而成。但第八個字節就變成了10101011,當主機監測到連續的兩個1時,就知道後麵開始是數據了。在網絡傳輸時,數據的結構如下:

|8字節前導碼|6字節目的MAC地址|6字節源MAC地址|2字節上層協議類型|20字節IP頭|20字節TCP頭|6字節以太網填充|4字節CRC檢驗|12字節幀間距|

 

有了上麵的基礎,現在可以開始計算攻擊流量和網絡設備的線速問題了。當隻填充IP頭和TCP頭的最小SYN包跑在以太網絡上時,100Mbit的網絡,能支持的最大PPS(Packet Per Second)是100×106 / (8 * (64+8+12)) = 148809,1000Mbit的網絡,能支持的最大PPS是1488090。

 

 

1.2. SYN Flood防禦
前文描述過,SYN Flood攻擊大量消耗服務器的CPU、內存資源,並占滿SYN等待隊列。相應的,我們修改內核參數即可有效緩解。主要參數如下:

net.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_synack_retries = 2

分別為啟用SYN Cookie、設置SYN最大隊列長度以及設置SYN+ACK最大重試次數。

 

SYN Cookie的作用是緩解服務器資源壓力。啟用之前,服務器在接到SYN數據包後,立即分配存儲空間,並隨機化一個數字作為SYN號發送SYN+ACK數據包。然後保存連接的狀態信息等待客戶端確認。啟用SYN Cookie之後,服務器不再分配存儲空間,而且通過基於時間種子的隨機數算法設置一個SYN號,替代完全隨機的SYN號。發送完SYN+ACK確認報文之後,清空資源不保存任何狀態信息。直到服務器接到客戶端的最終ACK包,通過Cookie檢驗算法鑒定是否與發出去的SYN+ACK報文序列號匹配,匹配則通過完成握手,失敗則丟棄。當然,前文的高級攻擊中有SYN混合ACK的攻擊方法,則是對此種防禦方法的反擊,其中優劣由雙方的硬件配置決定

 

tcp_max_syn_backlog則是使用服務器的內存資源,換取更大的等待隊列長度,讓攻擊數據包不至於占滿所有連接而導致正常用戶無法完成握手。net.ipv4.tcp_synack_retries是降低服務器SYN+ACK報文重試次數,盡快釋放等待資源。這三種措施與攻擊的三種危害一一對應,完完全全地對症下藥。但這些措施也是雙刃劍,可能消耗服務器更多的內存資源,甚至影響正常用戶建立TCP連接,需要評估服務器硬件資源和攻擊大小謹慎設置。

 

除了定製TCP/IP協議棧之外,還有一種常見做法是TCP首包丟棄方案,利用TCP協議的重傳機製識別正常用戶和攻擊報文。當防禦設備接到一個IP地址的SYN報文後,簡單比對該IP是否存在於白名單中,存在則轉發到後端。如不存在於白名單中,檢查是否是該IP在一定時間段內的首次SYN報文,不是則檢查是否重傳報文,是重傳則轉發並加入白名單,不是則丟棄並加入黑名單。是首次SYN報文則丟棄並等待一段時間以試圖接受該IP的SYN重傳報文,等待超時則判定為攻擊報文加入黑名單。

 

首包丟棄方案對用戶體驗會略有影響,因為丟棄首包重傳會增大業務的響應時間,有鑒於此發展出了一種更優的TCP Proxy方案。所有的SYN數據報文由清洗設備接受,按照SYN Cookie方案處理。和設備成功建立了TCP三次握手的IP地址被判定為合法用戶加入白名單,由設備偽裝真實客戶端IP地址再與真實服務器完成三次握手,隨後轉發數據。而指定時間內沒有和設備完成三次握手的IP地址,被判定為惡意IP地址屏蔽一定時間。除了SYN Cookie結合TCP Proxy外,清洗設備還具備多種畸形TCP標誌位數據包探測的能力,通過對SYN報文返回非預期應答測試客戶端反應的方式來鑒別正常訪問和惡意行為。

 

清洗設備的硬件具有特殊的網絡處理器芯片和特別優化的操作係統、TCP/IP協議棧,可以處理非常巨大的流量和SYN隊列。

 

1.3. HTTP Flood防禦
HTTP Flood攻擊防禦主要通過緩存的方式進行,盡量由設備的緩存直接返回結果來保護後端業務。大型的互聯網企業,會有龐大的CDN節點緩存內容。

 

當高級攻擊者穿透緩存時,清洗設備會截獲HTTP請求做特殊處理。最簡單的方法就是對源IP的HTTP請求頻率做統計,高於一定頻率的IP地址加入黑名單。這種方法過於簡單,容易帶來誤殺,並且無法屏蔽來自代理服務器的攻擊,因此逐漸廢止,取而代之的是JavaScript跳轉人機識別方案。

 

HTTP Flood是由程序模擬HTTP請求,一般來說不會解析服務端返回數據,更不會解析JS之類代碼。因此當清洗設備截獲到HTTP請求時,返回一段特殊JavaScript代碼,正常用戶的瀏覽器會處理並正常跳轉不影響使用,而攻擊程序會攻擊到空處。

 

1.4. DNS Flood防禦
DNS攻擊防禦也有類似HTTP的防禦手段,第一方案是緩存。其次是重發,可以是直接丟棄DNS報文導致UDP層麵的請求重發,可以是返回特殊響應強製要求客戶端使用TCP協議重發DNS查詢請求。

 

特殊的,對於授權域DNS的保護,設備會在業務正常時期提取收到的DNS域名列表和ISP DNS IP列表備用,在攻擊時,非此列表的請求一律丟棄,大幅降低性能壓力。對於域名,實行同樣的域名白名單機製,非白名單中的域名解析請求,做丟棄處理。

 

1.5. 慢速連接攻擊防禦
Slowloris攻擊防禦比較簡單,主要方案有兩個。

第一個是統計每個TCP連接的時長並計算單位時間內通過的報文數量即可做精確識別。一個TCP連接中,HTTP報文太少和報文太多都是不正常的,過少可能是慢速連接攻擊,過多可能是使用HTTP 1.1協議進行的HTTP Flood攻擊,在一個TCP連接中發送多個HTTP請求。

 

第二個是限製HTTP頭部傳輸的最大許可時間。超過指定時間HTTP Header還沒有傳輸完成,直接判定源IP地址為慢速連接攻擊,中斷連接並加入黑名單。

 

 

2. 企業級防禦
互聯網企業防禦DDoS攻擊,主要還是使用上文的基礎防禦手段, 重點在於使用監控、組織以及流程等東西來保障及時、正確的使用這些手段,並根據攻擊策略的改變而改變。

 

2.1. 異常監控
監控需要具備多層監控、縱深防禦的概念,從骨幹網絡、IDC入口網絡的BPS、PPS、協議分布,負載均衡層的VIP新建連接數、並發連接數、BPS、PPS到主機層的CPU狀態、TCP新建連接數狀態、TCP並發連接數狀態,到業務層的業務處理量、業務連通性等多個點部署監控係統。即使一個監控點失效,其他監控點也能夠及時給出報警信息。多個點的信息結合起來,有助於準確的判斷攻擊目標和攻擊手法。

 

2.2. 流程以及預案、演習
一旦發現異常,立即啟動在虛擬防禦組織中的應急流程。防禦組織需要囊括到足夠全麵的人員,至少包含監控部門、運維部門、網絡部門、安全部門、客服部門、業務部門等,所有人員都需要2-3個備份。流程啟動後,除了人工處理,還應該包含一定的自動處理、半自動處理能力。例如自動化的攻擊分析,確定攻擊類型,自動化、半自動化的防禦策略,在安全人員到位之前,最先發現攻擊的部門可以做一些緩解措施。

 

除了DDoS到來之時的流程等工作之外,更多的工作是在攻擊到來之前。主要包含CDN節點部署、DNS設置、流程演習等。對於企業來說,具備多個CDN節點是DDoS防禦容量的關鍵指標。當一個機房承擔不住海量數據時,可以通過DNS輪詢的方式,把流量引導到多個分布節點,使用防禦設備分頭處理。因此DNS的TTL值需要設置得足夠小,能夠快速切換,每個CDN節點的各種VIP設置也需要準備充分。

 

 

3. 總結
在虛擬化時代,海量用戶的不同業務共處在相同的物理機平台,遭受DDoS攻擊的可能性越來越高。而且一個用戶被攻擊可能牽扯到大量的其他用戶,危害被顯著放大,因此防禦顯得尤為重要。阿裏雲的虛擬化雲計算業務,平均每天遭受約200起DDoS攻擊,最大流量達到接近80Gbit/s,所有這些攻擊都在1分鍾內自動處理完成,讓客戶遠離DDoS的威脅,專心發展業務。

 

總地來說,對DDoS防禦,主要的工作是幕後積累。台上十分鍾,台下十年功,沒有充分的資源準備,沒有足夠的應急演練,沒有豐富的處理經驗,DDoS攻擊將是所有人的噩夢。

最後更新:2017-04-03 12:56:11

  上一篇:go Sql查詢原理與Select執行順序(詳細)
  下一篇:go 【JAVA大數訓練】N!