发明内容
本发明的技术任务是解决现有技术的不足,提供一种网络流量检测方法。
本发明的技术方案是按以下方式实现的,该一种网络流量检测方法,其具体实现过程为:
一、识别P2P协议流量:从P2P应用软件说明书中获取特征码;或通过基于Netfilter框架自行开发的程序捕获网络数据包,分析出P2P应用软件的特征码;
二、通过算法进行流分类:采用哈希表的方法,将TCP流分成Bittorrent流和非Bittorrent流;当数据包到达后,提取数据包的源ip地址、源端口、目的ip地址和目的端口作为哈希函数的key,计算该key对应的哈希地址,计算出的哈希地址在哈希表中,则表明该数据包所属的Bittorrent流已存在于哈希表中,否则该数据包进行应用层特征匹配;
三、完成流量统计:通过提取BitTorrent应用层特征作为BitTorrent流的唯一标识,利用Linux系统下Netfilter的扩展机制实现数据包应用层信息与BitTorrent流特征的匹配,将TCP流分成BitTorrent流和非BitTorrent流,对BitTorrent流进行实时统计。
所述步骤一中通过分析获取特征码的详细过程为:通过sniffer程序捕获P2P应用软件的网络数据包,再进行手工分析,从中找出特征码。
所述步骤三中提取如下特征值识别BitTorrent协议:TCP载荷的第一个字节是19(0x13);紧接着19个字节为字符串“Bittorrent protocol”。
所述步骤三中的数据包应用层信息与BitTorrent流特征匹配的详细过程为:系统分为用户空间部分和内核部分,内核部分完成P2P流量识别并统计每个P2P连接的包的个数、大小信息,填充到连接跟踪hash表中;然后通过一种内核与用户空间通信协议,根据流量测量需求,以一定的时间频率向用户空间返回内核中的流量统计信息,该通信协议是指将内核中的流量统计信息输出到用户空间,在用户空间处理统计数据,获取所需要的流量行为参数,并完成应用层特征匹配:
1)应用层特征匹配在内核中实现,在内核模块中通过match函数完成;
2)应用层特征匹配在用户空间实现,在内核中加入相关的内核模块选项后,在用
户空间进行说明,为该模块提供相关的命令行选项,同时各个扩展模块通过共享库使用一
个版本的iptables,而不必编写相关扩展的特定版本,共享库在装载时被自动调用,共享库
中重要数据结构是:iptables_match,它作为参数传递给register-match(),注册相关的
命令行匹配选项,让iptables识别新的match函数;
3)统计功能由libiptc完成,libiptc是iptables的控制库函数,它提供了一组内
核接口函数,用来管理iptables内核模块中的规则,并从内核中取出每条过滤规则的统计
结果。
所述流量测量通过基于路由的流量控制器完成,该流量控制器包括队列、分类和过滤器,其中队列用来实现控制网络的收发速度,通过队列,Linux可以将网络数据包缓存起来,然后根据用户的设置平滑网络流量,它封装了类和分类器;类用来表示控制策略,即对不同的ip实行不同的流量控制;过滤器用来将用户划入到具体的控制策略中;其具体测量过程为:
1)建立流量控制器,即顺序建立队列、建立分类、建立过滤器和建立路由,同时对现有的队列、分类、过滤器和路由进行监视;
2)针对网络物理设备绑定一个类基队列;
3)在该队列上建立分类;
4)为每一分类建立一个基于路由的过滤器;
5)最后与过滤器相配合,建立特定的路由表;
6)通过输入命令完成流量统计工作和限制工作。
本发明与现有技术相比所产生的有益效果是:
本发明的一种网络流量检测方法包括P2P协议流量的识别、流分类算法和流量统计框架的设计,通过检测应用层数据的特征码,并把数据按照特征码划分为不同的数据流量,并进行分类统计的方法,既能够基于一般的传统识别方法识别出一般协议,又能够通过高级的识别方法识别出那些较难识别的网络协议的防火墙构建方法;在Netfilter框架上实现P2P流量测量系统,可以充分利用其可扩展性,编写内核模块在内核中实现P2P流量的高速识别和测量,让繁重的捕包和统计工作在内核完成,提高效率;实用性强,通过用户编写自己的流量匹配程序,并把本发明给出的算法写进自己的程序中,并编译进内核,再结合Linux自带的流量测量和控制模块,可以很好的测量用户自己想要测量的网络流量,易于推广。
具体实施方式
下面结合附图对本发明的一种网络流量检测方法作以下详细说明。
如附图1、图2所示,本发明提供一种网络流量检测方法,其具体实现过程为:
一、识别P2P协议流量:如何准确快速地识别P2P网络数据包成为比较困难的问题。一种比较简单的方法是直接通过已知P2P软件常用端口判定P2P网络流量,但这可能导致使用其中某端口的其他应用无法正常使用。另外如果P2P应用软件能够动态调整端口,则该方法就无能为力了。例如BitTorrent通常在688l端口监听,若该端口被占用,则一直尝试到6889端口。本发明采用归纳各种P2P应用软件的网络数据包特征码的方法加以判定。可以通过如下2种途径获取特征码:
参考相关P2P应用软件规范说明书。
BitTorrentl,eDonkey和eMule等软件都有详细的规范说明书,分析其说明书就可以归纳出特征码。
类似地,通过学习BitTorrent协议规范说明书,可以分析出BitTorrent特征码。BitTorrent所使用的对等协议实际由一个握手开始。握手数据包格式为<pstrlen><pstr><reserved><info—hash><peer_id>。其中pstrlen值为19,表示pstr所代表的协议标识符“BitTorrent protocol”的长度。8B保留字段reserved当前都置0。对元文件中info信息进行SHA l运算后的哈希值长度为20B。而20B的peer_id则为客户端的唯一标识符。接收方也会对元文件中info信息进行哈希运算。如果运算结果与info_hash不同则表示双方想传输的不是同一文件,所以中断连接;否则在握手之后就是循环的消息流,且每个消息的前面都有一个数字表示消息长度。由此可以看出,将“BitTorrentprotocol”作为BitTorrent数据包的特征码,结合TCP协议的特点就可以判断出BitTorrent协议数据包。
实际使用中部分数据包如下所示。
应用协议 |
协议 |
类型 |
ip负载大小 |
eDonkey |
0xe3 |
0x9a,0x96 |
26,14 |
eMule |
0xc5 |
0x91,0x92,0x93 |
12,10,10 |
Kad |
0xe4 |
0x50,0x59 |
12,10 |
特征码如下表所示。
P2P软件名称 |
特征码 |
Bittorrent |
BitTorrent protocol |
卡盟(KAMUN) |
KamunPeers protocol |
百度下吧 |
BaiduP2P |
Gnutella |
GND或者GNUTELLA |
KaZaA |
KaZaA |
Ares Galaxy |
PUSH SHAl |
通过捕获P2P网络数据包分析对应特征码。
有些P2P应用软件虽然较为流行,但并不提供相关的规范说明书。分析并寻找特征码的过程会比较困难,对此可以通过sniffer程序捕获P2P应用软件的网络数据包,再进行手工分析,从中找出特征码。本发明利用基于Netfilter框架自行开发的程序捕获网络数据包,分析出了部分P2P应用软件的特征码。例如,通过分析BitTorrent网络数据包完全可以得到特征码“BitTorrentprotocol”。这也与BitTorrent协议规范说明书中的相关内容相互认证。类似地,可以找到其他P2P软件网络数据包的特征码。
二、通过算法进行流分类:在测量方法中采用了基于哈希表的方法,将TCP流分成Bittorrent流和非Bittorrent流。当数据包到达后,提取数据包的源ip地址、源端口、目的ip地址和目的端口作为哈希函数的key,计算该key对应的哈希地址。若哈希地址在哈希表中,则表明该数据包所属的Bittorrent流已存在于哈希表中,否则该数据包进行应用层特征匹配。
流分类中常用的哈希函数有XOR-Folding.Lower19bits,FNV-XOR等。考虑到流分类过程是在内核中进行,哈希函数应易于实现,并能充分利用内存空间。结合XOR-Folding方法,设计了如下的哈希函数来进行Bittorrent流分类,产生16位的哈希值。
设32位源ip地址表示为S1.S2.S3.S4,目的ip地址表示为D1.D2.D3.D4。源端口表示为P1.P2,目的端口表示为K1.K2,其中Si,Di,Pi,Ki,(i=1,2,3,4)表示四位二进制数哈希地址的计算过程:
Addr=(S&0x0F)<<12+(D&0x0F)<<8+(P&0xF0)+(K&0xF0)>>4。
三、完成流量统计。
1)设置统计构架:从BitTorrent协议可以看出,每个BitTorrent节点定时通过HTTP协议将本节点监听端口号上传给Tracker服务器。这样,每个节点修改监听端口号对于其他节点是透明的,即所谓的动态端口。因此,仅仅通过端口号是不能标识BitTorrent协议的。本发明测量方法的主要思路是提取BitTorrent应用层特征作为BitTorrent流的唯一标识,利用Linux系统下Netfilter的扩展机制实现数据包应用层信息与BitTorrent流特征的匹配,将TCP流分成BitTorrent流和非BitTorrent流,对BitTorrent流进行实时统计。
通过BitTorrent对等协议以及捕包分析看出:BitTorrent节点之间的连接始终是以一个固定长度的握手消息开始的,因此提取如下特征值识别BitTorrent协议:
TCP载荷的第一个字节是19(0x13)。
紧接着19个字节为字符串“Bittorrent protocol”。
2)基于应用层特征匹配的实现:在Netfilter框架上实现P2P流量测量系统,可以充分利用其可扩展性,编写内核模块在内核中实现P2P流量的高速识别和测量,让繁重的捕包和统计工作在内核完成,提高效率。
通过应用层深层扫描数据包,可以准确的识别P2P流量,所以可以设计应用层匹配模块来作为测量系统的P2P识别模块。如果对到达的数据包逐一进行应用层数据匹配,虽然这样可以准确的识别到达的每一个P2P数据包(在支持的协议范围内),但是这对流量测量来说远远不能满足效率要求,因为流量测量要尽可能的减少其对网络性能的影响,繁重的匹配工作会增加延时、降低吞吐率,因此必须针对流量测量的特点进行改进。由于P2P流量具有长时间固定连接的特点,所以可以充分利用该特征,引入一种用于高效流量测量的连接跟踪机制,即发现一条连接的第一个包是P2P数据包后,后面针对该连接的所有数据包都认定是P2P数据包,而无须进行深层次的应用层匹配,利用这种机制对识别出的P2P连接进行高效的流量统计。然后通过一种内核-用户空间通信机制,将内核中的流量统计信息输出到用户空间,在用户空间处理统计数据,获取所需要的流量行为参数。系统的整体框架如下图。系统分为用户空间部分和内核部分。内核部分完成最重要的P2P流量识别并统计每个P2P连接的包的个数、大小等信息,填充到连接跟踪hash表中;然后通过一种内核与用户空间通信协议,根据流量测量需求设计一种通信机制,以一定的时间频率向用户空间返回内核中的流量统计信息。
首先,应用层特征匹配在内核中的实现。
新的match功能是一个独立的内核模块,使用ipt-register-match()将该模块进行注册。match模块的核心是:ipt-match结构,它作为ipt-register-match()的参数注册到match链表中,从而增加新的规则匹配选项。
特征匹配主要由内核模块中match(const struct sk_buff*skb,const structnet_device*in,const struct net_device*out,const void*match info,int offset,const void*hdr,u_int16_t datalen,int*hotdrop)函数完成。
再者,应用层特征匹配在用户空间的实现。
在内核中加入相关的内核模块选项后,必须在用户空间进行说明,为该模块提供
相关的命令行选项。为了使各个扩展模块使用一个版本的iptables,而不必编写相关扩展
的特定版本,采用共享库可以解决该问题。共享库在装载时被自动调用,共享库中重要数据
结构是:iptables_match,它作为参数传递给register-match(),注册相关的命令行匹配
选项,让iptables识别新的match。应用层特征匹配模块声明的iptables_match结构如下:
static struct iptables match P2P={
NULL,
“BT”,//match的名字必须与库函数名相同便于主程序根据match名加载相应//的动态链接库。
iptables_version,//版本信息。
ipt align(sizeof(struct ipt_BT info)),//match的数据大小。
&help,//打印帮助选项大纲。
&init,//初始化ipt_entry_match结构。
&parse,//扫描并接收match的命令行参数,正确接收返回非0。
&final_check,//当命令行参数全部处理完毕后以调用。
&print,//查询当中表的规则时,显示使用了当前match规则的额外信息。
&save,//按照parse允许的格式将本match的命令行参数输出到标准输出。
}
最后,统计功能由libiptc完成。libiptc是iptables的控制库函数,它提供了一组
内核接口函数,用来管理iptables内核模块中的规则。通过调用libiptc中ipt_read_
counter()函数,从内核中取出每条过滤规则的统计结果。
该方法虽然能检测出P2P流量,但是前提是这些所测量的数据流中载荷的第一个字节是19(0x13)。而且紧接着19个字节为字符串“Bittorrentprotocol”。
3)流量测量方法:TC是流量控制器Traffic Control的简称。主要是在输出端口处建立一个队列进行流量控制,控制的方式是基于路由,亦即基于目的ip地址或目的子网的网络号的流量控制。流量控制器TC,其基本的功能模块为队列、分类和过滤器。Linux内核中支持的队列有,Class Based Queue,Token Bucket Flow,CSZ,First In First Out,Priority,TEQL,SFQ,ATM,RED。这里讨论的队列与分类都是基于CBQ(Class Based Queue)的,而过滤器是基于路由(Route)的。
TC中的队列(queueing discipline):用来实现控制网络的收发速度。通过队列,Linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如TCP)的前提下来平滑网络流量。需要注意的是,Linux对接收队列的控制不够好,所以在这里一般只用发送队列,即“控发不控收”。它封装了其他两个主要TC组件(类和分类器)。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的qdisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。队列规则包括FIFO(先进先出),RED(随机早期探测),SFQ(随机公平队列)和令牌桶(Token Bucket),类基队列(CBQ),CBQ是一种超级队列,即它能够包含其它队列(甚至其它CBQ)。
TC中的Class类:Class用来表示控制策略。很显然,很多时候很可能要对不同的ip实行不同的流量控制策略,这时候就得用不同的Class来表示不同的控制策略了。
TC中的过滤器filter规则:filter用来将用户划入到具体的控制策略中(即不同
的Class中)。比如,现在对xxa,xxb两个ip实行不同的控制策略(A,B)。这时,可用filter将
xxa划入到控制策略A,将xxb划入到控制策略B,filter划分的标志位可用u32打标功能或
iptables的set-mark(大多使用iptables来做标记)功能来实现。
目前,TC可以使用的过滤器有:fwmark分类器,u32分类器,基于路由的分类器和RSVP分类器(分别用于ipV6,ipV4)等;其中,fwmark分类器允许使用Linux Netfilter代码选择流量,而u32分类器允许选择基于ANY头的流量。需要注意的是filter(过滤器)是在qdisc内部,它们不能作为主体。
TC的应用流程是数据包->iptables(在通过iptables时,iptables根据不同的ip
来设置不同的mark)->TC(Class)->TC(queue)。配置和使用流量控制器TC,主要分以下几个
方面:分别为建立队列、建立分类、建立过滤器和建立路由,另外还需要对现有的队列、分
类、过滤器和路由进行监视。
其基本使用步骤为:
针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列;
在该队列上建立分类;
为每一分类建立一个基于路由的过滤器;
最后与过滤器相配合,建立特定的路由表。
前面已经知道iptables中的mark模块可以将mark标记用于给特定的数据包打上
标签,这样就可以配合TC做QOS流量限制或应用策略路由。每一个标示为P2P连接的包被标
记成“1”,然后再通过TC过滤,使用HTB和过滤,将所有标记为“1”的包放到每一个设备类中,
通过对这些设备类的限制来达到对P2P连接带宽的限制。
本发明即为根据网络数据包的特征码编写自己的流量识别规则,然后区别被识别
的流量和被忽略的流量,其中用到的是上面提到过的流分类算法,然后把函数接口挂接到
Netfilter框架的NF_IP_LOCAL_IN钩点。把写好的模块编译进内核,就是把函数名挂接到
ip_input.c文件中。然后用户根据自己的需求编写iptables规则,用来标记自己想要统计
的那部分流量。最后是流量统计模块TC的配置,只需要几行命令行就可以配置想要统计的
流量,并限速。
以上所述仅为本发明的实施例而已,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。