suricata架構
Suricata是一款高性能網絡入侵檢測防御引擎。該引擎基於多線程,充分利用多核優勢。它支持多種協議,如:ip4、ipv6、tcp、udp、http、smtp、pop3、imap、ftp等。可動態加載預設規則,支持多種文件格式統計數據輸出,如pcap、json、unified2等,非常便於與Barnyard2等工具集成。
運行模式
Suricata有多種運行模式,這些模式與抓包驅動和IDS/IPS選擇相關聯。抓包驅動如:pcap, pcap file, nfqueue,ipfw, dpdk或者一個特有的抓包驅動等。Suricata在啟動時只能選擇某個運行模式。如-i選項表示pcap, -r表示pcapfile,-q表示nfqueue等。每一種運行模式都會初始化一些threads,queues等。模式的具體任務是由線程模塊來完成。根據線程和線程模塊的組織方式的不同,運行模式又細分為"autofp", “single”,“wokers”.
從上面的流程圖可看出,“autofp”模式屬於最高效的模式,但也是最復雜的模式。"worker“適中。
packet流水線
抓包模塊收集packets並進行簡單封裝,再將其傳遞Decode模塊,Decode模塊根據packet的鏈路類型,解碼出對應上層協議(IP,ICMP,TCP,UDP等),處理后的結果將被繼續傳遞給下一個處理模塊。
線程模塊
線程模塊是對packet處理任務的抽象。線程模塊大概有以下幾種:
1.Receive模塊:收集網絡數據包,封裝成Packet對象后將其傳遞給Decode線程模塊2.
2.Decode模塊:對Packet按協議4層模型(數據鏈路層、網絡層、傳輸層、應用層)進行解碼,獲取協議和負荷信息,解碼完成后將 Packet傳遞給FlowWorker線程模塊。該模塊主要是進行packet解碼,不處理應用層。應用層由專門的應用層解碼模塊處理
3.FlowWorker模塊:對packets進行分配flow,Tcp會話管理,TCP重組,應用層數據解析處理,Detect規則檢測
4.Verdict模塊:根據Detect模塊檢測的結果,對drop標記的包需要做丟棄處理
5.RespondReject模塊:根據detect檢測后的結果,對於reject的包需要向雙端發送reset包
6.logs模塊:將處理結果記錄在日志中。
線程模塊間的數據傳遞
同線程內的模塊之間主要是以參數的形式進行數據傳遞,不同線程之間以共享隊列的方式進行數據傳遞。每個線程由ThreaVars結構體來抽象,ThreadVars對象指定線程輸入數據隊列inq和輸出數據隊列outq。這些隊列在多個線程之間進行共享,一個線程的輸出隊列可能是另一個線程的輸入隊列。
綠色線條表示數據的走向。從輸入隊列獲取數據包packet,經過slot函數(模塊函數)的處理后,再將加工后的packet放到輸出隊列中。
在autofp模式下數據包的傳遞路徑
藍色線條表示packet的傳遞路徑。
autofp模式研究
RX thread
從上面"autofp"模式中可以看出RX thread所處的位置和包含的功能模塊。它主要用於收集packets並對其進行解碼,將處理后的packets放到pickup queue中,以供下個模塊使用.
RX thread的作用體現為線程函數-TmThreadsSlotPktAcqLoop,主要執行的任務為:
- 給線程設置一個有意義的名稱;
- 將線程綁定到指定CPU核心;
- 創建Packet對象池,用於快速存放網絡數據包數據;
- 初始化與該線程關聯的線程模塊;
- 調用數據包收集模塊,啟動數據包收集,依次調用各模塊處理packet,然后將packet放到輸出隊列中;
- 如果接收到退出信號,則中止數據包收集,銷毀Packet對象池,調用線程模塊的退出清理函數;
- 退出線程的執行。
W thread
從上面"autofp"模式中可以看出W thread所處的位置和包含的功能模塊。它主要由FlowWorker模塊和一些log模塊組成, 主要完成數據檢測和特定格式特定數據的日志輸出。
w thread的作用體現為線程函數-TmThreadsSlotVar,主要執行的任務為:
- 給線程設置一個有意義的名稱;
- 將線程綁定到指定CPU核心;
- 創建空Packet對象池;
- 初始化與該線程關聯的線程模塊;
- 從輸入隊列中獲取packet,傳遞給線程模塊依次處理后,放到輸出隊列中;
- 如果接收到退出信號,則中止數據包收集,銷毀Packet對象池,調用線程模塊的退出清理函數;
- 退出線程的執行。