夏武 徐继哲

自由软件不但功能强大,更重要的是赋予了用户使用软件的自由。

对于常规的网络安全应用,我们完全可以用自由软件定制出符合自己需求的防火墙。
什么是自由软件?自由软件强调的是用户的自由,而不仅仅是费用问题。其需要满足一定自由度才能称得上是自由软件。
自由软件的历史要追溯到Richard Stallman在1983年发起的自由软件运动。该运动以GNU工程为核心,开发了大量优秀的自由软件,比如GNU Emacs、GNU GCC、GNU GDB等,最终的目标是要开发一个完整的、自由的操作系统。随着这些自由软件日渐流行,为了保证已经发行的自由软件能够继续自由下去,Richard Stallman创造性地发明了对称版权(Copyleft)思想,并在1985年实现了第一个对称版权许可证作为GNU Emacs的许可证。在1991年,GNU实现了GNU GPL Version 2。在GNU GPL Version 2的守护之下,大量的优秀自由软件不断涌现,其中名气最大的是Linux Kernel。
在流行定制的今天,普通用户自己定制个人计算机可能已是司空见惯的事情了,定制防火墙倒是比较新鲜。当需要用到防火墙的时候,你可能会马上想到去市场上买一个某某厂家生产的防火墙,因为定制防火墙可能不像定制个人计算机那么简单。
不过,在自由软件的帮助下,你也可以轻松地定制自己的防火墙,在节省一大笔开销和享受定制乐趣的同时,更好地保护自己或者组织的网络安全。
下面我们将介绍一下利用现有的自由软件定制防火墙的步骤。
软硬件准备
说起定制防火墙需要的硬件,很多你淘汰的计算机都可以派上用场。当然,现在计算机硬件价格变得越来越便宜,在硬件上的选择会更多。下面我们将以x86架构的硬件为例。
具体的要求可考虑以下两个方面:
首先,对于存储设备,可以考虑使用IDE硬盘或者CF Card。存储设备上的分区格式可以采用EXT3或者EXT2格式,并在使用之前分好区。 其次,最好有三个网络接口,也就是三块网络接口卡,包括进口、出口以及DMZ。
在计算机上安装一个GNU Linux系统或者使用LiveCD。对硬盘分区的命令如下(假定我们要安装防火墙的硬盘为IDE,在GNU Linux下对应的设备文件是/dev/hdb):
#fdisk /dev/hdb 分完区之后,我们可以格式化分区: #mkfs.ext3 /dev/hdb1 接着将格式化的分区挂载到/mnt/firewall: #mount -t ext3 /dev/hdb1 /mnt/firewall
定制防火墙需要的自由软件包括: ①netfilter/iptables;②SSH Daemon;③DHCP和DNS服务器;④Grub;⑤uClibc和交叉编译工具链;⑥Linux内核;⑦BusyBox;⑧构建防火墙规则集的工具,例如Firewall Builder。
编译内核及应用程序
编译内核需要考虑是否将内核模块直接编译进内核,因为防火墙的内核实现部分是以内核模块的形式存在的。二者的区别在于,将内核模块不直接编译进内核相比较而言扩展性更好一些。不过,为了简单起见,我们将内核模块直接编译进内核。
在配置内核选项的时候,强烈推荐将Netfilter相关的选项和网卡驱动程序都选上,并且这些选项都应该是静态编译的。
配置完选项之后就可以编译了,编译会花费几分钟的时间。编译完成之后将在arch/ARCHICTURE/boot(比如arch/i386/boot)下生成一个叫做Bzimage的内核映像文件,这个文件在下面的步骤中将用到。
编译应用程序非常简单。需要注意的一点是,要用前面下载的交叉编译工具链编译后面的应用程序。
首先解压缩下载的BusyBox源代码包,执行“make menuconfig”进行配置。在进行配置的时候,一个重要的选项是指定交叉工具链中GCC的位置,这对编译机器和目标机器体系结构不同的情况比较有用。另外,Ifconfig、IP和Udhcp选项和子选项需要激活。等这些都配置好之后,需要配置Init Utilities部分,把需要在系统启动阶段启动的服务都打开。接着是编译Iptables、Openssh、Dnsmasq和Grub。如果遇到问题的话,这些自由软件都有很好的安装文档。
制作文件系统
需要安装的软件在前面已经编译好了,该是制作文件系统的时候了。首先,将BusyBox安装到/mnt/firewall目录下,这时你会看到一个很熟悉的环境。接下来在/mnt/firewall下面创建几个文件夹:dev、etc、lib、proc、usr和boot。接着,我们将往新创建的文件夹里面创建和拷贝程序、库文件。然后将交叉编译工具链的lib目录下的库文件拷贝到lib目录;拷贝Iptables和Dnsmasq的可执行文件到sbin目录;在dev目录下创建设备文件。最后我们用Chroot方式创建根用户和启动脚本,其中启动脚本里面的防火墙规则可以通过Firewall Builder这样的自由软件来定制。
我们这里选择Grub作为引导程序。将Grub里面的stage1、stage2、e2fs_stage_1_5拷贝到boot目录下,然后编辑menu.list,安装Grub的引导程序。到此,定制防火墙的工作基本上完成了。重新启动,定制的成果马上就可以看到了。
Netfilter和Iptables已经提供了非常强大的功能,大部分情况下够用了。如果你需要一些特别的功能的话,完全可以基于Netfilter开发自己的特色内核模块。
开发管理界面
如果你觉得基于命令行的防火墙管理不方便的话,我们可以自己定制防火墙的Web管理界面。首先,需要确定使用的网页服务器。常用的网页服务器包括Apache、Lighttpd等,可以考虑使用Apache作为我们的网页服务器。但是,由于Apache功能很强大,对于我们的防火墙来说,很多功能都是用不到的,所以我们需要对Apache的功能进行裁剪。
接下来是选择开发语言的问题。开发语言间差异比较大,有C、C++、Perl、PHP、Python可供选择。由于我们的防火墙可能会运行在一些内存比较有限的机器上,并且对速度要求比较高,业务流程也比较简单,所以C和C++是比较适合的语言。当然你也可以用其他的语言,依赖于你的具体情况。
总的来说,对于常规的网络安全应用,我们完全可以用已有的自由软件定制出符合自己需求的防火墙,而不必购买硬件防火墙设备,这就是自由软件的价值。自由软件不但功能强大,更重要的是赋予了用户使用软件的自由。在面对网络安全这样的关键应用的时候,自由软件让你能够自己控制自己的命运,而不依赖某个厂商。 |