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流量,建議不要取太長時(shí)間(毫不夸張的說,一個(gè)大型企業(yè)的netflow流量10分鐘的netflow數(shù)據(jù)往往可以使這個(gè)文件達(dá)到好幾個(gè)G,解析成json文件后甚至達(dá)到幾十G,這已經(jīng)遠(yuǎn)遠(yuǎn)超出了一般程序可以解析處理的范圍)。
可以先使用
tcpdumpudpport9996|grepxxx.xxx.xxx.xxx
測試檢查是否可以獲取對應(yīng)的數(shù)據(jù),如果長時(shí)間沒有響應(yīng),這表明數(shù)據(jù)數(shù)據(jù)包可能沒有到達(dá)本端,需要檢查設(shè)備配置或者防火墻策略。
在linux下使用該命令可以查看對應(yīng)端口下的數(shù)據(jù)包,通過grep可以過濾出自己的想要查看的ip
將抓好的包導(dǎo)入wireshark
抓取下來的包直接用wireshark打開(windows版和Mac版都可以)。如下圖所示:
如下圖所示,隨便點(diǎn)擊一個(gè)數(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()
運(yùn)行解析腳本
在shell下運(yùn)行如下命令即可。
pythonnetflow_to_csv.py
解析結(jié)果
最終運(yùn)行結(jié)果如下圖所示:
-
Linux
+關(guān)注
關(guān)注
87文章
11339瀏覽量
210119 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
84939 -
Shell
+關(guān)注
關(guān)注
1文章
366瀏覽量
23430
原文標(biāo)題:使用python腳本解析netflow抓包數(shù)據(jù)到csv
文章出處:【微信號:網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號:網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論