本文主要講解了linux下通過tcpdump抓取netflow數據包,并將其導入到wireshark進行解析,然后通過wireshark導出數據為json文件,再通過python腳本將其解析為csv文件以便做數據分析。
使用linux自帶的tcpdump抓包
在linux的shell下使用tcpdump包抓取指定端口下的數據包,netflow流量的端口默認為9996端口。
tcpdumpudpport9996-wnetflow_data.cap
在shell打上該命令linux便會開始抓包,按Ctrl+C則會停止抓取并將數據寫入netflow_data.cap文件,由于netflow的數據量特別大,所以如果沒有過濾出指定ip的netflow流量,建議不要取太長時間(毫不夸張的說,一個大型企業的netflow流量10分鐘的netflow數據往往可以使這個文件達到好幾個G,解析成json文件后甚至達到幾十G,這已經遠遠超出了一般程序可以解析處理的范圍)。
可以先使用
tcpdumpudpport9996|grepxxx.xxx.xxx.xxx
測試檢查是否可以獲取對應的數據,如果長時間沒有響應,這表明數據數據包可能沒有到達本端,需要檢查設備配置或者防火墻策略。
在linux下使用該命令可以查看對應端口下的數據包,通過grep可以過濾出自己的想要查看的ip
將抓好的包導入wireshark
抓取下來的包直接用wireshark打開(windows版和Mac版都可以)。如下圖所示:
如下圖所示,隨便點擊一個數據包
將數據導出為json文件
在wireshark中導出數據到json文件,以便于我們使用python對數據進行解析。
解析數據到csv
將導出好的json文件上傳到安裝了python環境的終端上(例如Linux或Mac),與如下腳本(腳本名稱netflow_to_csv.py)放置在同一目錄下
#_*_coding:utf-8_*_ importjson data_file='./data.json'#wireshark導出數據 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
解析結果
最終運行結果如下圖所示:
-
Linux
+關注
關注
87文章
11402瀏覽量
212059 -
python
+關注
關注
56文章
4821瀏覽量
85662 -
Shell
+關注
關注
1文章
369瀏覽量
23762
原文標題:使用python腳本解析netflow抓包數據到csv
文章出處:【微信號:網絡技術干貨圈,微信公眾號:網絡技術干貨圈】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
csv文件中的數據
有關Python的解析
python基礎語法及流程控制
MCU通過串口發送數據到WIFI模塊上具體流程包括哪些
請問CH376S如何讀取CSV中的數據,解析出來?
Python3如何對CSV進行寫入和讀寫

如何通過pandas讀取csv文件指定的前幾行?
Python中BeatifulSoap解析HTML的三個實用小技巧詳解
虹科分享 | NetFlow數據能夠為網絡故障排除提供什么? | 網絡流量監控

評論