当前位置:文档之家› 基于SPI的数据包截获平台的研究与实现

基于SPI的数据包截获平台的研究与实现

虞柯,庄卫华,林巧河海大学计算机应用系,南京(210098)Email:yuke1998@摘要:本文设计和实现了一个基于SPI的数据包截获平台,对该平台稍作修改就能实现如防火墙系统,入侵检测系统,网络流量计费系统,VPN,Qos,URL过滤等许多网络应用系统。

在此基础上,本文以防火墙为例讲述了对该平台的使用方法。

关键字:SPI 网络数据包 LSP winsock目录 数据包截获平台图书分类号:TP3931.引言随着计算机网络的普及和相关技术的迅速发展,数据包截获技术得到了广泛的应用,如防火墙系统、入侵检测系统、网络流量计费系统、VPN、Qos、URL过滤等网络应用系统都需要对数据包进行截获和处理。

在windows平台下有许多数据包截获的方法。

按照所处的位置的不同可以分为用户态的截包技术和核心态的截包技术。

核心态的截包技术实现困难,安全性要求很高,一不小心就可能破坏系统。

用户态的截包技术实现起来比较方便,因为处于应用层,所以数据包是完整的,容易实现对内容的过滤[1]。

基于SPI的截包技术是一种工作在用户态的截包技术,它以其实现简单,安全性高,能拦截大部分网络数据包等优点,成为了许多网络应用系统的首选。

本文提出了一种基于WINSOCK 2 SPI 技术的数据包截获平台,利用此平台能够方便和快捷地实现诸如防火墙、入侵检测、URL过滤等基于数据包分析处理的网络应用系统。

2.SPI技术简介SPI的全称是winsock2 service provider interface,即winsock2 服务提供者接口,它是winsock2 API的补充。

几乎每一个winsock2 API都有对应的winsock2 SPI。

Winsock2符合开放服务系统(Windows Open Service Architecture,WOSA)模式.此体系允许第三方服务提供者的插入,而客户应用程序和Winsock2 DLL可以不用做任何的修改[2]。

整个Winsock2体系结构如图1所示,此体系实现由上而下的调用方式。

从图中用户可以看到SPI工作在体系的最底层,它向上实现对winsock2 API提供服务,向下实现具体的完成网络调用过程。

SPI由两部分组成――传输服务提供者(Transport Service Provider)和命名空间服务提供者(Namespace Service Provider)。

命名空间服务提供者把一个网络协议的地址属性和一个或多个用户友好名关联到一起,以便启用与协议无关的名字解析方案[3],如gethostbyname该API 就是由命名空间服务提供者Winsock 2 应用程序Winsock 2 API Winsock 2 DLL(WS2_32.Dll)Winsock 2 传输服务提供者Winsock 2命名空间服务提供者基础传输服务提供者基础传输服务提供者命名空间服务提供者命名空间服务提供者图1 Winsock2 结构传输服务提供者主要提供建立连接、传输数据、行驶流控制、出错控制等服务[3]。

如Winsock2 API中的Accept,Bind,Connect,Send等函数分别对应与传输服务提供者中的WSPAccept,WSPBind,WSPConnect,WSPSend等函数,也就是说,调用Winsock2 API中的Accept,Bind,Connect,Send等实际上就是调用传输服务提供者中的WSPAccept,WSPBind,WSPConnect,WSPSend等函数。

传输服务提供者又可以分为基础服务提供者(Base Service Provider简称BSP)和分层服务提供者(Layer Service Provider简称LSP)。

基础服务提供者实现传输协议的真正细节,它导出Winsock接口,此接口直接实现协议。

分层服务提供者位于其他的分层服务提供者或基础服务提供者之上,它依靠现存的下层的服务提供者实现实际的数据交换,从而实现更高层的定制通讯函数。

3.数据包截获平台的实现3.1 总体设计思路此数据包截获平台主要的功能是要实现数据包的拦截和数据包处理等工作,并向网络应用程序提供操作此平台的函数接口。

总的来说,此数据包截获平台主要包括以下几个部分:一个分层服务提供者的DLL,一个包含安装和卸载分层服务提供者的函数的封装类,一个负责数据包处理的函数,一个共享内存块和一个存储规则表的文件。

它们之间的关系可由图2表示。

图2 截获平台模块之间的关系图3.2 分层服务提供者的DLL所有的服务提供者都以DLL形式存在,用户自己写的分层服务提供者(LSP)也必须写成DLL形式。

每个LSP必须实现和导出WSPStartup函数,在WSPStartup函数中要完成对下层服务提供者的加载,并调用下层服务提供者的WSPStartup函数,从而得到包含下层函数地址的lpProcTable表。

将lpProcTable某些用户需要挂钩的函数(如WSPSendTo)的指针指向用户自己编写的LSP中重写的函数,再在用户自己重写的函数中调用下层服务提供者的函数来完成实际的操作。

3.3 封装类该封装类主要提供一些接口函数,便于应用程序对平台的操作。

该类中主要的成员函数以及它们的作用见表1。

表1 封装类成员函数表函数名称返回值类型主要参数类型说明GetProviderInfo int:返回结构体的个数LP WSAPROTOCOL_INFO:一个指向存放协议完整信息的结构体指针此函数获取安装在本系统中的所有协议的完整信息的枚举FreeProviderInfo void LP WSAPROTOCOL_INFO:上面函数获取的指针此函数存放指向协议信息枚举的内存空间InstallLSP int:错误代码WCHAR *:要安装的DLL的路径此函数将用户自己编写好的LSP安装到系统winsock目录下RemoveLSP void void 此函数从系统中卸载用户自己编写的LSPInsertRule int:可能的错误void *,int:指向要添加的规则的指针此函数向平台添加规则,它实际上是向共享内存块添代码:规则的长度加定长的数据DeleteRule int:可能的错误代码int,int:要删除的规则在规则库中的位置:规则的长度此函数从平台删除规则,它实际上是从共享内存块移除定长的数据SPI提供3种协议,它们是基础协议、分层协议和协议链。

