流量特徵提取工具NFStream

smileleooo發表於2024-05-11

目錄
  • 前言
  • NFStream
    • NFStreamer
    • Pandas Dataframe轉換
    • CSV檔案轉換
  • NFStream特徵提取
    • 事後統計流特徵提取
    • 早期統計流特徵提取
    • 應用層可見性特徵提取
    • 系統的可見性

前言

之前介紹了關於stratum協議挖礦流量的一些內容,今天來介紹一下一款好用的流量特徵提取工具 NFStream,它可以很好的幫助我們從更深層次的角度來分析流量特徵。

flowcontainer

再介紹NFStream之前,先來介紹一下flowcontainer,它也是基於python開發的一款網路流量基本資訊提取庫。

flowcontainer預設提取流的:源IP,源埠,目的IP,目的埠,IP包長序列,IP包到達時間序列,流到達時間戳、流結束時間戳、載荷長度序列,載荷到達時間序列。

flowcontainer的安裝環境:

python3

numpy>=18.1

系統安裝好tshark的最新版本,並將tshark所在的目錄新增到系統的環境目錄

具體使用文件參考:https://github.com/jmhIcoding/flowcontainer/blob/master/README.md

flowcontainer是一個很好用的庫,面對一些流量基本的特徵提取是完全夠用的,但是想要提取更多維的特徵就顯得力不從心了,而且不支援深度包檢測技術。

下面我就著重介紹一下NFStream這個工具庫,NFStream是國外開發的一款基於Python編寫的網路流量分析工具,功能更加強大一些。但國內用的人不多,相關文章也很少。

NFStream

NFStream的主要特點:

  • 效能:NFStream的執行速度非常快,而且對CPU和記憶體的需求並不大

  • 七層可見度:允許Nfstream執行可靠的加密應用識別與後設資料提取

  • 靈活性:引入NFPlugin外掛概念,便於實現功能擴充套件

  • 機器學習:支援以NFPlugin的形式新增訓練模型

安裝

pip3 install nfstream # pip3命令安裝

git clone https://github.com/aouinizied/nfstream.git #將專案原始碼克隆至本地

NFStreamer

建立一個NFStreamer:

from nfstream import NFStreamer
my_streamer = NFStreamer(source="facebook.pcap", # or network interface
                         decode_tunnels=True,
                         bpf_filter=None,
                         promiscuous_mode=True,
                         snapshot_length=1536,
                         idle_timeout=120,
                         active_timeout=1800,
                         accounting_mode=0,
                         udps=None,
                         n_dissections=20,
                         statistical_analysis=False,
                         splt_analysis=0,
                         n_meters=0,
                         max_nflows=0,
                         performance_report=0,
                         system_visibility_mode=0,
                         system_visibility_poll_ms=100)

# 基本的使用方式就是迴圈遍歷NFStreamer(分組)
for flow in my_streamer:
   print(flow) # or whatever

NFStreamer的各個屬性及含義

屬性(預設) 描述
source="facebook.pcap" pcap檔案路徑或網路介面名稱
decode_tunnels=True 開啟/關閉GTP/CAPWAP/TZSP隧道解碼
bpf_filter=None 指定一個BPF filter過濾器,用於過濾選定的流量
promiscuous_mode=True 啟用/禁用混雜捕獲模式
snapshot_length=1536 控制包切片大小(截斷),以位元組為單位
idle_timeout=120 空閒流(沒有收到資料包)超過該值(秒)即過期
active_timeout=1800 活動時間超過該值(秒)的流將過期
accounting_mode=0 指定一個模式報告位元組相關特性(0:鏈路層,1:IP層,2:傳輸層,3:有效載荷)
udps=None 指定使用者定義的用於擴充套件NFStreamer的NFPlugins
n_dissections=20 要為L7可見性特徵分析的每個流分組數,當設定為0時,禁用L7可見性特性
statistical_analysis=False 啟用/禁用事後流統計分析
splt_analysis=0 指定第一個分組的長度序列,用於早期的統計分析,當設定為0時,禁用splt_analysis
n_meters=0 指定返回前要捕獲的最大流數,當等於0時不設定
max_nflows=0 指定並行計量過程的數量當,設定為0時,NFStreamer將自動根據執行主機上可用的物理核心對計量進行擴充套件
performance_report=0 效能報告間隔時間,單位為秒,當設定為0時禁用,忽略離線捕獲
system_visibility_mode=0 透過探測主機來啟用系統程序對映
system_visibility_poll_ms=100 設定系統程序對映特性的輪詢間隔,單位為毫秒(0是最大可達速率)

