- 前言
- 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)
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檔案數量
示例:
預設輸出檔案,是再原pcap檔名後面加上.csv
, 如a.pacp.csv
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)
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)
這個早期統計流特徵提取,和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)
支援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)。
我本地執行程式執行報錯。
還有一個隧道解碼特徵,個人感覺用處也不大。
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( ̄▽ ̄)ブ