python解析netflow數(shù)據(jù)到csv
本文主要講解了linux下通過tcpdump抓取netflow數(shù)據(jù)包,并將其導(dǎo)入到wireshark進(jìn)行解析,然后通過wireshark導(dǎo)出數(shù)據(jù)為json文件,再通過python腳本將其解析為csv文件以便做數(shù)據(jù)分析。
使用linux自帶的tcpdump抓包
在linux的shell下使用tcpdump包抓取指定端口下的數(shù)據(jù)包,netflow流量的端口默認(rèn)為9996端口。
tcpdumpudpport9996-wnetflow_data.cap
在shell打上該命令linux便會開始抓包,按Ctrl+C則會停止抓取并將數(shù)據(jù)寫入netflow_data.cap文件,由于netflow的數(shù)據(jù)量特別大,所以如果沒有過濾出指定ip的netflow流量,建議不要取太長時間(毫不夸張的說,一個大型企業(yè)的netflow流量10分鐘的netflow數(shù)據(jù)往往可以使這個文件達(dá)到好幾個G,解析成json文件后甚至達(dá)到幾十G,這已經(jīng)遠(yuǎn)遠(yuǎn)超出了一般程序可以解析處理的范圍)。
可以先使用
tcpdumpudpport9996|grepxxx.xxx.xxx.xxx
測試檢查是否可以獲取對應(yīng)的數(shù)據(jù),如果長時間沒有響應(yīng),這表明數(shù)據(jù)數(shù)據(jù)包可能沒有到達(dá)本端,需要檢查設(shè)備配置或者防火墻策略。
在linux下使用該命令可以查看對應(yīng)端口下的數(shù)據(jù)包,通過grep可以過濾出自己的想要查看的ip
將抓好的包導(dǎo)入wireshark
抓取下來的包直接用wireshark打開(windows版和Mac版都可以)。如下圖所示:


如下圖所示,隨便點擊一個數(shù)據(jù)包

將數(shù)據(jù)導(dǎo)出為json文件
在wireshark中導(dǎo)出數(shù)據(jù)到j(luò)son文件,以便于我們使用python對數(shù)據(jù)進(jìn)行解析。

解析數(shù)據(jù)到csv
將導(dǎo)出好的json文件上傳到安裝了python環(huán)境的終端上(例如Linux或Mac),與如下腳本(腳本名稱netflow_to_csv.py)放置在同一目錄下
#_*_coding:utf-8_*_
importjson
data_file='./data.json'#wireshark導(dǎo)出數(shù)據(jù)
output_file='./netflow.csv'#解析后文件名
withopen(data_file,'r')asf:
data_list=json.loads(f.read())
defget_the_flow_list(data_item):
'''
["Flow1":{
"cflow.srcaddr":"xxx.xxx.xxx.xxx",
"cflow.dstaddr":"xxx.xxx.xxx.xxx",
"cflow.protocol":"2",
"cflow.srcport":"0",
"cflow.dstport":"17",
"cflow.inputint":"5",
"cflow.outputint":"0",
"cflow.octets":"36",
"cflow.packets":"1"
},
"Flow2":{
"cflow.srcaddr":"xxx.xxx.xxx.xxx",
"cflow.dstaddr":"xxx.xxx.xxx.xxx",
"cflow.protocol":"2",
"cflow.srcport":"0",
"cflow.dstport":"17",
"cflow.inputint":"5",
"cflow.outputint":"0",
"cflow.octets":"36",
"cflow.packets":"1"
}
]
'''
cflow=data_item.get('_source').get('layers').get('cflow')
flowSet_k=[kfork,vincflow.items()if'FlowSet'ink][0]
flow_data_list=[]
#flow_list=[{f:v}forf,vincflow.get(flowSet_k).items()if'Flow'inf]
fork,vincflow.get(flowSet_k).items():
if'Flow'notink:
continue
srcaddr=v.get("cflow.srcaddr")
dstaddr=v.get("cflow.dstaddr")
protocol=v.get("cflow.protocol")
srcport=v.get("cflow.srcport")
dstport=v.get("cflow.dstport")
inputint=v.get("cflow.inputint")
outputint=v.get("cflow.outputint")
octets=v.get("cflow.octets")
packets=v.get("cflow.packets")
flow_data_list.append((k,srcaddr,dstaddr,protocol,srcport,dstport,inputint,outputint,octets,packets))
returnflow_data_list
defdomain():
withopen(output_file,'w')asf:
title='No,Flow_id,srcaddr,dstaddr,protocol,srcport,dstport,inputint,outputint,octets,packets
'
f.write(title)
i=0
fordata_itemindata_list:
i=i+1
try:
flow_list=get_the_flow_list(data_item)
forflow_iteminflow_list:
line='%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s
'%(i,flow_item[0],flow_item[1],flow_item[2],flow_item[3],flow_item[4],flow_item[5],flow_item[6],flow_item[7],flow_item[8],flow_item[9])
f.write(line)
exceptExceptionase:
print'template'
printe
continue
if__name__=='__main__':
domain()
運行解析腳本
在shell下運行如下命令即可。
pythonnetflow_to_csv.py
解析結(jié)果
最終運行結(jié)果如下圖所示:

審核編輯:劉清