摘要:网络攻击越来越隐蔽,很多攻击把特征信息隐藏在多个数据包中,这大大增加了攻击检测的难度,TCP数据流重组是可靠数据传输及网络数据内容还原的基础,也是入侵防御系统中的基础模块。论文详细介绍了入侵防御系统中TCP数据流重组的设计原理及实现,给出了核心数据结构,最后分析了重组的效率及目前存在的问题。
关键词:入侵防御系统;TCP数据流重组;哈希表;缓存;
中***分类号:TP393.01 文献标识码:A 文章编号:1007-9599 (2012) 17-0000-02
1 引言
IPS(Intrusion Prevention System)是网络安全领域的一种基本安全防护设施,是对入侵检测系统(Intrusion Detection System IDS)和各种防火墙的有力补充。在攻击检测的过程中,为了准确有效得检测出隐蔽在多个数据包中的攻击,必须进行TCP会话的还原,从而得到完整的攻击特征。完成还原后再与攻击特征库的规则进行匹配,可以有效提高检测攻击的效率和准确度。
2 TCP数据流重组的实现原理
2.1 核心数据结构
用于保存一个完整TCP连接信息的结构:
struct tcp_stream{
struct tuple4 addr; //TCP连接双方的地址信息
char nids_state; //连接的逻辑状态
struct lurker_node *listeners; //包含回调函数的链表
struct half_stream client; //客户端状态及数据
struct half_stream server; //服务器端状态及数据
struct half_stream *next_node; //HASH中同一键值的下一个节点指针
struct half_stream *prev_node; //HASH中同一键值的前一个节点指针
int hash_index; //HASH表中的索引值
struct half_stream *next_time; //用于保存TCP连接的先后顺序,构建时间链
struct half_stream *prev_time;
int read; //本次读进数据缓冲区的数据长度
struct half_stream *next_free; //指向TCP连接缓冲池中下一个空闲结构
}
用于保存TCP连接终端信息的结构体:
struct half_stream{
char state; //状态
char collect; //如果大于0,则保存其数据到缓冲区中
char collect_urg; //如果大于0,则保存紧急数据
char *data; //未处理TCP数据缓冲区
int offset; //保存到“data”缓冲区的首字节数据偏移量
int count; //自从连接建立以来保存的数据字节数
int count_new; //最近一次接收到的数据字节数
int bufsize; //data区的长度
int rmem_alloc; //该TCP连接的所有数据的长度和
int urg_count; //该终端接收到得紧急数据的总数目
u_int acked; //未用
u_int seq; //本次TCP包中的SEQ
u_int ack_seq; //ACK
u_int first_data_seq; //TCP建立连接时的初始SEQ
u_char urgdata; //紧急数据
u_char count_new_urg; //如果非0,表示有紧急数据到达
u_char urg_seen; //有新的URG数据,并且不是以前的重复数据
u_int urg_ptr; //指向URG数据在流中的位置
u_short window; //TCP窗口大小
u_char wscale_on; //窗口扩大因子标志
u_int curr_ts; //当前时间
u_int wscale; //窗口扩大因子
struct skbuff *list; //当收到的TCP包中的SEQ比期望的大时,则将该数据先保存在此双向链表中,为访问方便,此链表按包中的SEQ从小到大排列
struct skbuff *listtail; //指向list链表的链尾
}
2.2 Hash表及Hash算法的设计
在TCP数据流的重组过程中,为了提高查找连接的速度,使用了Hash算法,并通过双向链表解决了Hash冲突情况,这与普通的链表的顺序查找相比,大大提高了查找的效率。在管理连接Hash表中,针对每一个结点,加入了连接的超时机制,并通过双向时间链表根据连接的先后组建成一条时间链,在缓存不够时,则遍历时间链表并首先释放超时的连接以及最老的连接,从而释放出足够的空间来建立最近的TCP连接,Hash表的结构如下***2.1所示:
***中tcp_oldest和tcp_latest分别指向所有结点组成的以连接发起时间为基准的双向链表的表头和表尾,而tcp_free则指向缓冲池中最近释放的空闲结点,整个缓冲池组成一个双向的循环链表,tcp连接的所有结点的存储空间都从tcp连接缓冲池中分配,缓冲池是在模块启动时一次性申请足够量的内存,这样就避免了在重组过程中频繁调用malloc和free函数所带来的内核态与用户态进程切换的时间开销,从而提高了重组的效率。
在tcp会话还原中,使用四元组(源IP,源端口,目的IP,目的端口)和连接发起的时间time作为hash值的计算因子,和仅仅使用四元组作为计算hash值的方法相比,可以有效降低hash冲突,hash值的计算算法使用如下公式:
在计算hash值时,首先根据公式1和公式2初始化两个基准数组,每个数组的长度是16字节,根据公式3用源IP地址sip、目的IP地址dip、源端口sport、目的端口dport以及连接的发起时间time来初始化长度是16个字节的数组data,根据公式4迭代计算hash值res。
3 数据流重组的性能分析及存在的问题
针对本模块,测试环境的网络拓扑***如下***3.1所示:
上***中包发送终端主要用来控制ThreadEx数据包发送工具,ThreadEx设备有多个网口,其中一个网口通过网线连接控制终端,另一个网口连接入侵防御系统TCP数据流重组服务器;IPS TCP重组服务器具有两个网卡,并且把网卡配置成转发模式,这样当数据包经过IPSserver完成重组会就立即转发经过的数据包。在上***所示的网络测试环境下,发包工具在20s内发送30万个连接,系统可以正常重组所有的连接,当系统所处理的实时连接数大于50万时,开始出现丢包现象。
4 结论
本文给出了网络入侵防御系统中TCP数据流重组hash表、hash算法、缓存机制以及重组流程的设计原理和过程,给出了重组中的核心数据结构、重组中的关键技术、关键算法,并对重组的性能及存在的问题进行了分析,为研究发展IPS做了一些探讨。
参考文献:
[1]刘文涛.网络安全开发包详解[M].电子工业出版社,2005.
[2]W. Richard Stevens 著 TCP/IP Illustrated Volume 1:The Protocols.
[3]James F.Kurose Keith W.Ross 著 Computer Networking A Top-Down Approach Featuring the Internet,Third Edition.
[4]邓子宽,范明钰,王光卫,朱大勇.Snort入侵检测系统中TCP流重组的研究,2007,2.
[5]孔华锋,金波,刘恩强,候晓杰.快速无损TCP数据流重组算法研究
基金项目:四川省科技计划项目(2009GZ0148)
[作者简介]
何兴高(1964-),男,高级工程师(副教授),主要研究方向:信息安全,网络安全;车明明(1989-),男,硕士生,主要研究方向:网络安全;张凤荔(1963-),女,教授(博导),主要研究方向:网络安全,大型数据灾难恢复。
转载请注明出处学文网 » 入侵防御系统中TCP数据流重组的设计与实现