提及SYN Cookie仍是得從TCP3次握手開始提及,先給出計網的體系結構圖緩存
而後解釋一下SYN,seq,ack,ACK的相關名詞安全
SYN(創建鏈接) ACK(確認後所有爲1) PSH(傳送) FIN(結束) RST(重置) URG(緊急)服務器
產生SYN Flood(一種dos攻擊方式):在創建三次握手的狀況時,第2、三次握手,雙方分別分配緩存和變量供創建鏈接使用,如此在第一次握手時,若是攻擊者不斷髮送TCP SYN包給服務器,那麼就會形成服務器很大的系統開銷進而致使系統不能正常工做cookie
解決方法:(SYN Cookie):就是在服務器端第一次收到客戶端的SYN包時不分配數據區,而是由seq計算一個Cookie值附帶到SYN Ack的初始序列號(在第二次握手的包中)中,下一次(即第三次握手)時若是序列號=初始序列+1(這裏說明一下,第一次客戶端seq是個隨機數,服務器收到後也發送seq隨機數,可是ack倒是客戶端的seq+1值,同理客戶端也是這樣,客戶端的ack是服務器的seq+1),就分配資源. 簡單來講就是發送給客戶端,返回消息檢查後才分配資源,而以前是一來就分配好了函數
細化SYN Cookie實現過程:spa
1 實現的關鍵在於cookie的計算,cookie的計算應該包含本次鏈接的狀態信息,使攻擊者不能僞造。 2 3 4 cookie的計算: 5 6 7 服務器收到一個SYN包,計算一個消息摘要mac。 8 9 10 mac = MAC(A, k); 11 12 13 MAC是密碼學中的一個消息認證碼函數,也就是知足某種安全性質的帶密鑰的hash函數,它可以提供cookie計算中須要的安全性。 14 15 16 在Linux實現中,MAC函數爲SHA1。 17 18 19 A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND 20 21 22 k爲服務器獨有的密鑰,其實是一組隨機數。 23 24 25 t爲系統啓動時間,每60秒加1。 26 27 28 MSSIND爲MSS對應的索引。