IPv6分片重组在入侵检测系统中的实现 (2)

2008-04-02 10:57:59来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



·保留2:2bit,发送时初始化值为0,接收时忽略。

·M:1bit,M=1表示还有后续分片包,M=0表示这是最后一个分片包。

·分片标志:32bit,是源节点和目的节点之间区分不同原始数据包的惟一标志。

2.举例说明IPv6分片重组机制

下面用一个具体的例子来解释IPv6的分片重组机制。如图2所示,假设某一个IPv6数据包的原始包长为320byte,其中包括40byte的IPv6基本头、4个30byte的IPv6扩展头(2个属于不可分片部分,2个属于可分片部分)和160byte的数据载荷。通常情况下传输该长度的数据包是不需要进行分片操作的,这里使数字简单化以便于说明其分片机制。假设通过路径最大传输单元发现机制获得的值为230byte,由于不可分片部分必须包含在每一个分片包中,这样一共需要三个分片包来传送160byte的数据载荷。



各个分片包的具体组成如下:

·第一个分片包:开始是100byte的不可分片部分,接着是30byte的分片扩展头,最后是100byte的可分片部分(包括2个各30byte的可分片扩展头和40byte的数据载荷)。分片扩展头中分片偏移量为0,M=1,还剩下120byte的数据载荷。

·第二个分片包:同样包括100byte的不可分片部分,接着是30byte的分片扩展头,然后是100byte的数据载荷(从第40-139byte)。分片扩展头中分片偏移量为40byte,M=1,还剩下20byte的数据载荷。

·第三个分片包:包括100byte的不可分片部分,接着是30byte的分片扩展头和最后20byte的数据载荷。分片扩展头中分片偏移量为140byte,M=0。

三个分片扩展头中的分片标志字段为同一个32bit无符号整数,标志着这三个分片包属于同一个原始数据包。

[page]
三、IPv6分片重组在SNORT中的实现

本节将结合IP分片攻击的表现方式和IPv6的分片重组机制来讨论IPv6分片重组在SNORT中的实现细节。

1.选用SNORT来实现IPv6入侵检测的原因

之所以选用SNORT软件来实现IPv6入侵检测是因为它具有如下特点:

·SNORT是一个遵循GPL(General Public Liense)的并源软件,该项目自创立起发展十分迅速,现在已升级到2.3.0版。

·SNORT是一个轻量级但功能强大的网络入侵检测系统。它具有实时流量分析和IP网络数据包日志纪录能力,能够进行规则匹配报警,具有网络协议分析功能,还能够正确识别因特网上的大多数攻击形式和攻击事例。

·SNORT软件组织采用插件形式,具有良好的扩展性和可移植性,非常适合通过在标准版本基础上加载新的插件来检测新的攻击。这也是我们选择它的最重要原因。

2.SNORT插件机制

启动SNORT的初始化过程中有一个非常重要的环节,就是主程序SnortMain(int argc,char*argv[])通过调用InitPreprocessors()函数来完成所有预处理插件的初始化。InitPreprocessors()会调用SetupFrag2Ip6()来完成IPv6分片重组插件的注册,SetupFrag2Ip6()会调用RegisterPreprocessor(“frag2ip6”,Frag2Ip6Init)函数将IPv6分片重组插件初始化函数Frag2Ip6Init注册到预处理插件列表中,实际上是将关键字frag2ip6注册到一个预处理插件关键字列表中。当对系统配置文件snort.conf进行解析时,如果看到Frag2ip6这个关键字,就表示要启用IPv6分片重组预处理插件,也就会调用Frag2Ip6Init函数来完成分片重组中一些全局变量的设置,例如该插件所能分配到的最大内存空间、每个分片包在内存中所能驻留的最长时间等。Frag2Ip6Init函数的最后一步就是调用AddFuncToPreprocList(Frag2Defrag)函数将具体进行分片重组动作的Frag2Defrag函数注册到预处理函数列表中,以后每收到一个包都会调用Frag2Defrag函数来判断该包是否是一个有效的IPv6分片包,如果是就进行IPv6分片重组工作,如果不是,处理流程会把控制权直接交给下一个预处理插件。

3.分片包的处理策略

对于每一个新接收的IPv6分片包,Frag2Defrag(Packet*p)函数首先从该包中解析出如下数据:

·分片偏移量:p->frag_offset=ntohs(p—>ip6fh->ip6frag_off)&~Ox07;

·是否还有后续分片的标志量:p->mf=ntohs(p->ip6fh->ip6frag_off)&IP6_MF;

·分片净载荷的起始指针:p->data=(u_int8_t*)(p->ip6fh 1);

·分片净载荷的长度:p->dsize=(u_short)(ntohs(p->ip6h->s_ip6_plen)-((u_int8_t*)(p->ip6fh 1)-(u_int8_t*)(p->ip6h 1)))。

SNORT利用二叉树的数据结构来存储和搜索每一个分片包。SNORT根据源地址、目的地址、分片标志和下一个头的类型这四个元素来惟一地标志属于同一个原始IP数据包的所有IP分片包,通过在二叉树中以这四个元素为依据来搜索和存储每一个分片包。在将新收到的分片包插入到二叉树之前,系统会实施一系列的检查,主要是检查是否发生分片重复和存在分片空洞。具体如下:

如果(p->mf && p->frag_offset==0)为真就表示收到了第一个分片包;如果(!p->mf && p->frag_offset>0)为真就表示收到了最后一个分片包,无论是收到第一个包还是收到最后一个包,相应的分片标志纪录位都会被置位。比较新收到的分片包与二叉树中已经存储的分片包的分片偏移量,如果两者相等说明发生了分片重复,我们保留早到的分片包,将后到的包丢弃。

将每一个分片包插入二叉树的对应节点之后,就应该检查是否所有的分片包都已经到达。分片到齐的首要条件是第一个分片包和最后一个分片包已经到达,接着就要检查该二叉树上属于同一个原始IP数据包的所有IP分片包了,实际上是检查每一个分片包的分片偏移量是否正好等于上一个分片包的分片偏移量加上一个分片包的分片大小。如果检查完所有分片包后发现没有空洞存在,那就表示所有的分片包都已经到齐,可以进行重组操作了。

4.分片包的重组策略

将所有到齐之后的分片包重组起来的操作由RebuildFrag(FragTracker*ft,Packet*p)函数来完成。对此需要重点考虑下述三个问题。

首先是不可分片部分的确定与保留问题。必须且只保留第一个分片包的不可分片部分,而所有后续分片包的不可分片部分必须排除在外,这可以通过移动拷贝源地址指针来完成。在具体确定第一个分片包的不可分片部分、分片扩展头、可分片部分时,不能简单地认为IPv6基本头之后就是分片扩展头,因为在IPv6基本头之后、分片扩展头之前还有可能包含有逐跳扩展头、目的地选项扩展头和路由扩展头中的一种或者多种,因此确定不可分片部分的结尾(也就是分片扩展头的开始位置)必须依靠逐层检查下一个头是否是分片扩展头。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:用SSL加密增强FTP服务器安全性

下一篇:利用IP地址欺骗突破防火墙深层技术解析