SYN-Flood攻擊:
攻擊者發送大量的SYN給服務器. 服務器必須針對每一個SYN請求回送一個SYN-ACK 應答包,此時服務器就必須保持一條半開放的連接,直到接收到一個對應的ACK應答包為止. 保持如此數目巨大的半開放連接,將會持續消耗掉服務器的資源,直到資源枯竭
什么是SYN-PROXY?
SYNPROXY是一個TCP握手代理,該代理截獲TCP連接建立的請求,它可以保證只有與自己完成整個TCP握手(該握手過程非常輕量級,采用Syncookie機制,不會涉及任何關於socket的邏輯)的連接才被認為是正常的連接,此時才會由代理真正發起與真實服務器的TCP連接
SYN-PROXY作用:
主要用SYN-PROXY來進行防御SYN-Flood 攻擊。
Syncookie機制:
當收到客戶端的SYN請求時,服務器需要回復SYN+ACK包給客戶端,客戶端也要發送確認包給服務器。在SYN cookies中,根據客服端發來的SYN包計算出一個cookie值。這個cookie作為將要返回的SYN ACK包的初始序列號。當客戶端返回一個ACK包時,根據包頭信息計算cookie,與返回的確認序列號(初始序列號 + 1)進行對比,如果相同,則是一個正常連接,否則被認為是SYN-Flood攻擊
關鍵部分是cookie的計算,cookie的計算應該包含本次連接的狀態信息,使攻擊者不能偽造。
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對應的索引。
SYN-PROXY原理:
圖中紅線部分是由代理模擬發出的
上圖流程
- 1: Client 與 Proxy 三次握手
- 2: Proxy 與 Server 三次握手
- 3:Client與Server之間傳輸數據
- 利用 Syn Cookie 原理,實現對非 Syn 包有 Cookie 檢測,不符合Cookie算法數據包直接丟棄
- 只有在 Client 與 Proxy 三次握手之后才會與 Server 連接,實現了對Syn Flood的防御