1. 程式人生 > >【轉】Linux下從TCP狀態機,三次握手判斷DDOS攻擊

【轉】Linux下從TCP狀態機,三次握手判斷DDOS攻擊

pla rep img 實體 -s lar 連接狀態 sdn 類型

從TCP狀態機判斷DDOS攻擊

一、TCP協議

TCP 協議是傳送層的核心協議,提供了可靠面向連接的協議,分為三次握手和四次斷開,在這個過程中TCP有個狀態機,記錄不同階段的狀態。

二、 TCP握手和斷開

這裏不著重介紹三次握手和四次斷開,只是附加一個圖解,這部分詳細內容大家自行腦補:參考鏈接:https://blog.csdn.net/qzcsu/article/details/72861891

2.1 握手協議:

技術分享圖片

2.2 斷開過程

技術分享圖片

三、TCP的狀態機

在協議建立和斷開過程,tcp協議一直要維護一個狀態,我們稱為tcp的狀態機。具體情況見下圖:

技術分享圖片

3.1 握手過程狀態

  • CLOSED: 表示初始狀態。
  • LISTEN: 偵聽端口狀態
  • SYN_RCVD: 表示接受到了SYN報文,時間短暫
  • SYN_SENT: 表示發送一個SYN的報文
  • ESTABLISHED:表示連接已經建立了,是一個穩定狀態。

為了方便理解,簡單舉個例子,某飯店8點之前是未開業,關門狀態(closed 狀態),八點之後開門營業,等待客人關顧(listen狀態),客戶進店點菜(SYS_SEND),老板收到並確認(SYS_RCVD), 客戶說沒錯可以上菜,然後雙方進入(Established)狀態。

3.2 斷開過程狀態

  • FIN WAIT 1:本地的 TCP 實體發送一個 FIN 報文段並等待響應的確認
  • CLOSE WAIT:服務器收到一個 FIN 報文段,它確認客戶端的請求發回一個 ACK 報文段
  • FIN WAIT 2 :客戶端收到確認 ACK 報文段,就轉移到 FIN WAIT 2 狀態
  • CLOSED:服務器收到最後一個確認 ACK 報文段,其 TCP 實體便釋放該連接,並刪除連接記錄

形象理解為:客人吃飯要離開,喊老板結賬(fin wait1), 老板說你等一下我找你錢(closeing),客戶收到檢查是否正確(fin wait2),確認無誤然後彼此斷開(closed)

四、半打開和半關閉

DDOS網絡攻擊的方式很多,有應用層ddos也有網絡層的,本文只討論網絡層形成的ddos攻擊類型,上文我們講述狀態機,就非常好理解了,大量的半打開的鏈接,占用了大量的網絡帶寬,從而達到了DOS的目的。

4.1 半打開

發生在TCP3次握手中。

如果A向B發起TCP請求,B也按照正常情況進行響應了,但是A不進行第3次握手,這就是半連接

4.2半關閉

當一方關閉發送通道後,仍可接受另一方發送過來的數據,這樣的情況叫“半關閉”。(拆除TCP連接是:你關閉你的發送通道,我關閉我的發送通道)。

五、Netstat DOS檢測

netstat -na

顯示所有連接到服務器的活躍的網絡連接

netstat -an | grep :80 | sort

只顯示連接到80段口的活躍的網絡連接,80是http端口,這對於web服務器非常有用,並且對結果排序.對於你從許多的連接中找出單個發動洪水攻擊IP非常有用

netstat -n -p|grep SYN_REC | wc -l

這個命令對於在服務器上找出活躍的SYNC_REC非常有用,數量應該很低,最好少於5.

在dos攻擊和郵件炸彈,這個數字可能非常高.然而值通常依賴於系統,所以高的值可能平分給另外的服務器.

netstat -n -p | grep SYN_REC | sort -u

列出所有包含的IP地址而不僅僅是計數.

netstat -n -p | grep SYN_REC | awk ‘{print $5}‘ | awk -F: ‘{print $1}‘

列出所有不同的IP地址節點發送SYN_REC的連接狀態

netstat -ntu | awk ‘{print $5}‘ | cut -d: -f1 | sort | uniq -c | sort -n

使用netstat命令來計算每個IP地址對服務器的連接數量

netstat -anp |grep ‘tcp|udp‘ | awk ‘{print $5}‘ | cut -d: -f1 | sort | uniq -c | sort -n

列出使用tcp和udp連接到服務器的數目

netstat -ntu | grep ESTAB | awk ‘{print $5}‘ | cut -d: -f1 | sort | uniq -c | sort -nr

檢查ESTABLISHED連接而不是所有連接,這可以每個ip的連接數

netstat -plan|grep :80|awk {‘print $5‘}|cut -d: -f 1|sort|uniq -c|sort -nk 1

顯示並且列出連接到80端口IP地址和連接數.80被用來作為HTTP

【轉】Linux下從TCP狀態機,三次握手判斷DDOS攻擊