NFLow

NFlow是NFStream中的流表示形式。它包含了根據NFStreamer配置計算的所有流特徵。

Nflow核心特徵包括:

特徵 資料型別 描述
id int 流識別符號
expiration_id int 流過期觸發器的識別符號,0表示idle_timeout,1表示active_timeout,-1表示自定義過期
src_ip str 源IP地址字串
src_mac str 源MAC地址字串
src_oui str 源組織唯一識別符號字串
src_port int 傳輸層源埠
dst_ip str 目的IP地址字串
dst_mac str 目的MAC地址字串
dst_oui str 目標組織唯一識別符號字串
dst_port int 傳輸層目的埠
protocol int 傳輸層協議
ip_version int IP版本
vlan_id int 虛擬區域網識別符號
bidirectional_first_seen_ms int 第一個雙向分組的時間戳,單位為毫秒
bidirectional_last_seen_ms int 最後一個雙向分組的時間戳,單位為毫秒
bidirectional_duration_ms int 雙向流持續時間,單位為毫秒
bidirectional_packets int 流量雙向資料包累加器
bidirectional_bytes int 雙向位元組累加器(依賴accounting_mode)
src2dst_first_seen_ms int 第一個src2dst分組上的時間戳,單位為毫秒
src2dst_last_seen_ms int 最後一個src2dst分組上的時間戳,單位為毫秒
src2dst_duration_ms int src2dst持續時間,單位為毫秒
src2dst_packets int src2dst資料包累加器
src2dst_bytes int src2dst位元組累加器(取決於accounting_mode)
dst2src_first_seen_ms int 第一個dst2src分組上的時間戳,單位為毫秒
dst2src_last_seen_ms int 最後一個dst2src分組上的時間戳,單位為毫秒
dst2src_duration_ms int dst2src持續時間,單位為毫秒
dst2src_packets int dst2src資料包累加器
dst2src_bytes int dst2src位元組累加器(取決於accounting_mode)

還有一些其他特徵值包括:

  • 隧道解碼特徵(TUNNEL DECODING FEATURES)

  • 事後統計流特徵 (POST-MORTEM STATISTICAL FEATURES)

  • 早期統計特徵 (EARLY STATISTICAL FEATURES)

  • 系統可見特徵 (SYSTEM VISIBILITY FEATURES)

  • 流7層可見特徵(NFLOW LAYER-7 VISIBILITY FEATURES)

詳細參考:https://www.nfstream.org/docs/api

Pandas Dataframe轉換

NFStream原生支援Pandas作為匯出介面:

my_dataframe = my_streamer.to_pandas(columns_to_anonymize=[])

引數:columns_to_anonymize 要匿名的列名列表 (一般不用)

示例:

from nfstream import NFStreamer
my_dataframe = NFStreamer(source=path_pcap).to_pandas()[["src_ip",  # 需要匯出的特徵列表
                                                         "src_port",
                                                         "dst_ip",
                                                         "dst_port",
                                                         "protocol",
                                                         "bidirectional_packets",
                                                         "bidirectional_bytes",
                                                         "application_name"]]
my_dataframe.head(5)

image

CSV檔案轉換

NFStream原生支援CSV檔案格式作為匯出介面:

