发明内容
本发明提供了一种网络传输数据病毒检测处理方法,其在不改变原始连接任何特征的前提下,通过流引擎和文件引擎的双重检测,保证了对带有病毒的计算机传输文件及时和准确的阻断。
为实现本发明目的而提供的一种网络传输数据病毒检测处理方法,包括如下步骤:
步骤S100,在网卡的内核层中设置预设大小的常驻内存作为零拷贝内存,并配置为零拷贝sk_buff结构的栈式分配队列,同时在内核层设置与栈式分配队列的索引相应的接收队列和放走队列,对网络传输的收发数据包进行分配和释放;
步骤S200,通过虚存技术设置将所述零拷贝sk_buff结构的栈式分配队列、数据包接收队列和放走队列映射到用户层,在用户层以虚地址方式访问;
步骤S300,在网卡处理收包软中断时,网卡驱动接收传输的数据包,将其传输入栈到零拷贝sk_buff结构的栈式分配队列中,并将接收数据包结构中的索引写入栈到接收队列;
步骤S400,将步骤S300中接收到的网卡数据包的sk_buff结构的栈式分配队列、写入接收数据包的sk_buff结构的索引的接收队列、以及放走队列通过映射设备文件映射到应用层,得到相应的写入网卡数据包的镜像分配队列、镜像接收队列和镜像放走队列;
步骤S500,在用户层从镜像分配队列中读取相应的网卡数据包,将映射的网卡数据包解析还原,并将还原出的数据内容交给查毒引擎进行检测,将带有病毒的数据包丢弃,或者将无病毒的数据包转发,并出栈释放相应的索引。
较优地,作为一可实施例,所述步骤S100,在网卡的内核层中设置预设大小的常驻内存作为零拷贝内存,并配置为零拷贝sk_buff结构的栈式分配队列,同时在内核层设置与栈式分配队列的索引相应的接收队列和放走队列,对网络传输的收发数据包进行分配和释放;
包括如下步骤:
步骤S110,在网卡的内核层的低端内存中设置预设大小的常驻内存作为零拷贝内存;
步骤S120,将所述零拷贝内存分配为POOL_SIZE/2整数个物理页,每个物理页大小为4096字节,且设定为不允许换出到交换空间,并将每个物理页等分为2个半页,每个半页大小为2048字节,用于收发数据包;其中,POOL_SIZE/2为大于1的整数;
步骤S130,分配POOL_SIZE个sk_buff结构到零拷贝内存的POOL_SIZE个物理半页中,作为零拷贝sk_buff结构的零拷贝内存;
步骤S140,在零拷贝sk_buff结构中配置index域记录对应物理半页在零拷贝内存中的索引,使得每个索引一一对应绑定零拷贝sk_buff结构的零拷贝内存半页;
步骤S150,配置零拷贝sk_buff结构为栈式分配队列,在分配sk_buff结构时采用压栈操作,在释放sk_buff结构时采用出栈操作。
步骤S160,根据所述零拷贝内存的索引,在内核层中设置数据包接收队列和放走队列。
较优地,作为一可实施例,所述步骤S500,在用户层从镜像分配队列中读取相应的网卡数据包,将映射的网卡数据包解析还原,并将还原出的数据内容交给查毒引擎进行检测,将带有病毒的数据包丢弃,或者将无病毒的数据包转发,并出栈释放相应的索引;
包括如下步骤:
步骤S510,应用层从镜像接收队列里收取索引并读取数据包后,释放镜像接收队列中的索引,并将该索引写入镜像放走队列的尾部;
步骤S520,根据用户层虚存中的镜像接收队列得到零拷贝内存映射到用户层的数据包,解析TCP/IP协议栈并对TCP连接进行跟踪管理,转发数据包,解析应用层协议,还原出传输文件的片段;
步骤S530,在应用层对解析得到的数据包利用查毒引擎进行病毒检测,并根据对数据包检测结果和数据包次序判断,对网卡数据包及sk_buff结构的栈分配队列进行处理。
较优地,作为一可实施例,所述步骤S530中,在应用层对解析得到的数据包利用查毒引擎进行病毒检测,并根据对数据包检测结果和数据包次序判断,对网卡数据包及sk_buff结构的栈分配队列进行处理;
包括如下步骤:
步骤S531,在应用层对解析得到的数据包使用流引擎进行数据包的数据片段进行病毒特征检查,在发现传输文件带毒时,即时阻断连接,破坏传输文件并断开连接,并释放镜像放走队列中的索引;
步骤S532,如果数据包经过流引擎检测表明无病毒特征,且该数据包不是传输文件的最后一个数据包,则该数据包不必扣留而直接转发;如果数据包是传输文件的最后一个包,则表明传输文件还原完成,将还原的临时文件交给文件引擎做彻底的病毒检测,并扣留该传输文件的最后一个数据包直到文件引擎完成查毒;
步骤S533,文件引擎查毒完成后,如果确认文件无毒,则按照正常应用层转发流程,将该数据包的索引放入转发网卡镜像放走队列tail指向的位置,并且取消对该连接后续数据包的阻拦;转发网卡的内核层则在网卡软中断中,从内核放走队列的头部读取索引,并根据索引查找到对应的sk_buff结构,将数据包填入网卡的发包环形队列传送出去,按照出栈操作释放该sk_buff结构对应的索引;
步骤S534,如果文件引擎查毒完成后,如果确认文件带毒,则丢弃扣留的数据包,阻断对应的TCP连接,并且取消对该连接后续数据包的阻拦,直接进行出栈操作释放sk_buff结构对应的索引。
较优地,作为一可实施例,所述步骤S531中,即时阻断连接,破坏传输文件并断开连接,并释放镜像放走队列中的索引,包括如下步骤:
在丢弃数据包时,调用ioctl()函数传入该数据包的对应的镜像放走队列中的索引,在内核层找到该索引对应的sk_buff结构,直接释放,并进行出栈操作释放镜像放走队列中的索引。
较优地,作为一可实施例,所述步骤S532中,扣留该数据包直到文件引擎完成查毒,是通过ioctl()函数调用完成,包括如下步骤:
步骤S5321,在阻断数据包对应的TCP连接时,调用ioctl()函数传入该数据包的对应的镜像放走队列中的索引,在内核层中查找到该索引对应的sk_buff结构,根据sk_buff的数据包特征,伪造rst连接重置包发往收包方,达到阻断连接的目的,并将被扣数据包的TCP四元组添加到预先设置的阻拦特征哈希表中;
步骤S5322,在扣包期间阻拦连接上后续数据包时,调用ioctl()函数传入后续数据包的对应的镜像放走队列中的索引,在内核层中找到该索引对应的sk_buff结构,将sk_buff给出的连接特征中TCP四元组,与内核层中的阻拦特征哈希表进行比对,并在查找到与被扣数据包TCP四元组特征相同时,直接丢弃该后续数据包。
较优地,作为一可实施例,所述步骤S533中,取消对该连接后续数据包的阻拦,包括如下步骤:
在文件引擎查毒完成并允许连接上后续数据包时,调用ioctl()函数传入被扣数据包的对应的镜像放走队列中的索引,在内核层中找到该索引对应的sk_buff结构,根据sk_buff给出的连接特征的TCP四元组,在阻拦特征哈希表中匹配查找到并删除对应的被扣数据包的TCP四元组。
本发明的有益效果为:
本发明的网络传输数据病毒检测处理方法,具有以下有益效果:1)解决了防毒墙在高吞吐环境下的性能扩展问题,满足千万兆环境下的网络数据流查毒需求;2)实现了防毒墙的彻底透明,不改变原始TCP连接的任何特征,无需任何配置,即插即用,类似一根具备查毒功能的“导线”,称为“导线式防毒墙”;3)使得防毒墙系统与操作系统(如Linux系统)内核之间的耦合大大减小,简化了设备的升级和维护,最大程度利用操作系统内核的各种技术特征完成病毒数据处理。
具体实施方式
下面结合说明书附图,对本发明实施例中的网络传输数据病毒检测处理方法的具体实施方式进行说明。
本发明实施例网络传输数据病毒检测处理方法,包括如下步骤:
步骤S100,在网卡的内核层中设置预设大小的常驻内存作为零拷贝内存,并配置为零拷贝sk_buff结构的栈式分配队列,同时在内核层设置与栈式分配队列的索引相应的接收队列和放走队列,对网络传输的收发数据包进行分配和释放。
在网卡的内核层中设置预设固定大小的常驻内存作为零拷贝内存,用于网卡收包队列的分配和释放。
本发明实施例中,作为一种可实施方式,所述步骤S100包括如下步骤:
步骤S110,在网卡的内核层的低端内存中设置预设大小的常驻内存作为零拷贝内存;
较佳地,作为一种可实施方式,在32位Linux内核中,896MB以下的物理内存为低端内存,在该32位Linux内核的低端内存中,设置预设大小的常驻内存作为零拷贝内存,该零拷贝内存用于网卡收发包队列的分配。
步骤S120,将所述零拷贝内存分配为POOL_SIZE/2整数个物理页(POOL_SIZE/2为大于1的整数),每个物理页大小为4096字节,且设定为不允许换出到交换空间,并将每个物理页等分为2个半页,每个半页大小为2048字节,用于收发数据包;
较佳地,作为一种可实施方式,在内核层的低端内存中分配POOL_SIZE/2整数个物理页,在图2中以方块表示。每个物理页大小为4096字节,且设定为不允许换出到交换空间。每个物理页等分为2个半页,每个半页大小为2048字节。在零拷贝内存中,每个半页被称为零拷贝半页,用于收取数据包。
步骤S130,分配POOL_SIZE个sk_buff结构到零拷贝内存的POOL_SIZE个物理半页中,作为零拷贝sk_buff结构的零拷贝内存;
sk_buff结构是现有操作系统(如Linux系统)内核层中网络数据包处理的核心数据结构,每个sk_buff结构对应并存储一个网络数据包。
步骤S140,在零拷贝sk_buff结构中配置index域记录对应物理半页在零拷贝内存中的索引,使得每个索引一一对应绑定零拷贝sk_buff结构的零拷贝内存半页;
由于相对于地址寻址方式,索引更容易在内核层与应用层之间传递和引用,本发明实施例中,较佳地,作为一种可实施方式,在零拷贝sk_buff结构中配置index域记录对应零拷贝内存中物理半页的索引。物理半页的索引是根据该物理半页在零拷贝内存中的偏移而配置,根据该物理半页的索引和零拷贝地址就可以确定零拷贝内存中任一物理半页的地址从而寻址到该物理半页而读写其中的内容。
本发明实施例中,零拷贝sk_buff结构与POOL_SIZE个零拷贝半页通过利用索引一一对应且绑定使用:每一个sk_buff结构都可以被分配给网卡驱动用于收发网络数据包,网络数据包的内容存放在对应的物理半页中。
步骤S150,配置零拷贝sk_buff结构为栈式分配队列,在分配sk_buff结构时采用出栈操作,在释放sk_buff结构时采用压栈操作;
如图2所示,为了便于零拷贝sk_buff结构的分配,作为一种可实施方式,本发明实施例中,利用栈结构技术进行内存分配和释放,将配置零拷贝sk_buff结构为栈式分配队列,栈头以top表示,分配sk_buff结构地采用出(pop)栈操作,在释放sk_buff结构时采用压(push)栈操作。
步骤S160,根据所述零拷贝内存的索引,在内核层中设置数据包接收队列和放走队列。
内核层接收队列是在内核中分配的与零拷贝物理半页数量相等的队列,队列通过head从头部读取,通过tail向尾部写入。队列的每一项都可以存放一个零拷贝半页的索引,这个索引相应于sk_buff结构中的index域,借助该索引,可以找到对应的sk_buff结构和零拷贝半页。
类似地,放走队列与接收队列结构完全相同,因此在本发明实施例中不再一一详细描述。
步骤S200,通过虚存技术设置将所述零拷贝sk_buff结构的栈式分配队列、数据包接收队列和放走队列映射到用户层,在用户层以虚地址方式访问。
本发明实施例中,通过虚存技术设置,将该零拷贝sk_buff结构的栈式分配队列、数据包接收队列和放走队列映射到用户层,使得查杀毒计算机病毒的进程可以直接通过该用户层中的虚存进行访问,从而避免内核空间与用户层的拷贝;
本发明实施例中,通过虚存映射方法将该零拷贝内存、数据包接收队列和放走队列映射到网卡的用户层,并在用户层以虚地址方式直接访问,同时将数据包在内核中直接转发,从而绕开内核TCP/IP协议栈,而且其不依赖于内核桥接技术的数据包转发,从而剥离了与内核的紧密耦合关系,避免数据包在内核与用户层之间的拷贝,提高数据包的处理效率。
本发明实施例中,根据所述零拷贝内存的索引,在内核层中设置数据包接收队列和放走队列,并通过虚存映射方法,同时将这两个队列映射到应用层。
本发明实施例中,称应用层的接收队列为镜像接收队列,称应用层的放走队列为镜像放走队列,称应用层的零拷贝sk_buff结构的栈式分配队列为镜像分配队列。
作为一种可实施方式,映射由图2底部的方块表示,这些区域表示零拷贝内存在用户层中的映射。
作为一种可实施方式,应用层访问镜像分配队列、镜像接收队列和镜像放走队列通过映射设备文件完成的,通过在内核层中为每个网卡添加了一个字符型虚拟设备,应用层则透过对应于该字符型虚拟设备的设备文件完成对镜像分配队列、镜像接收/放走队列的映射和访问操作。
通过虚存映射方法设置将网卡的内核层数据映射到网卡的用户层,并在用户层以虚地址方式访问,是一种现有技术,因此,在本发明实施例中,不再一一详细描述。
步骤S300,在网卡处理收包软中断时,网卡驱动接收传输的数据包,将其传输入栈到零拷贝sk_buff结构的栈式分配队列中,并将接收数据包结构中的索引写入栈到接收队列。
如图3所示,现有技术中,高性能网卡如千兆/万兆网卡中普遍采用硬件环形队列结构,通过在收包环形队列中预留多个sk_buff结构,持续接收数据包时,由网卡DMA(Direct Memory Access,直接内存存取)将数据包连续写入多个sk_buff结构;发包时可向发包环形队列加入若干sk_buff结构,由网卡DMA将数据包从网口连续发出。当预留的sk_buff结构被到来的数据包填充并交付处理流程时,补充预留的sk_buff结构;当网卡发包完毕时,数据包占用的sk_buff结构随即释放。现有技术中内核层调用函数skb_alloc()和skb_free()为网卡分配和释放sk_buff数据结构。而现有技术中,由skb_alloc()分配的sk_buff结构的地址是无法预测的。
本发明实施例中,为实现对网卡传输的数据包的计算机查杀毒处理,作为一种可实施方式,将现有技术中的skb_alloc()函数和skb_free()函数修改为modified_skb_alloc()函数和modified_skb_kfree()函数,使得sk_buff结构的分配和释放是在零拷贝sk_buff结构的栈式分配队列中进行的,而不是随机分配,如下所示:
这样,通过modified_skb_alloc()函数和modified_skb_kfree()函数,在网卡驱动NAPI(New API)软中断转发数据的过程中,将网卡分配和释放数据包强制入栈或出栈到本发明设置的零拷贝内存的零拷贝sk_buff结构的栈式分配队列中,而零拷贝内存的零拷贝sk_buff结构的栈式分配队列被映射到用户层,为实现用户层数据包控制查杀毒做好了准备。
图3中一对构成转发关系的网卡eth0和eth1,图中用虚线表明了2块网卡之间的转发关系。
作为一种可实施方式,构成转发关系的一对网卡eth0和eth1,在网卡分配过程中,在分配sk_buff结构到网卡eth0的收包环形队列的时,采用modified_skb_alloc()函数,直接将数据包所在的sk_buff结构中的零拷贝半页的索引(即所述的sk_buff的index域)放入网卡eth0的收包环形队列(接收队列)。
在接收网卡数据包的同时,本发明实施例中,将接收数据包的sk_buff结构中的索引(index)直接写入栈到内核层接收队列的尾部,如图4所示。
步骤S400,将步骤S300中接收到的网卡数据包的sk_buff结构的栈式分配队列、写入接收数据包的sk_buff结构的索引的接收队列、以及放走队列通过映射设备文件映射到应用层,得到相应的写入网卡数据包的镜像分配队列、镜像接收队列和镜像放走队列。
在接收数据包的sk_buff结构中的索引(index)写入内核接收队列的尾部后,应用层则从镜像接收队列的头部读取这些索引,并找到对应的镜像分配队列中sk_buff结构的零拷贝半页网卡数据包,如图4所示。
如图4所示,构成转发关系的一对网卡eth0和eth1,网卡分配(接收)和释放(发包)sk_buff结构在零拷贝内存中进行,直接将数据包所在的sk_buff结构中的零拷贝半页的索引(即所述的sk_buff的index域)放入图4中部的eth0的接收队列,从而绕开了内核的TCP/IP协议栈和socket机制。
如图4所示,通过eth0映射设备文件和eth1映射设备文件,将网卡的镜像分配队列、接收队列和放走队列映射到用户层,用户层查毒进程通过打开映射设备文件,将网卡镜像分配队列、接收队列和放走队列映射到查毒进程的虚存空间,进行直接访问。
作为一种可实施方式,当用户层进程和内核层同时访问接收队列或者放走队列时,可以通过虚存本身的镜像分配队列的head指针和内核层栈式分配队列的tail指针进行同步:内核层通过写指针tail访问接收队列,用户层进程通过读指针head访问镜像接收队列。
设eth0网卡上收取数据包并放入eth0接收队列tail指向的位置,则用户层进程通过head指针从镜像接收队列获取数据包对应的sk_buff结构和零拷贝半页的索引,并通过该索引访问镜像分配队列的数据包的具体内容。
步骤S500,在用户层从镜像分配队列中读取相应的网卡数据包,将映射的网卡数据包解析还原,并将还原出的数据内容交给查毒引擎进行检测,将带有病毒的数据包丢弃,或者将无病毒的数据包转发,并出栈释放相应的索引。
具体地,所述步骤S500包括如下步骤:
步骤S510,应用层从镜像接收队列里收取索引(index)并读取数据包后,释放镜像接收队列中的索引,并将该索引(index)写入镜像放走队列的尾部;
步骤S520,根据用户层虚存中的镜像接收队列得到零拷贝内存映射到用户层的数据包,解析TCP/IP协议栈并对TCP连接进行跟踪管理,转发数据包,解析应用层协议,还原出传输文件的片段;
本发明实施例中,绕开Linux内核的TCP/IP协议栈,在网卡处理收包软中断时,将所述零拷贝内存中的数据包直接映射给用户层,解析TCP/IP协议栈并对TCP连接进行跟踪管理,转发数据包,解析应用层协议,还原出传输文件并交给查毒引擎进行检测,其绕开正常的内核协议处理流程,直接将数据包送达应用层,与内核的耦合度基本降到零。
数据包经过以太层、IP层协议的解析,IP分片包的重组;TCP层协议的解析,TCP层连接的建立和维护,用于跟踪TCP连接和子连接(例如FTP数据连接),乱序包定序;应用协议层(例如HTTP/FTP/SMTP/POP3等协议)的解析,协议传输文件的还原和临时文件的保存,然后就可以将还原文件的片段交给流引擎进行病毒特征检测。
所述将数据包进行以太层、IP层协议的解析,IP分片包的重组;TCP层协议的解析,TCP层连接的建立和维护,用于跟踪TCP连接和子连接(例如FTP数据连接),乱序包定序;应用协议层(例如HTTP/FTP/SMTP/POP3等协议)的解析,协议传输文件的还原和临时文件的保存,是一种现有技术,因此,在本发明实施例中,不再一一详细描述。
步骤S530,在应用层对解析得到的数据包利用查毒引擎进行病毒检测,并根据对数据包检测结果和数据包次序判断,对网卡数据包及sk_buff结构的栈分配队列进行处理;
防毒墙最核心的功能是病毒阻断,即在发现传输文件数据包带有病毒时,破坏传输文件并断开连接。本发明实施例中,采用结合文件引擎和流引擎相结合的技术,进行查毒引擎查毒,即使用流引擎进行数据包片段进行病毒特征检查,并在文件对应的所有片段都经过检查后,还原出完整的文件,然后将还原文件将交给文件引擎,再对还原文件做病毒特征的检查。
作为一种可实施方式,由于网络文件传输通常分成若干数据包传送,本发明实施例的查毒引擎是文件引擎和流引擎的结合进行查毒,对每个数据包所携带的部分文件内容进行查毒。步骤S530中,在应用层对解析得到的数据包利用查毒引擎进行病毒检测处理,并根据对数据包检测结果和数据包次序判断,对网卡数据包及sk_buff结构的栈分配队列进行处理;包括如下步骤:
步骤S531,在应用层对解析得到的数据包使用流引擎进行数据包的数据片段进行病毒特征检查,在发现传输文件带毒时,即时阻断连接,破坏传输文件并断开连接,并释放镜像放走队列中的索引;
网络传输文件传输时分成若干数据包进行传送,对每个数据包所携带的部分文件内容,本发明实施例中,使用流引擎进行明文的病毒特征检查。
如果数据包被流引擎发现带有病毒特征,则需要丢弃数据包并阻断对应的TCP连接;
作为一种可实施方式,较佳地,在丢弃数据包时,调用ioctl()函数传入该数据包的对应的镜像放走队列中的索引,在内核层找到该索引对应的sk_buff结构,直接释放,并进行出栈操作释放镜像放走队列中的索引。
步骤S532,如果数据包经过流引擎检测表明无病毒特征,且该数据包不是传输文件的最后一个数据包,则该数据包不必扣留而直接转发;如果数据包是传输文件的最后一个包,则表明传输文件还原完成,将还原的临时文件交给文件引擎做彻底的病毒检测,并扣留该传输文件的最后一个数据包直到文件引擎完成查毒;
如果数据包是传输文件的最后一个数据包,则表明传输文件还原完成,需将还原的传输文件交给文件引擎做彻底的病毒检测,此地将该数据包扣留在查毒进程中直到文件引擎完成查毒。
本发明的网络传输数据病毒检测处理方法,摒弃传统的代理连接技术,用户层的查毒进程获取数据包后,当发现该包是正在传输的文件的最后一个包时,可以选择扣住该包而不转发,直到查毒引擎完成对传输文件的检测为止。在扣包期间,需要丢弃数据包所在TCP连接所在方向上的后续包和重发包。
由于文件引擎查毒的时间无法确定,依赖于传输文件的类型、大小、是否加壳等因素,如果文件引擎查毒时间过长且因最后一个数据包一直被扣留,则可能引起发包方对该数据包的重传,因此,更佳地,作为一种可实施方式,本发明实施例中,在扣包期间阻拦连接上的后续数据包,直接丢弃不予处理和转发。
作为一种可实施方式,较佳地,所述步骤S532中,扣留该数据包直到文件引擎完成查毒,是通过ioctl()函数调用完成,包括如下步骤:
步骤S5321,在阻断数据包对应的TCP连接时,调用ioctl()函数传入该数据包的对应的镜像放走队列中的索引,在内核层中查找到该索引对应的sk_buff结构,根据sk_buff的数据包特征,包括但不限于seq/ack_seq/时间戳/窗口等,伪造rst连接重置包发往收包方,达到阻断连接的目的,并将被扣数据包的TCP四元组添加到预先设置的阻拦特征哈希表中;
所述阻拦特征哈希表是预先设置的根据存储被扣数据包的TCP四元组(源IP地址、源端口、目的IP地址、目的端口)的连接特征的哈希表。
步骤S5322,在扣包期间阻拦连接上后续数据包时,调用ioctl()函数传入后续数据包的对应的镜像放走队列中的索引,在内核层中找到该索引对应的sk_buff结构,将sk_buff给出的连接特征,包括但不限于TCP四元组(源IP地址、源端口、目的IP地址、目的端口,源和目的同时隐含了被扣数据包的方向),与内核层中的阻拦特征哈希表进行比对,并在查找到与被扣数据包TCP四元组特征相同时,直接丢弃该后续数据包。
在扣包期间,当接收到后续数据包,并在内核层NAPI软中断中处理该后续数据包时,将连接特征中的TCP四元组(源IP地址、源端口、目的IP地址、目的端口,源和目的同时隐含了被扣数据包的方向),与内核层中的阻拦特征哈希表进行比对,一旦发现后续数据包连接特征的TCP四元组存在于阻拦特征哈希表中,就直接丢弃该数据包。
当文件对应的所有数据包都经过检查后,通过解压缩,脱壳(通过算法或虚拟机)等,还原出完整的文件,然后将还原文件将交给文件引擎,对还原文件做病毒特征的检查处理。
当文件对应的所有数据包都经过防毒墙时,防毒墙可以还原出完整的文件,此时还原文件将交给文件引擎,通过虚拟机做解压脱壳后再做病毒特征的检查。
流引擎(即基于流引擎的病毒扫描方法)对文件的数据片段进行病毒特征检查,以及对整个文件利用文件引擎(如瑞星反病毒引擎、瑞星杀毒软件引擎等)进行病毒特征检查,是本领域的现有技术,因此,在本发明实施例中,不再一一详细描述。
本发明实施例利用双引擎病毒阻断的效果是:流引擎发现病毒时可即时阻断连接,当文件引擎发现病毒时可将文件最后的数据包破坏掉,以破坏压缩或加壳的文件,同时断开连接。
步骤S533,文件引擎查毒完成后,如果确认文件无毒,则按照正常应用层转发流程,将该数据包的索引放入转发网卡镜像放走队列tail指向的位置,并且取消对该连接后续数据包的阻拦;转发网卡的内核层则在网卡软中断中,从内核放走队列的头部读取索引(index),并根据索引查找到对应的sk_buff结构,将数据包填入网卡的发包环形队列传送出去,按照出栈操作释放该sk_buff结构对应的索引。
在文件引擎查毒完成并允许连接上后续数据包时,调用ioctl()函数传入被扣数据包的对应的镜像放走队列中的索引,在内核层中找到该索引对应的sk_buff结构,根据sk_buff给出的连接特征,包括但不限于TCP四元组(指TCP连接的源IP地址、源端口、目的IP地址、目的端口),在阻拦特征哈希表中匹配查找到并删除对应的被扣数据包的TCP四元组,这样被扣数据包的连接特征的TCP四元组不再存在于阻拦特征哈希表中,从而使后续数据包不再被阻拦。
作为一种可实施方式,本发明实施例中,在网卡的软中断(如图3中的NAPI软中断)中,当网卡收到发送来的数据包时,则绕开正常的TCP/IP协议栈和桥接技术,根据配置的网卡间转发关系,直接调用转发网卡的发包函数hard_start_xmit()将从零拷贝内存中获取数据包转发到发包环形队列,转发出去。
这种内核中数据包的直接转发,与内核的耦合度基本为零,避开了内核桥接代码中对端口MAC地址的学习、对生成树协议的支持和经过netfilter规则链的开销,可以明显提升小包吞吐率和转发性能。
步骤S534,如果文件引擎查毒完成后,如果确认文件带毒,则丢弃扣留的数据包,阻断对应的TCP连接,并且取消对该连接后续数据包的阻拦,直接进行出栈操作释放sk_buff结构对应的索引。
本发明实施例通过零内存拷贝,利用虚存将内核层的传输文件的数据包映射到用户层,对TCP/IP协议栈进行解析,并对TCP连接进行跟踪管理,从而取代代理连接;对数据包进行转发,而不采用Linux内核的桥接技术;对应用层协议进行解析,还原出传输文件并交给查毒引擎检测,使得防毒墙系统与内核的耦合很小且保持稳定;其摒弃传统的代理连接技术,采用独特的扣包机制,在不改变原始连接任何特征的前提下,通过流引擎和文件引擎的双重检测,保证了对带毒传输文件及时和准确的阻断。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。