在开发前,首先要清楚知道自已要需要的是什么类型的防火墙。同为硬件防火墙,大致可以分为高端以千兆为代表的主火墙,中端的百兆企业防火墙,以及低端家庭 -小办公室的防火墙(SOHU-SMB)。这三个级别的防火墙的开发方式有很大的不同。高端千兆防火墙的代表产品包括Netscreen的 5000系列防火墙,以及Nodia-CheckPoint的IP720以上的产品,这级防火墙能够适应千兆要求的作业,吞吐量至少在600M以上。作为国内生产商目前要推出真正的千兆防火墙是很困难的,详情请参考:为什么实现千兆防火墙很困难 而作为低端家庭-小办公室产品的防火墙,主要受的是硬件成本的压力。这一级产品包括如Netscreen的50/25/5X系列, Fortigate的FG200和FG300,以及一些市场上的拨号器、宽带路由器都可以归属这档防火墙。工作特点多是单进单出,主要用在小局域网进出互联网的控制。考虑到一般公司出入互联网的通道充其量也就几兆,即使是LAN用户或CABLE MODEM,公共出口也仍是几兆。因此,自适应十兆/百兆的单进出小防火墙基本上可以满足要求。事实上有些几百人的公司使用win98+sysgate拨号,也是自我感觉良好,可见这一档次的上网防火墙性能要求并不高;价格也是维持在两万元以下。但对于使用X86架构的防火墙来说,要求再低硬件也是有几千元的;连上软件成本,这两万元简直无法维持。因此,这一级防火墙的主要开发方式,是选择合适的嵌入式系统,通常是Linux,连硬件和软件整套买进来,自已添加其中的防火墙应用程序。这种防火墙主要的系统开发工作由各嵌入系统的供应商完成,而系统功能也弱,留给生产商的软件施展空间也不大,所以更象是一项硬件采购项目。连同最低采购限额(一般是一千)和软件开发,大致在一百万左右就可以拿下一个产品。这种防火墙,虽然也是“硬件防火墙”,但不是我们本文的重点。 本文介绍的,是中档的企业级百兆防火墙的开发的主要步骤。这一级防火墙,是目前企业采购的主要对象,也是最需要的产品类型。国产防火墙,基本上集中在这个区间,操作系统一般选用开源的Linux或者BSD;相比之下,BSD的应用程序升级速度不算快,所以大部分防火墙选用的是Linux。 要决定开发一个百兆的防火墙,需要选定一款合适的服务器主板,或者工控机,另外就是要选定一个好的网卡,通常是服务器专用网卡。虽然象Linux 这样的操作系统可以自动适应不同的主板,(只要它符合象PC2000这样的标准),Linux的最新内核也总能支持较新的主板的性能,(如PIII的超线程);但每个主板和CPU之间还是有少许不同的;作为一个防火墙,除非对极端性能要求不是太严格,否则,需要针对主板和CPU的一些特性,如寄存器, SMP,超线程等等对内核进行针对性的修改和优化,否则,默认的内核就只能使用这些主板/CPU最基本的部分。举个例子说,防火墙有一个重要的性能指标叫最大会话数速率,或称每秒最大生成会话数,如果使用普适形的内核用到P3CPU上,能够达到的最大数值大致也就只有几千;但经过对针对主板设计(这种说明可以从主板和CPU厂商获取)进行优化,可以把性能提高到3-5万左右。同样,单纯升级主板和CPU不见得能提高性能,象把防火墙从P3升级到P4,如果没有支持P4的特殊性能,如超线程,最大会话能力就仍与P3没有区别,不如不升值,还可以减点成本。而专门的优化,则可以把性能达到50万,这也是这类防火墙的使用Intel架构主板目前所能达到的极限。针对选定硬件的优化工作尽管独立于防火墙开发的主体软件工作,一般情况下也不会显出它的必要性,但当防火墙进行极端的使用环境或评测环境时,显出的差距就非常大。针对网卡的开发驱动程序除了优化性能外,另一个目的就是要把防火墙与网关绑定在一起,以免被盗版。这个驱动程序与定造的防火墙内核一起,就令盗版显得困难得多了。 防火墙软件的开发工作主体就是防火墙管理软件的开发。对此,架构师要明白自已到底要开发那一种防火墙,防火墙的管理思路是什么。在几年前这种开发显得简单,就是用一些web调用的程序,(另一种办法是用dephi 写windows程序,通过特定端口服务控制防火墙,调用预设程序,原理也是一样的),直接调用Linux的防火墙管理工具如ipchains;其余的工作主要就是预先编好若干类的默认配置(相当于template)。因此开发难度不算大,十来个人一年半载总能完成;大批国产防火墙就是这样开发出来的。这种防火墙,对于熟悉Linux防火墙的高手来说是不必要的,自已用 Ipchains就可以达到同样的目的。因此,今天这种防火墙已经摆不上台面了。今天的防火墙主要是从便于管理着手,着眼于管理员可以较易对大量、复杂、多半的政策进行维护,这就需要开发“面向对象管理的防火墙”。这样一来,使用把 ipchains/iptables单纯用PHP或delphi图形化是不足够的,事实上,这时侯单纯使用如iptables已经很难满足要求,开发者常常必须开发自已的象iptables那样的防火墙管理工具。这部分的工作非常庞大。 作为防火墙的载体的操作系统和防火墙的内核也是一个工作重点。防火墙作为网络的第一道防线,不可以使用默认设置的操作系统,除了最必要的服务以外,所有东西都必须删除。因此,企业级防火墙基本上是使用的是嵌入式操作系统的开发方式,通通常是形成一个在内存中运行的安全操作系统,如同一个无盘的工作站。防火墙必须长时间无故障工作,还要应付可能有的突然断电等现象,所以,一般情况下禁止连接系统硬盘,以免造成断电损坏。防火墙的固存一般都不大, 16M到32M就绰绰有余了。有些防火墙厂商没有能力做到这一步,就使用大容易的FLASH作为系统盘,其实是非常危险的。原因在于flash的写性能差,可写次数只在千次数量级,而Unix类的文件系统读与频繁,因此极易造成flash上数据的丢失;而且一旦发生断电关机,如果仍然有系统盘安装在目录上,很可能造成文件系统的损坏,最终结果,即使最后可以抢救过来,也会给用户防火墙质量不过关的印象。 防火墙的内核也是一项不可少的工作内容。目前一般的防火墙都是使.netfilter作为防火墙的内核,而且都要求添加一定数量的防攻击性能。参考netfilter的深入应用举例。但有些防火墙产品把这项工作扩大化,希望由内核完成如IDS、防病毒的工作,尽管可以办到,但对防火墙的基本性能会造成严重的损害。 企业级的防火墙需要有多种远程管理工具,方法一般有三种,ssl+http,远程的secure shell,或者使用专用客户端工具。无论是那一种,都是基于同样的在防火墙预定的用户管理程序工作,这些管理程序被调用后,就与防火墙的接口管理程序(象iptables,或自编写的接口程序,象图腾ObjectMgr)互动,完成防火墙的管理工作。这部分的工作也是比较大的。象防火墙可以允许用户用 ssh登录,但却不可能允许直接返回root shell(太危险了),于是就必须开发一个安全的shell作为第一重接口,这样,开发者就相当于自已开发了一个BASH一类的解释程序了。对远程访问的安全控制是防火墙的一处重点,常常要结合管理机限制,IP/MAC限制,密码、证书认证等多重安全手段。否则,否许所有人都试图登录防火墙,防火墙本身就很危险,根本谈不上网络的安全性。 完成以上的工作后,再完成最先谈到的web-ssl管理界面,或者是delphi(或C+ +)的客户端管理工具。防火墙就基本上成形了,区别只在于用户是不是觉得你的管理工具好用不好用而已。(许多程序员认为防火墙工程不大,其实是他们的脑海中以为防火墙的研发只有这个图形管理界面一项而已)。但即使这样,作为防火墙的研发工程还远远没有完成。开发者常常还必须向防火墙添加VPN(这也是一个巨大的工程),代理服务器(如是要加,就要写多种协议的代理服务器),如PPPOE拨号,是否还要加会话认证;以及HA和负载平衡,以及支持透明模式接入;是否支持外部帐号管理,等等。 前文这些工作终于都完成了,大概可以松一口气交功课了吧?的确是这样,假如您不介意你的防火墙有BUG的话!否则,这个工程顶多只完成了一半。下面的工作就是编写测试实例进行测试。硬件防火墙由于对软件硬化处理,而且长时间无间断运行,因此,对软件的质量要求非常高。测试者至少要编写以下三种测试实例进行测试:1)程序中是否有内存对象没有清除;程序中残留有对没有clear是经常的事,象 windows的程序就有这个毛病,所以windows 开了一段时间后就要重启以便空出内存;在防火墙中这个要求严格得多,一个半个的对象残留对普通的软件项目没什么大不了的,但对于防火墙是致命的;防火墙的系统资源会在很短的时间内就完全被这个BUG吃光。2)使用防火墙的管理工具生成每指定的政策实例时,是否做到该放行的包放行,不该放行的包不放行;3)防火墙的极限工作条件;也不是如最大会话这样的测试,这些需要专门的测试工具如smartbit;高性能的防火墙还需要外包测试,因为设备太贵。如果防火墙集成了如VPN,IDS,防病毒等功能,还必须进一步编写测试实例,测试在启动这些功能时防火墙的其他性能的下降情况。 防火墙软件系统的测试是一项最耗时最耗力的工作,占了整个开发成本至少一半以上,任何一个测试通不过,都要重新debug,重新测试,直到测试完全通过为止。如果一个模块测试返工三次就通过,那个程序员一定是很优秀的;如果通过六七次,实在很正常;就算十次才通过,也不算是丢脸的。在这种反反复复的工作中,开发者就会发现,象前文说的那样把程序分成几个独立的层面分别开发,分别测试,文档完整,具有无可比拟的优势。否则,这样的开发工程那怕一千人做,做一百年都做不完。 只有完成测试工作,防火墙就算过关了。整个工程100人如果能够在一年里做完,就要谢天谢地了。开发一个企业级防火墙需要上千万人民币,各位朋友现在是不是理解一点了?同样,在几年前几个人做个管理界面调用ipchains,当然也是一个防火墙,的确也不是弄虚作假。只不过,在于各个厂商的选择而已。
这里说的虽然是硬件防火墙,但几乎所有的工作都是软件工作。硬件防火墙的核心是软件。