total_flows_count = my_streamer.to_csv(path=None, columns_to_anonymize=[], flows_per_file=0, rotate_files=0)

引數:

  • path:指定csv結果檔案的輸出路徑

  • flows_per_file:指定每個生成的檔案的最大流量

  • columns_to_anonymize:要匿名的列名列表

  • rotate_files:限制磁碟儲存使用的rotating檔案數量

示例:

image

預設輸出檔案,是再原pcap檔名後面加上.csv, 如a.pacp.csv

image

NFStream特徵提取

NFStream相比於flowcontainer的幾大優點:

  • 原生支援Pandas匯出介面和CSV匯出介面。

  • 事後統計流特徵提取:NFStream進行了48個事後流統計特徵提取,包括詳細的TCP標誌位分析,資料包大小和每個方向的到達間隔時間的最小、均值、最大值和標準差。

  • 早期統計流特徵提取:NFStream執行早期流(最多255個分組)統計特徵提取(也稱為SPLT分析)。將這些分組的方向、大小和到達間隔時間歸納為一個序列。

  • 應用層可見性特徵提取:Nfstream深度資料包檢測引擎基於nDPI實現,它允許Nfstream執行可靠的加密應用識別與後設資料提取(例如TLS, QUIC, TOR, HTTP, SSH, DNS)

  • 系統的可見性:NFStream探測被監控系統的核心,以獲取有關開放Internet套接字的資訊,並在應用層收集有保證的真實值(程序名、PID等)。

事後統計流特徵提取

只需在NFStreamer函式引數設定 statistical_analysis=True即可開啟事後統計流特徵提取。

示例:

from nfstream import NFStreamer
my_streamer = NFStreamer(source=pcap,
                         n_dissections=0,  # 第 7 層資料不可見
                         statistical_analysis=True)
for flow in my_streamer:
    print(flow)

image

NFStream支援48個事後流統計特徵提取:

      bidirectional_min_ps=84,
      bidirectional_mean_ps=92.0,
      bidirectional_stddev_ps=11.313708498984761,
      bidirectional_max_ps=100,
      src2dst_min_ps=84,
      src2dst_mean_ps=84.0,
      src2dst_stddev_ps=0.0,
      src2dst_max_ps=84,
      dst2src_min_ps=100,
      dst2src_mean_ps=100.0,
      dst2src_stddev_ps=0.0,
      dst2src_max_ps=100,
      bidirectional_min_piat_ms=0,
      bidirectional_mean_piat_ms=0.0,
      bidirectional_stddev_piat_ms=0.0,
      bidirectional_max_piat_ms=0,
      src2dst_min_piat_ms=0,
      src2dst_mean_piat_ms=0.0,
      src2dst_stddev_piat_ms=0.0,
      src2dst_max_piat_ms=0,
      dst2src_min_piat_ms=0,
      dst2src_mean_piat_ms=0.0,
      dst2src_stddev_piat_ms=0.0,
      dst2src_max_piat_ms=0,
      bidirectional_syn_packets=0,
      bidirectional_cwr_packets=0,
      bidirectional_ece_packets=0,
      bidirectional_urg_packets=0,
      bidirectional_ack_packets=0,
      bidirectional_psh_packets=0,
      bidirectional_rst_packets=0,
      bidirectional_fin_packets=0,
      src2dst_syn_packets=0,
      src2dst_cwr_packets=0,
      src2dst_ece_packets=0,
      src2dst_urg_packets=0,
      src2dst_ack_packets=0,
      src2dst_psh_packets=0,
      src2dst_rst_packets=0,
      src2dst_fin_packets=0,
      dst2src_syn_packets=0,
      dst2src_cwr_packets=0,
      dst2src_ece_packets=0,
      dst2src_urg_packets=0,
      dst2src_ack_packets=0,
      dst2src_psh_packets=0,
      dst2src_rst_packets=0,
      dst2src_fin_packets=0

