NetFlow流量采集与聚合的研究实现
扫描二维码
随时随地手机看文章
近年来,随着信息技术的飞速发展,越来越多的企业和大型机构在其内部构建基于网络的应用,复杂程度及对网络的依赖程度日益提高,各种各样的网络问题也随之产生。网络流量监测是网络管理和系统管理的一个重要组成部分,网络流量数据为网络的运行和维护提供了重要信息。这些数据对网络的资源分布、容量规划、服务质量分析、错误监测与隔离、安全管理都十分重要。因此,对网络流量及相关情况实施科学合理的监管和深入分析,成为网络管理的重要环节之一;同时,它也为网络问题提供有效解决方案及进行网络的规划。
目前的网络流量分析方法主要有基于SNMP、基于实时抓包分析、基于网络探针和基于:Flow技术等几种。NetFlow基于Flow技术,目前已得到大多数网络设备厂商的支持,提供了网络监测方面非常完善的应用。基于NetFlow的流量采集方法可以获得包括源/目的主机IP、应用协议类型、源/目的端口等详细信息,根据这些信息就可以对协议(应用)、主机IP(用户)以及AS域等进行统计排行和趋势分析,也可对异常流量进行监测分析。此外,NetFlow避免了大量部署和配置监测探针的复杂过程,使得网络性能分析更加全面、灵活且简单易用。
l NetFlow技术
NetFlow是Cisco公司提出的基于Cisco IOS系统的一种应用。它用于提供网络设备上数据包形成的“流”的统计信息,并逐渐演变成为网络流量统计和安全分析的主要手段。目前利用:NetFlow可以实现网络流量监测,用户应用监控,网络安全,网络规划以及流量计费等功能。
NetFlow有两个核心的组件:NetFlow缓存,存储IP流信息;NetFlow的数据导出或传输机制,NetFlow利用此机制将数据发送到网络管理采集器。
1.1 流(Flow)的定义
一条流由一个源主机与一个目的主机间的单方向传输的网络数据包组成,其中,源和目的主机由各自的IP地址和端口号来标识。一条流一般由以下七个关键字段惟一标识:
·源地址
·目的地址
·源端口号
·目的端口号
·第3层协议类型(如TCP,UDP)
·服务类型
·入逻辑接口标示符
1.2 流(Flow)格式
启动NetFlow的设备会输出其缓冲区里的信息,以UDP包的形式传送给NetFlow流量采集器。包由包头和若干流记录组成。常用的NetFlOW输出包格式共有5个版本,它们分别是Version 1,Version 5,Ver-sion 7,Version 8和Version 9,其中V5是最为流行和成熟的版本,目前得到最广泛的使用。最新的V9已经被列入IETF的标准,并有待进一步研究和规范。V9采用了模板技术与流记录相结合的方式,使NetFlow输出包的格式具有动态和可扩展的特性。NetFlow V9的输出格式主要由三部分构成:
(1)包头部(Packet Header):包括版本号、包中数据流总数、系统时间、数据流序列、数据源ID等。
(2)模板流集(Template FlowSet):包含一个或多个模板,模板是用于描绘数据流中各个数据段的含义,可以在路由器上根据需要自行设置模板。
(3)数据流集(。Data FlowSet):包含多个数据流,每个数据流集通过模板ID对应某个模板。数据采集端根据模板来解析数据流。
2 NetFlow流量采集与聚合
2.1 系统概述
根据NetFlow的特点,设计并实现了一个网络流量监测系统,其系统结构如图1所示。
当NetFlow采集器接收到从路由器发送来的Net-Flow数据包后,采集器将进行数据包的解析和数据流聚合,形成多种适合统计分析需要的数据,再分门别类地存入数据库。分析器则根据前端不同的查询请求,依照一定的查询策略从数据库不同的表中提取相应数据进行分析展现。
本系统的后台采集器和聚合处理部分用JAVA编写实现,数据库采用开源的MySQL,而NetFlow流量分析利用Tomcat服务器通过Web方式展现,前台部分用JSP编写实现。工作的重点即在于数据采集、数据聚合以及数据库设计部分。
2.2 NetFlow流采集
2.2.1 采集器的设计
数据采集模块是整个系统的基础。由于。NetFlow数据流量非常大,为防止丢包系统采用缓冲区和线程池结构,如图2所示。
当采集器监听到一个NetFlow数据包时,将该数据包接收到缓冲区,并从包解析线程池中取出一个线程,根据相应的NetFlow的报文格式解析出数据流信息,将该原始流信息放入缓冲区,然后将原始流存入数据库,同时采用相应的聚合策略聚合原始流生成聚合流并存入相应的数据库中。
2.2.2 NetFlow数据包接收与解析
由于NetFlow数据是借助于UDP数据报来传送,因而倘若后续的处理速度跟不上数据包到达的速度,则会出现严重丢包的现象。为解决高速大流量数据的及时接收及较低丢包率问题,采用了多线程的方式来实现。用独立的两个线程分别完成数据接收和解析操作:接收数据的线程在特定的IP地址监听相应的UDP端口,接收到的数据暂存在缓冲区中;解析线程从缓冲区提取数据,按照相应的报文格式进行解析。由于接收线程和解析线程共享同一个临界资源,即接收的缓冲区,需要对临界资源进行加锁操作。
下面为部分实现多线程采集的JAVA代码实例,其中packet为接收的NetFlow数据包对象,linkedLst为linkedList容器,利用synchronized进行线程间同步。
(1) 接收线程
2.3 NetFlow流聚合
NetFlow的原始数据数据量非常庞大,保存每一条流数据的原始记录将会使对数据进行查询分析时产生效率低下的问题,在绝大部分应用中也没有必要把数据粒度设计得如此之小。所谓流量聚合,是指对符合NetFlow数据格式的原始流记录根据一定条件进行流量合并,实现多条流合并为一条的过程,以实现原始流的压缩整理。
2.3.1 聚合策略
流量聚合有三个关键要素:聚合条件(F)、时间粒度(T)和聚合项(C)。满足相同聚合条件和时间粒度的流进行流量叠加,并保留聚合项。三元组聚合策略:<F,T,c>,其中:
按照实际流量分析的需要,从F,T,C中各取出一个值组成一个聚合策略。对于T的粒度要根据实际监控的时间长短和监测精度来设置,一般来说T=3 min适合于当天实时流量的监测;T=30 min用于一周流量的分析;T=3 h用于一月内流量的分析。
2.3.2 聚合的实现
对于一个新采集的原始流,必须能根据其所携带的聚合条件信息快速匹配是否已存在与其相同聚合条件的聚合流,若有则做流量叠加,若没有则创建一条新的聚合流。Hash表具有从Key快速映射到Value的特点,这种特点对于实时性较高的聚合非常有意义。图3为流量聚合的}Iash表设计。
在图3中聚合条件(F)作为Key,聚合项(C)作为Hash函数的映射值,时间粒度(T)作为Hash表导出到数据库的时间。这样可以满足实时流量监测的需要,同时也压缩数据减少存储空间,提高数据的查询效率。
3 实际NetFlow流采集与流量监测
在本系统设计的数据采集器的支持下,系统数据库为前端分析提供了充足且多样化的数据准备,前端程序只需通过简单的查询语句即可得到所需的数据集,简化了查询的工作量。利用该系统采集NetFlow数据包50 000个,时间持续约7 h,时间粒度为3 min,主要检验丢包情况,以及聚合后压缩效率。这次采集无丢包发生,表1为该系统采集的数据结果。
图4是系统由所采集的数据生成的该时段的流量监测图。
4 结 语
NetFlow数据流的海量特征使得服务器程序的效率至关重要,因此基于NetFlow的流量监测的主要任务是如何根据应用保存最重要的网络流特征以及如何更高效地实现数据检索。基于NetFlow特点,提出了一套适用于大流量网络的流量采集与聚合存储方案。流量采集通过多线程和缓冲区机制实现,有效提高了流量采集的可靠性。采集的原始流经聚合,并通过合理的分级存储策略进行存储组织,为前端的数据分析提供了全面支持。本系统在实际应用中取得了良好效果。下一步还将对采集和多级聚合存储方案进行改进,以丰富系统对网络流量统计分析功能,并力争为异常流量分析提供较为完善的数据支持。