基于NetFlow的MPLS VPN流量分析系统设计
2013-12-03程林钢李瑞华
程林钢 李瑞华
(1运城师范高等专科学校 山西运城 044000;2阳泉师范高等专科学校 山西阳泉 045200)
随着网络开放性、共享性和规模的进一步扩大,传统的Internet从原理上无法保证通信的安全性,网络安全问题变得越来越重要。在这种背景下,VPN(visual private network)应运而生,它可以在网络运营商提供的公共网络上建立公司、组织的私有网络,还可以充分保证通信的安全。为了更为灵活的应对多变的网络应用环境,越来越多的企业采用MPLS(multi-protocol label switch) VPN方式来组织规划网络,从而实现网络的高度可扩展性和可管理性[1]。因此,构建一个完整的基于NetFlow的MPLS VPN流量分析系统具有十分重要的意义。
1 MPLS VPN技术
多协议标签交换MPLS是利用标签和标记实现的一种网络层交换方式。作为新一代的网络架构,它不仅具有路由技术的灵活性优点,而且可以利用ATM交换技术对虚电路提供标签交换业务,从而将MPLS引入无连接的IP网络中。
MPLS使用标签(label)进行转发,这里的标签实质是32Bit且仅本地有效的数据。MPLS包头的结构如图1所示,其中1比特的S可用于判断是否为底层标签[2]。
图1 MPLS包头结构
MPLS 技术是一种数据包交换方式,利用MPLS的优势,可以用来设计解决网路问题,同时也可为下一代网络建设及规划提供有效的科学依据。MPLS VPN是目前比较适合于运营商的VPN技术[3]。利用MPLS VPN,可形成代表不同业务的多种VPN,从而使网络安全地传送不同的业务数据[1],实现更多的增值业务。
2 Netflow技术
NetFlow利用特定的模式将数据流中的数据进行交换,在交换过程中,NetFlow会将首次交换得到的数据进行缓存,从而为之后的数据处理提供依据。利用这种数据交换方式,可以使数据快速,安全地进行传输,并可以同时对所有数据进行统计,从而对数据的分析提供依据[5,6]。目前,NetFlow主要使用ASIC芯片实现数据的加速交换,这也成为了互联网界公认的流量分析标准。异常通信流量检测中所需的数据都可利用NetFlow技术对网络通信流量的分析得出,因此实质上是在最大限度地减小对路由器或者交换机性能的影响下提供网络数据包快速的交换功能。同时可以详细地记录通过路由器或者交换机的数据包的详细统计信息。
NetFlow是基于流(Flow)来实现的。这里的流的两端指的是源IP地址和目的IP地址,流便是这两端之间的数据包在交换时所形成的数据包流。
3 系统概述
系统主要设计并实现一个基于NetFlow的MPLS VPN流量分析系统。系统的网络拓扑如图2所示,连接在Cisco Catalyst 6509上的NetFlow 采集设备采集源IP地址与目的IP地址和MPLS VPN服务器IP地址相同的流数据,采集到的流数据即是流经MPLS VPN的流数据。通过对这些流数据的分析,可以随时掌握流经MPLS VPN的流量情况,为检测流量中的异常情况与流量计费提供依据。
图2 系统网络拓扑图
据此,笔者将MPLS VPN流量分析系统设计为3个模块:流量采集模块、流量聚合与存储模块、流量查询模块,图3为系统结构示意图。
图3 系统结构示意图
交换机将采集到的NetFlow信息送至流量采集模块,此模块对接收到的NetFlow信息进行预处理。之后,流量聚合与存储模块对从流量采集模块发来的数据按一定规则进行聚合,聚合后的数据保存到数据库。流量查询模块主要实现两个功能:实时流量的呈现和查询。
4 系统设计
4.1 流量采集
流量采集模块是整个系统的基础。要实现流量分析,首先要保证网络中产生的流量数据能被正确的记录下来,然后才能谈及流量分析。这个模块设计中的关键问题就是如何保证完整地采集到交换机发送的NetFlow数据包,并能正确地处理每一个数据包,得到所需数据。本模块采用多线程的程序设计模式,其中NetFlow数据包采集线程、数据包预处理线程、数据发送线程是常驻线程,从主程序开始运行后就一直在运行[4]。流量采集模块的功能设计图如图4所示。
图4 MPLS VPN流量采集模块功能设计图
4.1.1主线程设计[4]主线程需要系统提供一个记录配置信息的配置文件。这些配置信息是数据采集与预处理模块运行时所需的一些重要全局信息。这些信息在系统运行之前由系统管理员进行设置。它们包括接收NetFlow数据包的端口号、日志文件的目录等等。然后主线程将创建日志文件的目录,如果这个目录已经存在,则不需要重新创建。在数据采集与分析模块运行过程中的所有重要事件都会写到日志文件中,这样管理人员就可以随时了解系统的运行情况。这个日志文件是共享的,各个线程在运行过程中都会对这个文件进行操作。之后主线程将分别启动NetFlow数据包采集线程、数据包预处理线程、数据发送线程。
4.1.2数据包采集线程设计 数据包采集线程启动后,首先要进行一些初始化工作。主要是创建Socket连接并绑定到指定端口,准备接收从交换机发送来的NetFlow数据包。[4]一条完整的V5格式的NetFlow数据流的大小是一个24字节的报文头和30条48字节的流记录,它的完整长度是1464字节,所以需要定义一个内存区域用来接收NetFlow数据包[4]。缓冲区的定义如下:
Byte[] buff=new Byte[1464];
定义完缓冲区后,由于NetFlow数据流是采用UDP发送的,所以笔者采用UDP形式接收NetFlow数据流。为了防止NetFlow包的丢失,在实现中使用了缓冲技术,将所有接收到的NetFlow输出包经过分析后存入一个队列q_capture中[4]。之后再从队列中提取数据,进行安全性检查,从而丢弃非法数据,只处理合法数据。
4.1.3数据包预处理线程设计 NetFlow数据包被采集并插入q_caputre队列后,等待数据包预处理线程进行处理。笔者需要对NetFlow流记录中的数据项进行提取并统计。需要统计的数据项的值通过以下方式实现[5]:
buff.read(record,0,8);//读取8个字节(源IP地址和目的IP地址)
buff.skip(8);//略过8个字节不用的数据
buff.read(record,8,8);//读取各占4个字节的流报文数和流字节数
buff.skip(8);//略过8个字节不用的数据
buff.read(record,8,8);//读取4个字节(源端口和目的端口)
buff.skip(2);//略过2个字节不用的数据
buff.read(record,20,1);//读取1个字节的协议
线程首先将等待数据进入q_capture队列,这个等待是一个有时间限制的等待,而不是无限期等待。这个期限被设置为5s。如果在5s内,事件对象仍未变成已通知状态,将会超时并重新开始循环[5]。
当q_capture队列中有数据之后,线程将从其成员队列的头部取出一个元素,这是一个NetFlow数据包,在一个NetFlow数据包中含有最多30个记录,因此需要逐条地取出这些记录[5]。然后依次读取每条流记录中的相关字段,将字段存储到flow结构中,等待发送。同时为了防止不可预知的错误,以及发送不成功的情况,笔者设置了另一个队列q_send,此时将flow结构插入q_send队列等待发送[5],流程如图5所示。
图5 数据包预处理线程流程图
4.1.4数据包发送线程设计 线程首先创建流量聚合与存储模块的Socket连接,并将该Socket绑定到配置文件中指定的数据发送端口[5]。之后线程将查看队列中的数据,若检测到队列中有数据入队,则线程发送该机构;如果没有发送成功,将会尝试重新发送。如果尝试次数超过设定的重试次数后仍未发送成功,线程将会弹出一个消息框提示系统管理人员发送数据时出错[5]。
4.2 流量聚合与存储
因为流量采集模块会采集到网络中所有的数据,因此数据量会非常庞大,为避免数据库的快速膨胀而降低后期数据查询的效率,笔者对流量采集模块发来的数据先按一定规则进行聚合,将聚合后的数据保存到数据库。流量聚合与存储模块的功能设计图如图6所示。
图6 流量聚合与存储模块的功能设计图
4.2.1主线程设计 主线程启动后首先从配置文件中读取配置信息。这些配置信息是流量聚合与存储模块运行时所需的一些重要全局信息[5]。它们包括运行NetFlow流量采集模块的流量采集设备数据发送的IP地址和端口、日志文件的目录等等[4],然后主线程将创建日志文件的目录。在流量聚合与存储模块运行过程中的所有重要事件都会写到日志文件中,这样管理人员就可以随时了解系统的运行情况。这个日志文件是这个模块中各个线程共享的,各个线程在运行过程中都会对这个文件进行操作。然后主线程将分别启动数据接收线程、流量聚合线程、数据存储线程。
4.2.2数据接收线程设计 数据接收线程启动后,首先建立Socket,用来连接到流量采集设备指定端口,等待流量采集模块发送数据过来,同时建立一个flow结构用来接收数据[5]。这个结构同流量采集模块中的flow结构必须一样,这样才能保证正确的接收数据,然后线程将监听指定端口。如果有数据到达,先判断该数据中包含的源IP地址或目的IP地址是否与MPLS VPN服务器的IP地址相同,如果相同,说明是符合用户要求的数据,则将数据存入flow结构,否则,将数据丢弃。为了防止流量聚合模块不能及时的处理数据,笔者将flow结构先插入q_recieve队列中,等待流量聚合线程处理。
4.2.3数据聚合线程设计 将q_recieve队列中取出的flow结构进行聚合后生成的是源网段地址、目的网段地址、源端口号段、目的端口号段、包尺寸分布等[4]。可按如下不同准则进行聚合:
对源网段聚合:统计出一个间隔时间(3min)内同一源IP(取子网地址)的流个数和流量大小[4]。由于我们只针对流经MPLS VPN的流量进行分析,如果源IP为MPLS VPN的IP地址,则其发出的流量即为其它IP地址接收的流量,所以,在聚合时,并不聚合源IP为MPLS VPN的IP地址的流量。
图7 数据聚合线程流程图
对目的网段聚合:统计出一个间隔时间(3min)内同一目的IP(取子网地址)的流的个数和流量大小[4]。
对数据包尺寸分布聚合:将数据包长度划分为0-10Byte,10-50Byte,50-100Byte,100-200Byte,200-1000Byte,大于1000Byte的几个区域[4]。
对协议类型聚合:按协议类型,统计出各协议中流个数[4]。
线程启动后,首先检查q_recieve队列中是否有数据。当q_recieve队列中有数据之后,线程将从其成员队列的头部取出一个元素,这是一个flow结构,然后依次读取结构中的相应字段按规则进行聚合,将所有聚合信息存储到info结构中,等待保存到数据库。同时为了防止不可预知的错误,以及保存不成功的情况,笔者设置了另一个队列q_save,此时将info结构插入q_save队列等待保存到数据库。[4]
其中,info结构的定义如下:
public struct head
{
string time; //时间戳
int all_in_flow; //流入总流量
int all_out_flow; //流出总流量
string[] src_subnet; //源子网
int[] src_net_flow; //由源子网发出的流量
string[] dst_subnet; //目的子网
int[] dst_net_flow; //由目的子网接收的流量
string[] port_area; //端口号段
int[] src_port_flow; //源端口中各端口号段的流量
int all_src_port //端口号段的出口总流量
int[] dst_port_flow; //目的端口中各端口好段的流量
int all_dst_port; //端口好段的入口总流量
string[] data_area; //数据包长分段
int[] data_num; //各包长段内的流个数
string[] procotol; //协议类型分布
int[] proc_num; //各协议类型流个数
int all_num; //总流个数
}
4.2.4数据存储线程设计[4]线程启动后,将首先检查q_save队列中是否有数据。当队列中有数据时,线程将从队列头部取出一个info机构的元素,线程将插入该结构到数据库的相关表中。如果没有插入成功,将会尝试重新插入。如果尝试次数超过设定的重试次数后仍未插入成功,线程将会弹出一个消息框提示系统管理人员发送数据时出错,并且产生错误的可能原因会写入日志文件,系统管理人员应该根据日志中提供的信息解决这个故障。在故障排除后,线程将继续尝试插入。
4.3 流量查询
通过实时流量的查询和显示,可以形成随时间变化的网络流量曲线图,这对于我们分析网络及流量状况有重要价值。通过流量的查询,可以统计分析一段时间内网络流量特征,为用户网络行为及分析等提供依据。此模块采用B/S方式,利用ASP.NET技术实现通过Web方式发布数据。实时流量曲线图通过Crystal Reports生成,并通过AJAX实现定时更新。
5 系统评估
在实现基于NetFlow的VPN流量分析系统之前,首先需要在交换机上启用NetFlow功能并配置NetFlow数据导出。NetFlow在交换机上的配置如下:
Switch(config)#mls NetFlow
!— Enables NetFlow on the PFC.
!
Switch(config)#mls flow ip full
!—Configures flow mask on the PFC.
!—In this example, flow mask is configured as full.
!
Switch(config)#interface Vlan10
Switch(config-if)#ip route-cache flow
Switch(config-if)#exit
Switch(config)#interface Vlan20
Switch(config-if)#ip route-cache flow
Switch(config-if)#exit
Switch(config)#interface fastEthernet 3/1
Switch(config-if)#ip route-cache flow
本MPLS VPN流量分析系统中,MPLS VPN服务器采用OpenVPN-AS(并发用户数50)。整个实验中流量数据为校外访问用户实际发生的流量。通过系统运行,实时流数据的呈现如图8所示。
图8 包长分布实时流量图
对于本系统,要保证其稳定性,就必须保证各模块之间的处理速度上的平衡,即流量聚合与存储模块处理速度大于流量采集与预处理处理速度。只有这样,整个系统才能保证其稳定性,否则,必将在某个接口处造成资源的竞争现象。当资源竞争情况加剧时,就会造成系统的崩溃。经过连续1个多月的实际流量的采集、分析,结果表明,系统能够维持其良好的稳定性,并且对数据的处理能够做到准确和及时两个方面。
6 结束语
本系统根据NetFlow的特点,设计并实现了一套基于NetFlow的MPLS VPN流量分析系统,系统采用多线程方式实现,有效提高了流量采集、聚合、分析的效率。通过本系统,可以灵活、方便地了解网络资源的使用情况,根据流量数据合理监控网络,保证企业业务的顺畅运行。
参考文献:
[1]张峰,郑振华,徐深超.基于MPLS VPN的流量统计技术[J].信息技术,2011,35(3):29.
[2]陈震. VPN 技术及其应用研究[J].电脑知识与技术,2009,16(4):798.
[3]金爽.基于NetFlow的实时安全事件检测技术研究[D].哈尔滨:哈尔滨工业大学,2009.22.
[4]邹文峰.网络流量监测及页载均衡技术研究[D].合肥:网络科技大学,2009.16.
[5]张浚.基于多特征相似度的大规模网络异常检测[D].北京:电子科技大学,2007.23.
[6]孙文胜,赵问吉. 基于MPLS VPN的IP承载网保证措施的研究[J]. 杭州电子科技大学学报,2012,32(5):253.
[7]杨宝航.MPLS技术在网络改造中的应用研究[D].呼和浩特:内蒙古大学,2011.18.
[8]许经彩,王新华,孙倩,等.一种不精确状态MPLS路由算法[J]. 计算机工程与应用,2011,47(23):165.
[9]何璐莹.MPLS VPN技术研究与应用[J].现代电子技术,2011,34(15):201.