基础协议是能够独立、安全地和远端实现数据通讯的协议;分层协议在基础协议之上,它通过调用下层的协议实现更高级的通讯服务。

协议链是将一系列的基础协议和分层协议按照特定的顺序连接在一起的链状结构,基础协议和分层协议在协议链里的顺序关系体现了它们之间的调用关系[2]。

所以安装一个LSP主要包括安装一个分层协议和安装一个协议链。

分层协议存放LSP 的信息,协议链存放LSP对下层服务提供者的调用关系。

在此基础上,还需要对系统中所有的协议重新排序,使用户自己编写的LSP能够首先被调用。

3.4数据包处理函数数据包处理函数在所有用户截获的函数中被调用,它在DLL中实现。

用户截获的函数中,在调用下层服务提供者相应的函数前可以先调用该数据包处理函数,根据此函数返回值决定是阻止数据包的发送还是放行数据包的发送或者进行其它的处理。

该函数的实现可以根据应用领域的不同而有不同的实现方式。

该函数的原型如下:bool PacketCheck (SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,const struct sockaddr FAR * lpAddr,CString FuncName) ;参数:s:套接字lpBuffers:存放数据包数据的缓冲区dwBufferCount:缓冲区大小lpAddr:指向一个SOCKADDR结构的指针FuncName:调用此函数的函数名称返回值:表示对数据包的操作是丢弃还是放行,true为丢弃,false为放行。

该函数根据以上各个参数的值的不同来查找对应的规则表项,看数据包中的数据是否符合规则表项,如符合则丢弃,否则放行。

3.5共享内存块和存储规则表的文件在某些应用中常常会用到一个规则表,如防火墙的规则表,对规则表的管理常常也称为这类应用系统的重要组成部分。

规则表平时以文件的形式存放在磁盘目录下。

在平台运行时,4应用举例要将此平台应用到某个特定的网络应用系统,只要修改数据包处理函数,实现具体的数据包处理过程。

在此基础上,还需根据应用需要实现一些方便用户操作的图形界面接口和其它一些附属功能。

下面以防火墙为例介绍一下此平台的具体使用方法。

防火墙的整体结构如图3所示,它主要由用户图形接口、报警和日志、数据包截获平台等几个模块构成。

图3 防火墙结构图用户图形接口模块提供友好的用户操作接口,方便用户对该防火墙的操作。

用户对图形接口的操作最终通过调用数据包截获平台中的封装类的成员函数来完成。

报警和日志模块完成向用户报告异常情况和保存异常情况的功能。

数据包截获平台完成具体的数据包截获和处理的功能,这是防火墙的核心模块[4]。

只需要修改数据包处理函数,实现具体的处理过程,就能把作者提出的数据包截获平台应用到防火墙系统中。

防火墙的数据包处理函数中要判断目的端口号、目的IP地址、协议类型等是否和防火墙规则表中的规则匹配,从而决定是否是阻止还是放行。

如果匹配且规则中表明的操作是丢弃,则处理函数通知服务提供者丢弃此包;如果匹配且规则中表明的操作是放行,则处理函数通知服务提供者放行此包;如果不匹配,则处理函数通过调用报警和日志模块向用户发出告警并纪录异常情况,由用户决定对此包的操作。

防火墙中还需要有一个描述防火墙规则的数据结构,由它描述规则表中各个字段的意义。

表2 防火墙规则表规则编号协议类型源IP 目的IP 源端口目的端口操作10.11.19.2060 21 0 丢弃1 TCP2 TCP 0 10.11.19.10 80 放行3 UDP 0 10.11.19.10 80 放行5结论实验证明利用此数据包截获平台能够方便和快捷地实现基于数据包分析的网络应用系统,实现的系统有比较好的稳定性和较高的效率,并能够截获主要的网络封包。

但是,由于它只能处理TCP、UDP、IP等这些SOCKET类型的包,对于像ICMP、IGMP这样的IP层的数据包此数据包截获平台就无能为力了。

如果能在核心态对数据包截获一次,处理掉类如ICMP、IGMP这样的较底层的数据包后,然后在应用层用SPI技术再截获一次,处理应用层的数据包,那样会达到更加完美的效果。

参考文献[1] 王诚 庄卫华. Windows平台截包技术研究[OL]., 2006.9.6[2] 张越. Visual C++网络程序设计实例详解[M]. 北京:人民邮电出版社,2006.[3] 朱雁辉. Windows 防火墙与网络封包截获技术[M]. 北京:电子工业出版社,2002.[4] 罗改龙 程胜利. 基于SPI 防火墙的研究与实现[J].交通与计算机,2007,25卷(2007年第1期):139-140Research And Realization Of SPI-Based Packet FilteringFlatYu Ke , Zhuang WeiHua, Lin QiaoComputer Application Department, HoHai Univ, NanJing (210098)Email:yuke1998@Abstract:This essay designed and realized a SPI-based packet filtering flat. With this packet filtering flat , you can realize many network applications such as firewall, IDS, Qos, Charging system of network flow, URL filter and so on without changing a lot . And more, this essay takes firewall as an example to introduce the way to use this packet filtering flat.Key words:SPI Network Packet LSP Winsock Catalog Packet Filtering Flat。

相关主题