简单分析用SPI实现防火墙
作者:snsins
如有转载,请注明并保持文章的完整
2002.12.5
--------------------------------------------------------------------------------------------------------
本来上次写了一个简单的SPI防火墙程序(只做了IP过滤功能,包过滤功能没有去做)后,已经放弃了对SPI的研究,但是最近有朋友问到SPI防火墙的实现,现在就再对SPI做一次详细点的分析和总结。
先看看防火墙的一般实现方式
首先是TCP/IP的结构(OSI7层模型)
--------
|应用层|------exe程序,比如ie
--------
|表示层|-------ws2_32.dll
--------
|会话层|-------SPI
--------
|传输层|-------TDI(不能截获ICMP等协议的数据)
--------
|网络层|-------NDIS(可以截获所有的网络数据)
--------
|链路层|-------设备驱动
--------
|物理层|-------网卡
--------
从上面我们可以很清楚地看到我们有多种方式实现防火墙,比如用HOOK API在表示层HOOK WINSOCKET的API函数,在会话层用WINDOWS提供的标准的SPI方式实现,SPI相对HOOK API方式要规范多了,而且功能也更强大,但是还是在user model里,。在传输层可以写驱动实现防火墙,虽然已经到了kernel model,但是和上面两种方式一样,过滤不了比如ICMP等协议的数据,因为ICMP等协议的数据并不经过传输层。这样我们可以看到,在WINDOWS里实现防火墙最标准最规范最强大的方式应该是在NDIS(也就是网络层实现),因为NDIS提供了一些规则,只要让我们来调用一些写好的函数来组织数据就可以了,功能不仅强大,而且相对下面链路层的设备驱动要简单,应该说在链路层也可以实现防火墙,但是觉得没有必要,太复杂了。
现在回过头来看看SPI的结构方式
--------------------
| ws2_32.dll |
--------------------
| SPI |
--------------------
| SPI |--------可以有很多层,就是所谓的分层服务提供者
--------------------
| 基础服务提供者 |
--------------------
服务提供者有两种,一种是分层服务提供者,一种是基础服务提供者,上面这个图不是很准确,我们这样来理解,我们写的分层服务提供者必须调用基础服务提供者或者下面一层的分层服务器提供者,然后把请求提交到他上面的一层(上面的一层可能是另外一个分层服务提供者,也可能是ws2_32.dll)。而我们写的基础服务提供者必须调用系统基础服务提供者,然后把请求提交到ws2_32.dll。请注意,系统里可能不仅仅安装了我们的基础服务提供者,也安装了别人写的基础服务提供者。在安装多个分层服务提供者和多个基础服务提供者的情况下,这两者的组织方式是不同的
如下图
-------------------------------------------------------------
| ws2_32.dll |
-------------------------------------------------------------
| &n

最低0.47元/天 解锁文章
4322

被折叠的 条评论
为什么被折叠?



