TCP分三個階段
- 連接建立(三次握手)
- 數據傳輸
- 連接釋放(四次揮手)
TCP工作過程
TCP連接建立階段
- 第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
- 第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
- 第三次握手:Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。
TCP數據傳輸階段
- seq為本次發送的數據中的第一個字節的標號
- ack為希望下一次收到的數據中第一個字節的標號
TCP連接釋放
- 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
- 第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
- 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
- 第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
TCP Flood 攻擊
據統計,有90%的DoS攻擊使用的是TCP協議,而SYN洪泛優勢其中最常見的一種攻擊。下面就以SYN Flood代表TCP Flood對這類攻擊的基本原理進行描述。
安全缺陷
在3次握手進行的過程中,服務器需要保持所有未完成的握手信息(稱為半開連接,即收到了TCP-SYN並發送了SYN-ACK,但第三次握手信息(ACK)未收到的狀態)直到握手完成或超時(不同的系統超時長度的設置不同,一般情況下在75秒左右)以后丟棄該信息。而且,半開連接的數量是有限的,比如很多OS設置為1024個,當服務器的半開連接棧用完,服務器將不再接受其他的連接請求。
攻擊原理
SYN Flood 攻擊就是攻擊者向攻擊目標發送大量偽造的TCP 連接請求報文,即 SYN 包; 而當攻擊目標收到連接請求時,就會在目標的 TCP 協議棧分配資源, 並記錄其信息到半連接隊列中,同時回應 ACK + SYN; 此時, 攻擊者卻不再發送ACK 確認報文以完成第三次握手, 而是將繼續發送大量的SYN 連接請求包。這樣不僅會導致被攻擊者在短時間內需要為大量半連接分配內存資源,還會使得系統對后續到來的SYN 包在自身的半連接隊列中查找是否有此包的握手信息,從而消耗大量 CPU 資源, 最終造成被攻擊者無法向正常用戶提供所需服務。
防御策略
-
基於退讓的防御策略
a)縮短半連接隊列的保持時間。
b)增大半連接隊列的大小。
c)負載均衡策略。
-
基於 TCP 協議棧缺陷的防御策略
a)SYN Cookie 技術
Cookie 機制是服務器收到客戶端的連接請求后, 系統可簡單記錄該連接信息,形式即如源 IP、 源端口、 時間戳的三元組。但並不會為其分配資源, 而是根據這個 SYN 包的相關信息計算生成某一 Cookie 值, 並將其作為 ACK + SYN 包的序列號返回給客戶端。在接到 ACK 報文時, 就可以第一時間驗證報文的三元組信息,如果信息滿足條件則進行 Cookie 驗證, 否則直接丟棄。
b)SYN Cache 技術
該方法通過一個專用的 HASH 表( Cache) 來保存半連接信息,直至收到 ACK 信息才為連接分配系統資源 (TCB) .
c)SYN Proxy 技術
只有在 SYN 代理確認連接的有效性后, 才向內部服務器發起連接請求。所以當攻擊發生時, 攻擊造成的危害就將轉移到至該代理上,借此以保護服務器端。是基於 SYN Cookie 和SYN Cache 的,這也是對 SYN Cookie 的另一種改進。只是需要注意,一旦代理被攻擊破壞, 其保護的服務器也都將無法向外界提供服務,這也成為 SYN Proxy 方法的瓶頸所在。