日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SYN攻击原理 accpet()函数调用时机

發布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SYN攻击原理 accpet()函数调用时机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TCP 建立連接

?

SYN 攻擊原理

我們都知道三次握手的第一步是客戶端向服務器發送連接請求,第二步是服務器回應客戶端的請求,第三步是客戶端確認連接。從上圖可以看出,前兩個報文的 SYN 都置為1,說明它們是同步報文段,同步報文段比較特殊,即使它并沒有攜帶任何應用程序數據,它也要占用一個序號值。其實這個問題的答案就在第二步。在第二次握手時,服務器的TCP收到連接請求報文段后,如若同意建立連接,就向客戶端發送確認,并在 OS 內核中為該 TCP 連接分配 TCP 緩存和變量。在確認報文段中,SYN 和 ACK 位都被置為1,確認號字段的值為 x+1(表示希望收到的下一個字節的序號為x+1),并且服務器隨機產生起始序號 seq = y (確認報文不攜帶數據,但也要消耗掉一個序號)。在計算機里的資源就是兩個東西——時間和空間(時間是指處理機的時間,而空間就是硬盤,內存等空間)。這個分配資源的時間很好理解,如若是在第三次握手時才分配資源,那對客戶端請求響應肯定會變慢。了解了這個分配資源的問題后,假如,一個黑客想攻擊一臺服務器,他可以怎么做?首先他偽造地址對服務器發起 SYN 請求,服務器回應 (SYN+ACK) 包,而真正的 IP 并沒有做出相應的請求,當然不會回應。服務器沒有收到回應,這樣的話,服務器會認為(SYN+ACK)丟了,默認情況下會重試 5 次。在這種狀態下,服務器會一直維護剛才所分配的資源,可是這些資源并不能被真正的用戶所利用。在這個過程中,黑客只需要做到浪費服務器的資源,使得服務器無法響應多數客戶端的請求,就能達到攻擊服務器的目的了。這就是 SYN flood 攻擊的原理。

?

三次握手過程中產生序列號的算法

?

我上網查閱了相關資料,就針對 SYN 防御的措施,可以通過以下方式:

(1)無效連接監視釋放:這種方法不停的監視系統中半開連接和不活動的連接,當達到一定閾值時就釋放這些連接,從而回收系統的資源。這種絕對公平的方法往往也會將正常的連接的請求也會被釋放掉。

(2)延緩TCB分配方法:SYN Flood 關鍵是利用了SYN數據報文一到,服務器立即分配 TCB 資源,從而占用了服務器資源。可以用兩種技術來解決這一問題。① Syn Cache 技術:它的思想是在收到 SYN 時不急著去分配 TCB,而是先回應一個 ACK 報文,并在一個專用的 HASH 表中(Cache)中保存這種半開連接,直到收到正確的 ACK 報文再去分配 TCB。②Syn Cookie 技術:完全不使用任何存儲資源,它使用一種特殊的算法生成 Sequence Number,這種算法考慮到了對方的IP、端口、己方 IP、端口的固定信息,以及對方無法知道而己方比較固定的一些信息,如 MSS、時間等,在收到對方 的ACK報文后,重新計算一遍,看其是否與對方回應報文中的(Sequence Number-1)相同,從而決定是否分配TCB資源。

(3)使用SYN Proxy防火墻:其原理是對試圖穿越的 SYN 請求進行驗證之后才放行。


補充內容:

(1) SYN Flood 攻擊

SYN 攻擊就是 Client 在短時間內偽造大量不存在的 IP 地址,并向 Server 不斷地發送 SYN 包,Server 則回復確認包,并等待 Client 確認,由于源地址不存在,因此 Server 需要不斷重發(默認重發5次)直至超時,這些偽造的 SYN 包將長時間占用未連接隊列和消耗CPU 時間和內存,導致正常的 SYN 請求無法被響應,從而引起網絡擁塞甚至系統癱瘓。

解決方法:只有當 SYN +?ACK 報文段本身被確認后(并且已返回初始序列號)才會分配真正的內存。

(2) Land 攻擊

向一個目標主機發送一個用于建立請求連接的 TCP SYN 報文而實現對目標主機的攻擊。與正常的 TCP SYN 報文不同的是:LAND 攻擊報文的源 IP 地址和目的 IP 地址是相同的,都是目標主機的 IP 地址。由于目的 IP 地址和源 IP 地址是相同的,都是目標主機的 IP 地址,因此這個 ACK 報文就發給了目標主機本身。這樣如果攻擊者發送了足夠多的 SYN 報文,則目標計算機的 TCB 可能會耗盡,最終不能正常服務。

(3) connection flood 攻擊

利用真實的 IP 地址向服務器發起大量的連接,并且建立連接之后很長時間不釋放并定時發送垃圾數據包給服務器使連接得以長時間保持,占用服務器的資源,無法響應其他客戶所發起的連接。

解決方法:限制每個源 IP 的連接數;對惡意連接的IP進行封禁;主動清除殘余連接。

?

accpet()函數調用的時間

還有一個問題就是 accept 函數是在那個階段調用的,這個問題好像是騰訊的一道面試題。之前我一直以為是第二次握手的時候就完成這項工作了。可是沒想到啊,最近查看資料后發現自己是大錯特錯。因為服務器在創建socket、bind、listen之后就要接收客戶端的連接請求。而且,服務器就是用 accept() 函數返回的 socket 文件描述符與客戶端通信。所以自然而然的認為 accept 函數是在服務器分配資源的時候完成的。其實 accept() 從監聽隊列中接受的連接已經完成了 TCP 三次握手。下面的代碼用于查看調用 accept() 函數之前連接所處的狀態,所以就沒有添加?accept() 函數。

測試代碼:

#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <assert.h> #include <stdio.h> #include <string.h>static bool stop = false;static void handle_term( int sig ) {stop = true; }int main( int argc, char *argv[] ) //輸入IP,端口和監聽隊列的長度 {signal( SIGTERM, handle_term );if( argc <= 3 ){printf( "usage:%s ip_address port_number backlog\n", basename(argv[0]) );return 1;}const char * ip = argv[1];int port = atoi( argv[2] );int backlog = atoi( argv[3] );int sock = socket( PF_INET, SOCK_STREAM, 0 );assert( sock >= 0 );struct sockaddr_in address;bzero( &address, sizeof(address) );address.sin_family = AF_INET;inet_pton( AF_INET, ip, &address.sin_addr );address.sin_port = htons( port );int ret = bind( sock, (struct sockaddr*)&address, sizeof(address) );assert( ret != -1 );ret = listen( sock, backlog );assert( ret != -1 );while(!stop) //循環等待連接,直到有SIGTERM信號將它中斷{sleep(1);}close( sock );return 0; }

在 Linux 系統下運行上述代碼,再使用 telnet 命令來連接該服務器程序。同時,每使用 telnet 命令建立一個連接,就執行一次 netstat 命令來查看服務器上連接的狀態。具體流程如下:

$ ./asd 192.168.1.10 12345 5 $ telnet 192.168.1.10 12345 5 $ netstat -nt | grep 12345 多次執行2,3步結果是處于ESTABLISHED狀態的連接有6個(backlog+1),其他的連接都處于SYN_RCVD狀態。

上述實驗表明,再 accept() 函數被調用前,三次握手就建立了。

工作流程圖如下:

總結

以上是生活随笔為你收集整理的SYN攻击原理 accpet()函数调用时机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。