提示:
在OpenBSD 4.7以后,PF中的NAT等规则发生了一些变化,请读者自行参考PF的用户手册,以免产生疑惑。
《The BOOK Of PF》中文版——PF的故事
《文章来源——The BOOK Of PF》
被大多数人简称为PF的OpenBSD的Packet Filter子系统最初在2001年夏季和秋季由Daniel Hartmeier和一部分OpenBSD的开发人员共同编写的, 并在很短的时间内取得了惊人的进展。最终在2001年12月随着OpenBSD 3.0版的发布,PF作为OpenBSD 3.0的基本系统组件出现在人们的视野里。
在此之前,另一款防火墙子系统软件IPFilter已经被非常紧密地嵌入在OpenBSD的基本系统内,但当Darren Reed突然向全世界宣布为OpenBSD使用的防火墙子系统——新的IPFilter最终不再遵循BSD许可时,OpenBSD项目显然被打了一个措手不及,当时真是急需一款新的防火墙软件。实际上,这个所谓的新许可并非如Darren Reed所描述的那样: 他的这个许可本身几乎是逐字拷贝了BSD的许可, 但唯独漏掉了允许修改代码和再发行修改版本的权利。
OpenBSD版本的IPFilter包含了很多的变化和自定义, 正因为这样,根据新的IPFilter许可这是不允许的,因此IPFilter在2001年5月29日从OpenBSD的源代码树内剔除, 而在其后的几周内OpenBSD的当前版不包含任何一款防火墙软件。
很幸运的是, 在此之前,瑞士的Daniel Hartmeier已经做了一些有限的实验,其中包括内核的网络代码修改。 他最初通过在网络堆栈中调用一小段自己写的的程序,然后让数据包通过。后来他开始考虑如何过滤数据包。再后来就是发生了IPFilter的许可危机。
PF代码的首次提交是在2001年的6月24日、星期天的19:48:58 UTC。
经过几个月认真的测试, 随着OpenBSD 3.0发行的PF版本已经具备了相当完善的包过滤功能, 而且还包含了网络地址转换功能。
在外人看来, Daniel Hartmeier和其他的PF开发人员肯定是很好地利用了他们在IPFilter代码上的经验。2002年,Daniel给USEINX提供了一份包含性能测试的数据, 这份数据显示在承受一定的环境压力时,OpenBSD 3.1上的PF性能等同甚至是超越了同样在OpenBSD 3.1上运行的IPFilter或者在Linux上运行的iptables。
此外, 经过与OpenBSD 3.0上的上一个版本的PF进行对比,结果表明多数情况下OpenBSD 3.1上的PF新代码在执行效率上要更好。 (Daniel Hartmeier的主页上提供的一篇文章描述了相关细节; 请参阅 http://www.benzedrine.cx/pf-paper.html.)
这些事情发生在几年前了, 而从那以后, OpenBSD和PF都经历了硬件和网络环境的更新换代。我最近没有看到相关的性能测试比较, 但是根据我自己还有其他部分人员的经验, PF在过滤性能上的优势还是十分明显的。 就像下面这份数据显示的那样 (主要说明了最低端设备仍然还可以发挥作用), 在我的办公室内部网络和Internet之间的网关是一台仅有384MB内存的Pentium III 450MHz 。 以前每当我想起检查它时, 根据top命令的显示结果,idle的百分比从未小于96%
很自然,PF代码对OpenBSD的姊妹BSD系统也很有吸引力。像我们我们前面介绍的那样, PF作为OpenBSD基本系统的默认packet filter后,FreeBSD项目也逐渐认可了PF, 最开始,在FreeBSD 5.3中PF是做为一个package, 现在是将其作为三个包过滤子系统之一嵌入到基本系统内。到目前为止,PF已经包含在NetBSD和DragonFly BSD中。