研究目标、研究内容和拟解决的关键问题
本毕业设计拟设计一款包过滤防火墙。分组过滤或包过滤,是一种通用、廉价、有效的安全手段。之所以通用,因为它不针对各个具体的网络服务采取特殊的处理方式;之所以廉价,因为大多数路由器都提供分组过滤功能;之所以有效,因为它能很大程度地满足企业的安全要求。
所有的防火墙都具有IP地址过滤功能。这项任务要检查IP包头,根据其IP源地址和目标地址作出放行/丢弃决定。举个例子,两个网段之间隔了一个防火墙,防火墙的一端有台UNIX计算机,另一边的网段则摆了台PC客户机。
当PC客户机向UNIX计算机发起telnet请求时,PC的telnet客户程序就产生一个TCP包并把它传给本地的协议栈准备发送。接下来,协议栈将这个TCP包“塞”到一个IP包里,然后通过PC机的TCP/IP栈所定义的路径将它发送给UNIX计算机。在这个例子里,这个IP包必须经过横在PC和UNIX计算机中的防火墙才能到达UNIX计算机。包过滤防火墙就起到了关键的访问过滤功能。
传统的包过滤只是与规则表进行匹配。防火墙的IP 包过滤,主要是根据一个有固定排序的规则链过滤,其中的每个规则都包含着IP地址、端口、传输方向、分包、协议等多项内容。同时,一般防火墙的包过滤的过滤规则是在启动时配置好的,只有系统管理员才可以修改,是静态存在的,称为静态规则。本次毕业设计我大胆的采用了基于连接状态的检查,将属于同一连接的所有包作为一个整体的数据流看待,通过规则表与连接状态表的共同配合进行检查。这也是本次毕业设计所要解决的关键技术问题。
研究的基本思路和方法、技术路线、实验方案及可行性分析
本次毕业设计拟采用微软的VC++语言进行软件编程,以netfilter核心作为防火墙的主要架构。
netfilter是核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,而链又是规则的容器(如图一所示)。
该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略(policy)来处理该数据包。
数据包在filter表中的流程如图二所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
包过滤设备按照如下方式工作:
(1) 包过滤标准必须为包过滤设备端口存储起来,这些包过滤标准叫包过滤规则;
(2) 当包到达端口时,包的报头被进行语法分析,大多数包过滤设备只检查IP、TCP或UDP报头中的字段,不检查包体的内容;
(3) 包过滤器规则以特殊的方式存储。应用于包的规则的顺序与包过滤器规则存储的顺序相同;
(4) 如果一条规则阻止包传输或接收,此包便不被允许;
(5) 如果一条规则允许包传输或接收,该包可以继续处理;
(6) 如果一个包不满足任何一条规则,该包被阻塞。
VC语言和Netfilter架构都是非常成熟稳定的技术。不需要额外的设备投入。只需要一台pc机就可以进行软件防火墙的开发设计。Netfilter内核比以往的ipfwadm和ipchains思路上清晰了好多,也好理解了好多。这对于我这个新手来说无疑是最佳的选择。VC++语言虽然对我难度比较大,但是我会在防火墙制作的过程中不断向指导老师请教学习,这对我来说也是一次非常好的学习机会。此次软件防火墙的毕业设计方案,无论是从技术的可靠性和可操作性方面分析都是可行的。