syn flood是一種常見的DOS(denial of service拒絕服務)和Ddos(distributed denial of serivce 分布式拒絕服務)攻擊方式。這是一種使用TCP協議缺陷,發送大量的偽造的TCP連接請求,使得被攻擊方cpu或內存資源耗盡,最終導致被攻擊方無法提供正常的服務。
要明白這種攻擊原理,還要從TCP連接的建立說起:
大家都知道,TCP和UDP不同,它提供一種基於連接的,可靠的字節流服務。想要通信的雙方,都要首先建立一條TCP連接。這條連接的兩端只有通信的雙方。TCP連接的建立是這樣的:
首先,請求端(發送端)會發一個帶有SYN標志位的報文,該報文中含有發送端的初始序號ISN(initinal sequence number)和發送端使用的端口號,該報文就是請求建立連接,
其次,服務器收到這個請求報文后,就會回一個SYN+ACK的報文,同時這個報文中也包含服務器的ISN以及對請求端的確認序號,這個確認序號的值是請求端的序號值+1,表示請求端的請求被接受,
最后,請求端收到這個報文后,就會回應給服務器一個ACK報文,到此一個TCP連接就建立了。
上面也就是典型的TCP三次握手過程(Three-way Handshake)。問題就是在這最后一次的確認里,如果請求端由於某種異常(死機或掉線),服務器沒有收到請求端發送的回應ACK。那么第三次握手沒有完成,服務器就會向請求端再次發送一個SYN+ACK報文,並等待一段時間后丟棄這個未完成的連接。這個時間長度稱為SYN Timeout,一般來說是分鍾的數量級(大約30秒到2分鍾);一個用戶出現異常導致服務器等待一分鍾是沒有什么問題的。如果有惡意攻擊者采用這種方式,控制大量的肉雞來模擬這種情況,服務器端就要去維護一個大量的半連接表而消耗大量的cpu和內存資源。服務器會對這個半連接表進行一個遍歷,然后嘗試發送SYN+ACK來繼續TCP連接的建立。實際上如果客戶的TCP協議棧如果不夠強大,最后的結果是服務器堆棧溢出崩潰。即使服務器端足夠的強大,服務器也會因為忙於處理攻擊者的TCP連接請求而無瑕理會正常的客戶的請求,此時從客戶端來看,服務器就已經失去響應,這時我們稱做服務器遭受了SYN Flood攻擊。