研究BSD也已经有一段时间了,总感觉应该写点儿什么,可唯恐自己的理解不够深刻,误导大家。随着时间的推移,热情也在消退,一些以前有过的想法也逐渐忘记了,也许是时候写点儿什么了,只是为了记录下自己的一点点儿理解,错误和偏颇在所难免,请读者自辩。
研究BSD是从BSD系列的防火墙开始的,在BSD的世界里面主要有三个防火墙实现:ipfilter,ipfw/dummynet,pf/altq。ipfilter因为许可证的缘故已经渐渐退出了主流,Solaris代码中还有其身影,ipfw是FreeBSD的默认防火墙,pf是OpenBSD的默认防火墙,其中FreeBSD无愧是BSD的集大成者,它也将pf移植到了自身之中,不过其开发进步固然比不上OpenBSD的pf。dummynet和altq分别是对应的QoS实现,还有一种说法是ipfw是dummynet的组成部分。
相较pf,ipfw多少有些显得不够成熟,可能和其历史的出身(网络模拟)有关。ipfw的TCP状态因为缺少了对TCP序列号的校验,在某种程度上,不能算是全状态防火墙,这导致:黑客可以通过发送特定的RST包,删除防火墙对某条连接的跟踪状态,而序列号不必在窗口之内,攻击难度相对降级。pf是个比较整体的解决方案:同步防火墙状态,提供了较为高级的可靠性;可以将数据包转发到用户空间,使其可以用tcpdump查看;可以将流统计数据以兼容netflow v5的格式输出;pf内建了负载均横机制。pf还有一个比较好的功能就是synproxy,临渊羡鱼不如退而结网,因此我实现了,并且努力将其推入官方内核。也大幅度的提高了性能,不过看来其并行性似乎仍然没有太大提升。在并行化方面,pf可以考虑用hash表替代红黑树索引状态表,并且考虑用FreeBSD的read-mostly lock或者是类似Linux的RCU机制优化读写锁。关于优化,
FreeBSD的优化经验表明以后的优化重点是:以cache为中心进行设计;尽可能并行化;充分利用硬件的功能,减轻CPU负担。
从QoS来讲,,并成功port到了Linux和Windows平台,不过其仍然不支持层级调度,仍然无法和altq同日而语。
说了这么多,也来讲讲Linux。Linux的防火墙部分是netfilter/iptables,QoS部分是tc,负载均横部分是lvs,这几个组件比BSD的同类组件来说,更为强大。但是,这几个组件之间多少也有些功能上的重叠,比如说:tc的分类部分和iptables的raw table;lvs的连接跟踪和netfilter的连接跟踪。不过这也带来某种程度的灵活性,因为各个组件相对独立。性能上来说,因为我没有实际测试过,所以不好臆测,但是,大家都在努力,Linux方面因为社区成员较为活跃,即使不领先,也不至于落后吧?
阅读(5028) | 评论(0) | 转发(0) |