我首先想到的是安装某种防火墙,使实验室远离那些外界的潜在威胁,而又不对实验室的用户进行过多的限制。几个星期以前,我安装了我的第一个ipfilter防火墙,并且设置了NAT和其他东西,总共只花费了几个小时的时间。虽然我很清楚的知道荷兰的Unix社区是Linux的狂热支持者,但是我觉得FreeBSD加ipfilter(或者OpenBSD加packetfileter)比Linux防火墙更容易配置。Linux防火墙的规则与ipfilter的规则比起来过于复杂和模糊,因此FreeBSD加ipfilter成为我的首选。
或许正如你所知道的那样,ipfilter支持防火墙和NAT功能,因此我的第一个选择就是使用外部IP地址,给所有机器一个私有网段的IP地址(比如10.0.0.x),NAT和过滤所有东西,并且我在一个小时内完成了这项工作。不幸的是,学院管理员不希望那样做。他们的理由是,如果有人从Internet上入侵到我们实验室的某台机器,那么我们将NAT到整个实验室,这样会对寻找被攻击的机器增加难度。所以所有机器必须保留他们所分配的IP地址。
但是,你如何象那样设置?很明显,你可以使用普通的NAT。那么,你怎么为你的防火墙分配IP地址和网络标志(Netmask)呢?解决的办法就是网桥。网桥将两个网段链接在一起,并且使他们看上去象一个网络。因此,最基本的,你可以把数据包从一个网段复制到另外一个网段。那么,为什么不在他们之间放置一个过滤器,从而构建一个带有过滤功能的网桥呢?带有过滤功能的网桥使在不改变网络设置的情况下对数据包进行过滤变成可能,还可以避免重新铺设线路。带过滤功能的网桥也被认为是一个透明的过滤器。
FreeBSD通过ipfw对构建带有过滤功能的网桥提供了很好的支持,并且已经有很多很好的关于这方面的指南。但是,我对ipfilter十分着迷。FreeBSD 4-STABLE分支并不正式支持ipfilter上带过滤功能的网桥(但在5-CURRENT中是标准设置)。但是已经有4-STABLE上的补丁,并且我认为比我见过的稳定发行版更好。
我在一台老PC上安装了FreeBSD 4.6(包含kernel代码),下载了补丁,将它们进行了应用,并且编译了一个新内核。我在内核配置中添加了如下选项:
options BRIDGE
options IPFILTER
我去掉了其他大多数选项。在重建一个新内核之后,我重启了机器。在启动前,我输入了下面的sysctl命令(当然,也把它们放进了/etc/sysctl.conf):
sysctl net.link.ether.bridge_cfg=xl0:0,xl1:0
sysctl net.link.ether.bridge_ipf=1
sysctl net.link.ether.bridge=1
现在,我已经拥有了一个带ipfilter过滤功能的网桥(在xl0和xl1之间进行设置),但是它还没有被配置来进行任何过滤。
接着就是设置过滤规则。第一步是在/etc/rc.conf中激活ipfilter:
ipfilter_enable="YES"
我把ipfilter的规则放到/etc/ipf.rules,因此我只需要进行这一点点更改。