SYN Flood 攻擊
SYN Flood 是 DDoS 攻擊的方式之一,這是一種利用TCP協議缺陷,發送大量偽造的TCP連接請求,從而使得被攻擊方資源耗盡(CPU滿負荷或內存不足)的攻擊方式。
要明白這種攻擊的基本原理,還是要從TCP連接建立的過程開始說起:
首先,請求端(客戶端)發送一個包含SYN標志的TCP報文,SYN即同步(Synchronize),同步報文會指明客戶端使用的端口以及TCP連接的初始序號。
第二部,服務器在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgment)。
第三部,客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。
以上的連接過程在TCP協議中稱為三次握手。
問題就出在TCP連接的三次握手中,假設一個用戶向服務器發送了SYN報文后突然死機或掉線,那么服務器在發出SYN+ACK應答報文后是無法收到客戶端的ACK報文的(第三次握手無法完成),這種情況下服務器端一般會不停地重試(再次發送SYN+ACK給客戶端)並等待一段時間后丟棄這個未完成的連接,這段時間的長度我們稱為SYN Timeout(大約為30秒-2分鍾);一個用戶出現異常導致服務器的一個線程等待1分鍾並不是什么很大的問題,但如果有一個惡意的攻擊者發送大量偽造原IP地址的攻擊報文。發送到服務端,服務器將為了維護一個非常大的半連接隊列而消耗非常多的CPU時間和內存。服務器端也將忙於處理攻擊者偽造的TCP連接請求而無暇理睬客戶的正常需求(畢竟客戶端的正常請求比率非常之小),此時從正常客戶的角度看來,服務器失去響應,這種情況我們稱作:服務器端受到了SYN Flood攻擊(SYN 洪水攻擊)。
原理:攻擊者首先偽造地址對服務器發起SYN請求,服務器回應(SYN+ACK)包,而真實的IP會認為,我沒有發送請求,不作回應。服務器沒有收到回應,這樣的話,服務器不知道(SYN+ACK)是否發送成功,默認情況下會重試5次(tcp_syn_retries)。這樣的話,對於服務器的內存,帶寬都有很大的消耗。攻擊者如果處於公網,可以偽造IP的話,對於服務器就很難根據IP來判斷攻擊者,給防護帶來很大的困難。
解決方法:
第一種是縮短SYN Timeout時間;
由於SYN Flood 攻擊的效果取決於服務器上保持的SYN半連接數,這個值=SYN攻擊的頻度 x SYN Timeout ,所以通過縮短從接收到SYN報文到確定這個報文無效並丟棄該連接的時間,例如設置為20秒以下(過低的SYN Timeout 設置可能會影響客戶的正常訪問),可以成倍地降低服務器的負荷。
第二種方法是設置 SYN Cookie;
就是給每一個請求連接的IP地址分配一個Cookie,如果短時間內連續受到某個IP的重復SYN報文,就認定是受到了攻擊。以后從這個IP地址來的包會被丟棄。
可是上述的兩種方法只能對付比較原始的SYN Flood攻擊,縮短SYN Timeout時間僅在對方攻擊頻度不高的情況下生效,SYN Cookie更依賴於對方使用真實的IP地址,如果攻擊者以數萬/秒的速度發送SYN報文,同時利用隨機改寫IP報文中的源地址,以上的方法將毫無用武之地。例如SOCK_RAW 返回的套接字通過適當的設置可以自己完全控制IP頭的內容從而實現IP欺騙。
第三種方法是Syn Cache技術;
這種技術在收到SYN時不急着去分配系統資源,而是先回應一個ACK報文,並在一個專用的HASH表中(Cache)中保存這種半開連接,直到收到正確的ACK報文再去分配系統。
第四種方法是使用硬件防火牆;
SYN Flood攻擊很容易就能被防火牆攔截。
擴展:DDOS攻擊的原理,如何防止DDOS攻擊?
DDOS是英文Distributed Denial of Service 的縮寫,意即“分布式拒絕服務”。
當下主要有2種流行的DDOS攻擊:
1、SYN Flood攻擊:這種攻擊方法是經典最有效的DDOS方法。
2、TCP全連接攻擊
這種攻擊是為了繞過常規防火牆的檢查而設計的,一般情況下,常規防火牆大多具備過濾Land等DOS攻擊的能力,但對於正常的TCP連接時放過的,很多網絡服務程序(如:IIS、Apache等Web服務器)能接受的TCP連接數是有限的,一旦有大量的TCP連接,則會導致網站訪問非常緩慢甚至無法訪問。
TCP全連接攻擊就是通過許多僵屍主機不斷地與受害服務器建立大量的TCP連接,直到服務器的內存等資源被耗盡而被拖垮,從而造成拒絕服務。
這種攻擊的特點是可繞過一般防火牆的防護而達到攻擊目的。
缺點是需要找很多僵屍主機,並且由於僵屍主機的IP是暴露的,因此容易被追蹤。
如何防止呢?
1、限制SYN流量
用戶在路由器上配置SYN的最大流量來限制SYN封包所能占有的最高頻寬,這樣,當出現大量的超過所限定的SYN流量時,說明不是正常的網絡訪問,而是有黑客入侵。
2、定期掃描
定期掃描現有的網絡主節點,清查可能存在的安全漏洞,對新出現的漏洞及時進行清理。
3、在骨干節點配置防火牆
防火牆本山能抵御DDOS攻擊和其他一些攻擊。在發現受到攻擊的時候,可以將攻擊導向一些犧牲主機,這樣可以保護真正的主機不被攻擊。當然導向的這些犧牲主機可以選擇不重要的,或者是Linux以及unix等漏洞少和天生防范攻擊優秀的系統。
4、用足夠的機器承受黑客攻擊
這是一種較為理想的應對策略。如果用戶擁有足夠的容量和足夠的資源給黑客攻擊,在它不斷訪問用戶、奪取用戶資源之時,自己的能量也在逐漸耗失,或許未等用戶被攻死,黑客已無力支招了。不過此方法需要投入的資金比較多,平時大多數設備處於空閑狀態,和目前中小企業網絡實際運行情況不相符。
5、過濾不必要的服務和端口
可以使用Inexpress、Express、Forwarding等工具來過濾不必要的服務和端口,即在路由器上過濾假IP。
Land攻擊
LAND攻擊力用了TCP連接建立的三次握手過程,通過向一個目標主機發送一個用於建立請求連接的TCP SYN報文而實現對目標主機的攻擊。與正常的TCP SYN報文不同的是:LAND攻擊報文的源IP地址和目的IP地址是相同的,都是目標主機的IP地址。這樣目標主機接在收到這個SYN報文后,就會向該報文的源地址發送一個ACK報文,並建立一個TCP連接控制結構,而該報文的源地址就是自己。由於目的IP地址和源IP地址是相同的,都是目標主機的IP地址,因此這個ACK報文就發給目標主機本身。這樣如果攻擊者發送了足夠多的SYN報文,則目標計算機的TCB可能會耗盡,最終不能正常服務。
TCP存在的缺陷有哪些?
1、TCP三次握手可能會出現SYN Flood攻擊。
2、TCP三次握手可能會出現Land攻擊。
3、Connection Flood攻擊。
原理是利用真實的IP地址向服務器發起大量的連接,並且建立連接之后很長時間不釋放並定時發送垃圾數據包給服務器使連接得以長時間保持,占用服務器的資源,造成服務器上殘余連接(WAI-time狀態)過多,效率降低,甚至資源耗盡,無法響應其他客戶所發起的連接。
防范該攻擊主要有如下方法:
1、限制每個源IP的連接數
2、對惡意連接的IP進行封禁
3、主動清除殘余連接