基于流管理的报文数据检测方法
【技术领域】
[0001]本发明涉及网络信息传输安全技术领域,具体涉及基于流管理的报文数据检测方法。
【背景技术】
[0002]随着网络的发展和各种应用层协议的出现,基于报文数据内容分析和检测的设备(如IPS,协议识别,行为审计等)相应产生。这些设备的主要工作原理是从报文数据的应用层信息中,查找某些特定关键字(深度检测/状态检测),从而达到识别协议,病毒,攻击等信息的目的。
[0003]因为tcp协议的特性决定了,通信双方的数据通常不会在一个报文数据中发送完成,一般是在多个报文数据中发送完成的。针对这一特性,攻击者往往会把病毒、攻击等关键信息隐藏在多个数据报文数据之间,单个数据报文数据经过检测设备时,由于单个报文数据所带检测信息不完整,所以检测不出对应的病毒、攻击信息,从而达到了逃避检测的目的。
[0004]为解决上述问题,目前常采用对同一条流同一个方向上的多个报文数据进行重组,把多个报文数据重新组合在一起,还原用户发送的数据,再将还原的报文数据进行深度检测,解决病毒、攻击信息跨报文数据的问题,从而提高检测精度。
[0005]然而如果按照上述方法,对用户数据进行重组检测,会带来如下两个方面问题:1、流重组需要将同一条流的多次数据进行缓存,达到一定时机后,再将用户数据拷贝在一起,将重组完的数据再进行一次检测,这样做会占用大量的设备资源,大大降低了设备的处理性能。2、当重组检测出攻击、病毒时,由于原始的用户数据不带攻击、病毒信息,此时原始数据已经“绕过”攻击检测设备,到达用户主机,攻击、病毒已经生效,所以当重组检测出攻击、病毒信息时,为时已晚,只能发出告警信息告知用户。
【发明内容】
[0006]针对现有技术中的上述不足,本发明提供了一种在对报文数据中是否携带病毒、攻击信息进行检测时,占用内存小的基于流管理的报文数据检测方法。
[0007]为了达到上述发明目的,本发明采用的技术方案为:
提供一种基于流管理的报文数据检测方法,其包括以下步骤:
接收网络中的当前报文数据,并提取当前报文数据中的五元组信息;
对五元组信息进行排序后,采用hash算法将五元组信息转化为标识号,并判断是否存在具有标识号和五元组信息的流;
若存在,则先确定当前报文数据的方向,再判断当前报文数据是否是该方向上,上一个报文数据的下一个报文数据;;
若是,读取上一个报文数据的检测状态,并采用AC算法接着上一个报文数据的检测状态对下一个报文数据进行检测; 判定是否存在与流的方向相同的报文数据未进行检测,若不存在,更新最后一次的检测状态到流管理内存中。
[0008]本发明的有益效果为:在对报文数据中是否携带病毒、攻击信息进行检测时,在确定当前报文数据是上一个报文数据的下一个报文数据后,读取上一个报文数据的检测状态继续检测,在检测过程中只存在报文数据的检测状态,不需要对大量报文数据进行缓存等待重组报文数据,从而节省内存拷贝时间,提升了处理性能,降低了内存使用率。
[0009]由于本方法在客户端发送的原始报文数据时就能检测到攻击信息或病毒,而不是重组报文数据后,这样我们可以针对原始报文数据进行丢弃处理,这样攻击信息到达不了目的地,有效阻止了攻击的发生,从而保证了网络的安全。
【附图说明】
[0010]图1为基于流管理的报文数据检测方法的流程图。
【具体实施方式】
[0011]下面对本发明的【具体实施方式】进行描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于【具体实施方式】的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
[0012]参考图1,图1示出了基于流管理的报文数据检测方法的流程图;如图1所示,该基于流管理的报文数据检测方法包括以下步骤:
接收网络当中的当前报文数据,并提取当前报文数据中的五元组信息,之后对五元组信息进行排序;这里的五元组信息为源IP地址、源端口、目的IP地址、目的端口和传输层协议。
[0013]对当前报文数据中的五元组信息进行排序的主要目的是是:因为一条流有两个方向,以 pc (pc 的 IP 为 1.1.1.1,端口为 3340)访问 baidu (baidu 的 IP 为 2.2.2.2,端口为80)为例,pc发往baidu的报文数据为客户端方向,baidu发往pc的报文数据为服务器方向。
[0014]客户端报文数据提取出来的五元组信息为(1.1.1.1,2.2.2.2,3340,80),服务器端报文数据提取出来的五元组为(2.2.2.2,1.1.1.1,80,3340),如果不将五元组信息进行排序,客户端方向和服务器方向的五元组计算出来的流ID (标识号)会不一样,因此也就不属于同一条流了,这显然不符合要求。需要将客户端和服务器的五元组信息排序后,再算流ID,这样保证两个方向的报文数据会计算出同一个流ID。最终客户端和服务器端按大小排序后五元组为(2.2.2.2,1.1.1.1,3340,80)。
[0015]对五元组信息进行排序时,主要是将源目IP地址与目标IP地址进行比较,将数据较大的放在前面;而对源端口和目的端口进行比较时,也是将将数据较大的放在前面;以使客服端发向服务器的五元组信息与服务器发向的客服端的五元组信息相同。
[0016]对五元组信息进行排序后,采用hash算法将五元组信息转化为标识号,并判断是否存在具有相同标识号和五元组信息的流;其中的hash算法的目的是将一片数据(五元组信息)映射成为一个数值,相同的数据一定会映射成为同一个数值,不同的数据也有概率映射成为同一个数值(概率极低)。因此要判断是否是同一条流,可以先比较一下流ID (标识号,也即身份信息),如果流ID不一样,那么一定不是同一条流,如果流ID —样,再比较流中存放的五元组是否和当前报文数据的五元组一致,如果一致则是同一条流,如果不一致,则不是同一条流。
[0017]若存在具有相同标识号和五元组信息的流,则确定当前报文数据的方向,再判断当前报文数据是否是该方向上,上一个报文数据的下一个报文数据。
[0018]其中,确定当前报文数据的方向的方法为:分析当前报文数据中是否为SYN包:若是,则当前报文数据为客户端方向,当前报文数据所在的五元组为客户端五元组,如果后续报文数据的五元组与客户端五元组相同,则报文数据是客户端方向,如果相反,则报文数据的服务器端方向。
[0019]由于tcp协议特性决定了 SYN包一定为客户端发往服务器端,所以在进行流管理的时候,如果当前报文数据为SYN包,则可以确定当前报文数据为客户端发送服务器方向。
[0020]若不存在具有相同标识号和五元组信息的流时,新建具有标识号的流,之后进入读取上一个报文数据的检测状态步骤。
[0021]判断当前报文数据是否为上一个报文数据的下一个报文数据的具体操作方法为:
读取当前报文数据的序号,并将其序号与存储的期望值进行比较:
若当前报文数据的序号等于期望值(sequence字段),则判定当前报文数据为上一个报文数据的下一个报文数据;
若当前报文数据的序号大于期望值,表明当前报文数据时乱序需要进行乱序重排,对当前报文数据进行存储,当期望值每更新一次就需要读取存储的报文数据,直至存储的报文数