編寫自己的sniffer(一)


 
接上篇 linux下libpcap抓包分析

一、系統環境

 

1、系統及類庫要求:
類Unix系統+libpcap庫+libnet庫+pcre庫;
 
2、各組件版本要求:
libpcap 1.0以上;
libnet  1.1以上;
pcre 7.5以上;
 
注意:對於不同類Unix系統及相同類型不同發行版的Unix系統,libpcap安裝組件可能會不同;例如:對於Fedora,系統可能沒有
libpcap安裝所必須的組件, 所以, 需要預先bison、flex、m4等軟件包。
 
3、普通情況下,安裝步驟如下:
a)、解壓libpcap壓縮包;
b)、進入libpcap安裝目錄;
c)、使用root用戶依次執行:
   (sudo) ./configure
   (sudo) make
   (sudo) make install
 
   對於2中所述特殊情況,安裝步驟如下:
(假設環境為libpcap-1.0.0 + flex-2.5.35 + bison-2.4.1 + m4-1.4.13)
 
a)、打開網址:www.tcpdump.org/ 下載 libpcap-1.0.0.tar.gz (512.0KB) 軟件包,通過命令 tar zxvf libpcap-1.0.0.tar.gz
解壓文件,並將其放入 自定義的安裝目錄。
 
b)、打開網址:flex.sourceforge.net/ 下載 flex-2.5.35.tar.gz (1.40MB) 軟件包,通過 tar zxvf flex-2.5.35.tar.gz 解壓文件 ,
並將其放入上述自定義 的安裝目錄中。
 
    注:如果沒有編譯安裝此文件,在編譯安裝libpcap時,就會出現 “configure: error: Your operating system's lex is insufficient
to compile libpcap.” 的錯誤提示。
 
c)、打開網址:ftp.gnu.org/gnu/bison/ 下載 bison-2.4.1.tar.gz (1.9MB) 軟件包,通過 tar zxvf bison-2.4.1.tar.gz 解壓文件,
並將其放入上述自定義 的安裝目錄中。
 
  注:如果沒有編譯安裝此文件,在編譯安裝libpcap時,就會出現 "configure: WARNING: don't have both flex and bison;
reverting to lex/yacc  checking for capable  lex... insufficient" 的錯誤提示。
 
d)、打開網址:ftp.gnu.org/gnu/m4/ 下載 m4-1.4.13.tar.gz (1.2MB)軟件包,通過 tar zxvf m4-1.4.13.tar.gz 解壓文件,並將
其放入上述自定義的 安裝目錄中。
 
  注:如果沒有編譯安裝此文件,在編譯安裝bison-2.4.1時,就會出現 “configure: error: GNU M4 1.4 is required”的錯誤提示 。
 
e)、而后依次進入目錄m4-1.4.13,bison-2.4.1,flex-2.5.35,libpcap-1.0.0 並執行以下命令(root用戶權限):
 
   (sudo) ./configure
 
   (sudo) make
 
   (sudo) make install
 
 
二、協議分析
 
 
例如:鏈路層協議分析
 

借助官方的API快速開發鏈路層->IP層->TCP層->HTTP層的協議解析,這樣下來就有了很清楚的路線和理解,其他協議的分析就比較簡單、明了了。

 

 

三、核心數據結構(Hash)

 

   考慮到應用層協議識別的對象不是以單個報文為單位,而是將流作為一個整體考慮。以此為目的,要對數據流進行協議識別,首先需要對

網絡數據包做分流處理。流表操作的性能,將直接影響整個系統的性能。流表通過對網絡流數據包的五元組信息(源IP地址、目的IP地址、源端口、

目的端口、協議號)進行解析,對五元組信息進行哈希計算,按照哈希值將數據包分為不同的流,從而達到對數據包分流的目的。分流后,將每個

流的基本信息保存在流表中,為應用層協議識別等提供數據支持。

   1、流表的設計

   

 

   2、流表的處理流程

  3、hash設計和計算

  h(key)=((源端口號& 0xff) |((目的端口號&0xff) << 8) |((源IP地址& 0xff) << 16) |((目的IP地址& 0xff) << 24)) % HASH_SIZE ;

  很容易想到同一個流有兩個方向,所以為了提高效率,先將五元組按照IP地址和端口號大小進行排序,這里規定最終的順序為:小口地址、大IP地址、小端口號、大端口號、協議號。因此,同一個流的兩個方向只需要計算一次hash值,提高了效率。除TCP、UDP外,其它協議的端口號規定為零。

 

四、流量統計

  

  主要用於將系統運行過程中統計出的ip數據包的數量、長度、當前識別流的總數量、被識別出每種應用層協議數據包的個數、數據量的大小、

流的個數等信息實時的進行統計。統計模塊主要划分為以下幾個部分:全局信息統計、流表信息統計、協議信息統計。

 

統計模塊

         將系統運行過程中統計出的ip數據包的數量、長度、當前識別流的總數量、被識別出每種應用層協議數據包的個數、數據量的大小、流的

個數等信息實時的進行統計。將統計模塊主要划分為以下幾個部分:全局信息統計、流表信息統計、協議信息統計。

 

全局信息統計

  全局信息統計主要包括收包數目、發包數目,IP包數目、非lP包數目、TCP包數目、UDP包數目等在進入流表之前通過分析五元組就可以獲得

的和數據包相關的統計信息。

 

流表的信息統計

  主要統計流的數量,如:建立流的數量、已結束流的數量、TCP流的個數、UDP流的個數等。

 

協議統計信息

  此處統計只在流刪除時進行,當刪除流時,觸發統計機制,從而將此流的相關信息記錄在相應的協議信息統計位置。

 

全局信息、流表信息、協議信息的統計時機

主要分為以下三點:

l、分析出五元組並進入流表之前。主要統計全局信息,例如收發包數目、IP包數目、TCP包數目等信息。

2、流表建立時刻。統計建立流表數目、TCP流表數目、UDP流表數目等信息。

3、流表結束時刻。統計完成流表數目、協議相關統計等信息。

 

五、上行/下行速率計算

 

1、首先是抓包時間的計算,我們要用的應該是網卡抓包時的時間戳,而不是系統時間,否則會有誤差。pcap_loop調用的回調函數的第二個參數

struct pcap_pkthdr可以獲取該時間戳。每次調用回調函數時保存上一次的時間,相鄰兩次相減就是傳輸時間。

2、為了提高計算的准確性,總數據量在鏈路層統計,而不是網絡層,這樣就需要獲取本地Mac地址,並對數據幀的目的Mac和本地Mac比較確定

上傳還是下載數據包。

可以參考:http://blog.csdn.net/fengyun1989/article/details/7384879的策略。

 

以下是一些流量統計(IP包數、丟包率、上行/下行平均速率等)的運行結果:

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM