SYN Flood是一種非常危險而常見的Dos攻擊方式。到目前為止,能夠有效防范SYN Flood攻擊的手段并不多,SYN Cookie就是其中最著名的一種。
SYN Flood攻擊原理
SYN Flood攻擊是一種典型的拒絕服務(Denial of Service)攻擊。所謂的拒絕服務攻擊就是通過進行攻擊,使受害主機或網絡不能提供良好的服務,從而間接達到攻擊的目的。SYN Flood攻擊利用的是IPv4中TCP協議的三次握手(Three-Way Handshake)過程進行的攻擊。
TCP服務器收到TCP SYN request包時,在發送TCP SYN + ACK包回客戶機前,TCP服務器要先分配好一個數據區專門服務于這個即將形成的TCP連接。一般把收到SYN包而還未收到ACK包時的連接狀態稱為半打開連接(Half-open Connection)。在最常見的SYN Flood攻擊中,攻擊者在短時間內發送大量的TCP SYN包給受害者。受害者(服務器)為每個TCP SYN包分配一個特定的數據區,只要這些SYN包具有不同的源地址(攻擊者很容易偽造)。這將給TCP服務器造成很大的系統負擔,最終導致系統不能正常工作。
SYN Cookie
SYN Cookie是對TCP服務器端的三次握手做一些修改,專門用來防范SYN Flood攻擊的一種手段。它的原理是,在TCP服務器接收到TCP SYN包并返回TCP SYN + ACK包時,不分配一個專門的數據區,而是根據這個SYN包計算出一個cookie值。這個cookie作為將要返回的SYN ACK包的初始序列號。當客戶端返回一個ACK包時,根據包頭信息計算cookie,與返回的確認序列號(初始序列號 + 1)進行對比,如果相同,則是一個正常連接,然后,分配資源,建立連接。實現的關鍵在于cookie的計算,cookie的計算應該包含本次連接的狀態信息,使攻擊者不能偽造。
SYN Cookie算法
服務器收到一個SYN包,計算一個消息摘要mac。
mac = MAC(A, k);
MAC是密碼學中的一個消息認證碼函數,也就是滿足某種安全性質的帶密鑰的hash函數,它能夠提供cookie計算中需要的安全性。
在linux實現中,MAC函數為SHA1。
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
k為服務器獨有的密鑰,實際上是一組隨機數。
t為系統啟動時間,每60秒加1。
MSSIND為MSS對應的索引。