事後流統計特徵主要包括:TCP標誌位分析,資料包大小和每個方向的到達間隔時間的最小、均值、最大值和標準差。

欄位詳細資訊參照官方API文件:https://www.nfstream.org/docs/api

早期統計流特徵提取

在NFStreamer函式引數設定 splt_analysis=N(N>0)即可開啟早期統計流特徵提取。

示例:

from nfstream import NFStreamer
my_streamer = NFStreamer(source=pcap,
                         n_dissections=0,  # 第 7 層資料不可見
                         splt_analysis=10)
for flow in my_streamer:
    print(flow)

image

這個早期統計流特徵提取,和Wireshark的流追蹤功能類似,針對同一個TCP會話的資料流方向,資料包大小,到達時間間隔進行了統計。最多統計255個包,當 N>255 時程式報錯。

這三個列表的列表長度均為N(splt_analysis=N):

  • splt_direction:分組的方向(0:src2dst, 1:dst2src, -1:no packet)

  • splt_ps:分組的大小(依靠accounting_mode, -1表示沒有分組)

  • splt_piat_ms:到達間隔時間(第一個分組總是0,沒有分組時總是-1)

應用層可見性特徵提取

在NFStreamer函式中設定 n_dissection>0即可開啟7層可見性特徵。

示例:

from nfstream import NFStreamer
my_streamer = NFStreamer(source=pcap, n_dissections=20)
for flow in my_streamer:
    print(flow)

image

支援9個7層可見性特徵:

application_name=SSH,  # 應用程式名稱
application_category_name=RemoteAccess,  # 應用類別名稱
application_is_guessed=1,  # 表示檢測結果是基於純解析還是基於猜測啟發式
application_confidence=1,  # 底層檢測方法(O:未知分類,1:僅透過4層埠得到的分類,3:基於部分/不完全DPI資訊的分類結果,4:基於部分/不完全DPI資訊的LRU快取的分類結果,5:基於部分LRU快取的分類結果(即會話之間的相關性),6:深度包檢測)
requested_server_name=,  # 請求的伺服器名稱(SSL/TLS、DNS、HTTP)
client_fingerprint=,  # 客戶端指紋
server_fingerprint=,  # 伺服器指紋
user_agent=,  # 提取的使用者代理為HTTP或使用者代理識別符號為QUIC
content_type=  # 提取的HTTP內容型別

深度資料包檢測引擎基於nDPI實現,支援這幾種應用:TLS, QUIC, TOR, HTTP, SSH, DNS

系統的可見性

在NFStreamer函式引數設定 system_visibility_mode=1即可開啟系統的可見性。

from nfstream import NFStreamer
my_streamer = NFStreamer(source=pcap,
                         n_dissections=0,  # 第 7 層資料不可見
                         splt_analysis=10)
for flow in my_streamer:
    print(flow)

開啟以後可以獲取關於這個分組的通訊程序的資訊,包括程序名稱(process_name)和程序ID(process_pid)。

image

我本地執行程式執行報錯。
還有一個隧道解碼特徵,個人感覺用處也不大。

NFPlugin擴充套件

NFPlugin不過多介紹了,前面介紹的內容在絕大數情況下都足夠使用了。

NFPlugin是擴充套件NFStream的主要類,可以建立一組新的NFlow特性,可以來滿足自定義需求。在使用之前需要匯入NFPlugin模組 from nfstream import NFPlugin

關於更多關於NFPlugin更多內容,參照官方文件:https://www.nfstream.org/docs/api

*本文的大部分內容來自官方文件的英文機翻,如有不準確的部分請諒解。

參考文章:
https://pypi.org/project/nfstream/
https://github.com/nfstream/nfstream/blob/master/examples/flow_printer.py
https://github.com/jmhIcoding/flowcontainer/blob/master/README.md


若有錯誤,歡迎指正!o( ̄▽ ̄)ブ

相關文章