NO IMAGE

    額。。。有好多東西,原來看過,但沒怎麼遇到過,過段時間就記不太清了,雖然還是基本知道原理,但是不是很深入,傷不起啊。。還是寫寫部落格吧。

SYN Flood是當前最流行的DoS(拒絕服務攻擊)與DDoS(Distributed Denial Of Service分散式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,傳送大量偽造的TCP連線請求,使被攻擊方資源耗盡(CPU滿負荷或記憶體不足)的攻擊方式。

    SYN Flood的具體原理是在TCP連線的三次握手中,假設一個使用者向伺服器傳送了SYN報文後突然宕機或掉線,那麼伺服器在發出SYN ACK應答報文後是無法收到客戶端的ACK報文的(第三次握手無法完成),這種情況下伺服器端一般會重試(再次傳送SYN ACK給客戶端)並等待一段時間後丟棄這個未完成的連線。這段時間的長度我們稱為SYN
Timeout,一般來說這個時間是分鐘的數量級(大約為30秒~2分鐘);一個使用者出現異常導致伺服器的一個執行緒等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況(偽造IP地址),伺服器端將為了維護一個非常大的半連線列表而消耗非常多的資源。即使是簡單的儲存並遍歷也會消耗非常多的CPU時間和記憶體,何況還要不斷對這個列表中的IP進行SYN ACK的重試。實際上如果伺服器的TCP/IP棧不夠強大,最後的結果往往是堆疊溢位崩潰—— 即使伺服器端的系統足夠強大,伺服器端也將忙於處理攻擊者偽造的TCP連線請求而無暇理睬客戶的正常請求(畢竟客戶端的正常請求比率非常之小),此時從正常客戶的角度看來,伺服器失去響應,這種情況就稱作:伺服器端受到了SYN
Flood攻擊(SYN洪水攻擊)。

    可通過兩種主要方式來避免SYN Flood攻擊:

    1、SYN cookie是建立在TCP堆疊上的,他為linux作業系統提供保護。SYN cookie防火牆是linux的 一大特色,你可以使用一個防火牆來保護你的網路以避免遭受SYN洪水攻擊。在SYN cookies中,伺服器的初始序列號是通過對客戶端IP地址、客戶端端囗、伺服器IP地址和伺服器端囗以及其他一些安全數值等要素進行hash運算,加密得到的,稱之為cookie。在TCP伺服器收到TCP
SYN包並返回TCP SYN ACK包時,不分配一個專門的資料區,而是根據這個SYN包計算出一個cookie值。在收到TCP ACK包時,TCP伺服器在根據那個cookie值檢查這個TCP ACK包的合法性。如果合法,再分配專門的資料區進行處理未來的TCP連線。當伺服器遭受SYN攻擊使得backlog佇列滿時,伺服器並不拒絕新的SYN請求,而是回覆cookie(回覆包的SYN序列號)給客戶端, 如果收到客戶端的ACK包,伺服器將客戶端的ACK序列號減去1得到cookie比較值,並將上述要素進行一次hash運算,看看是否等於此cookie。如果相等,直接完成三次握手。這樣有效避免了SYN
Flood帶來資源消耗上的影響。

    2、SYN cookie防火牆

它是SYN Cookie的一種擴充套件形式。總的來說,它是利用原來SYN Cookie的原理在內網和外網之間實現TCP三次握手過程的代理(proxy)的機制。主要實現步驟如下:

    (1)一個SYN包從Client傳送到Server;

    (2)防火牆在這裡扮演了Server的角色來回應一個帶SYN cookie的SYN-ACK包給Client;
    (3)Client傳送ACK包,接著防火牆和Client的連線就建立了;
    (4)防火牆這個時候扮演Client的角色傳送一個SYN給Server;
    (5)Server返回一個SYN給Client;
    (6)防火牆扮演Client傳送一個ACK確認包給Server,這個時候防火牆和S的連線也就建立了;
    (7)防火牆轉發C和S間的資料。

    以上過程可用下圖表示:

 

如果系統遭受SYN Flood,那麼第三步就不會有,而且無論在防火牆還是S都不會收到相應在第一步的SYN包,所以我們就擊退了這次SYN洪水攻擊。