本文主要讲解了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文章
11522浏览量
214272 -
python
+关注
关注
56文章
4831浏览量
87361 -
Shell
+关注
关注
1文章
372浏览量
24272
原文标题:使用python脚本解析netflow抓包数据到csv
文章出处:【微信号:网络技术干货圈,微信公众号:网络技术干货圈】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
csv文件中的数据
有关Python的解析
python基础语法及流程控制
MCU通过串口发送数据到WIFI模块上具体流程包括哪些
请问CH376S如何读取CSV中的数据,解析出来?
Python3如何对CSV进行写入和读写

如何通过pandas读取csv文件指定的前几行?
Python中BeatifulSoap解析HTML的三个实用小技巧详解
虹科分享 | NetFlow数据能够为网络故障排除提供什么? | 网络流量监控

评论