初探BSD的ipfw防火墙


使用Mac OS X已经半年多了,很炫是真的,很悬也不假!Mac有太多太多的特性值得让你花大量的时间仔细琢磨,用起来让你自豪的找不着北,最终你会深信自己是一个很时尚的人...我承认自己很土,也不是什么果粉,更不是什么达人,因此我除了使用Mac最基本的功能外,几乎没有去深究其它。突然间,我发现Mac居然是一个BSD,虽然这个事实我早就知道,但是也只有在我在命令行敲入man ipfw的时候,我才真的想深究一下这个手边的Unix,于是乎,不再觉得Unix很遥远,它居然就在手边,于是乎,我的MacBook也就成了我的Unix试验机了。

伟大的Unix初看很庞大,然而用起来还真的比Linux简单,Cisco IOS这样的网络操作系统内核也是基于BSD的,在BSD之上出现了两个ios,一个是Cisco的IOS,一个是Apple的iOS,足见其伟大!

一.防火墙软件学习历程

关于防火墙,最开始学习的是华为VRP系统的命令,那是2004年,听讲师说和Cisco命令差不多,当时我们都一准认为有抄袭的内幕,于是自学了Cisco,发现还真的很像,几乎是一模一样...2006年参加工作第一次看到有人在Linux终端前敲命令,我开口就给同事说,我们配路由器配防火墙就是那样的...太丢人了,其实那是Linux而已,于是就自学了Linux,学习iptables是08年的事了。
        现在想想,但凡命令行,差别都不大,如果你在windows命令行输入netsh,结果也差不多。因此我不认为那是抄袭了,充其量是拿来主义,共同点的底层一定是相同的组件,这种组件其实就是BSD内核。最终如果你比较一下各种包过滤机制,就会发现,Cisco,H3C,Windows的都差不多,只有Linux的Netfilter是个例外。Mac OS基于BSD,因此只要懂得Cisco,Mac OS上的命令行防火墙命令也就很容易驾驭了。

二.ipfw简介以及与Netfilter的异同

想要简介,最好就是man一下ipfw,这里就不列举了。最关键的是一个章节,那就是“PACKET FLOW”这一章节。只有你知道数据包在协议栈的哪些地方被过滤,你才能设计好良好的规则集。过滤点如下图所示:

相比于Netfilter的5个HOOK点,这幅图看起来清爽多了,一个包最多经过4个HOOK点,而Netfilter则复杂的多,按照路由前,路由后以及路由结果三个要素将HOOK点划分为5个,任何点的规则都需要你仔细考虑路由的结果以及是否可以过滤,ip_conntrack机制以及由于conntrack机制内置的动态规则加重了事情的复杂度。
        现摘录一段ipfw命令的man手册内容:
Also note that each packet is always checked against the complete ruleset, irrespective of the place where the check occurs, or the source of the packet.  If a rule contains some match patterns or actions which are not valid for the place of invocation (e.g. trying to match a MAC header within ip_input() ), the match pattern will not match, but a not operator in front of such patterns will cause the pattern to always match on those packets.  It is thus the responsibility of the programmer, if necessary, to write a suit-able ruleset to differentiate among the possible places.
这段话说了两个意思,第一个意思就是ruleset是全局的,不区分HOOK点的,每一个HOOK点都要遍历所有的ruleset中的rule;另一个意思是说需要配置者来完成一切。我们看一个简单的规则,禁掉icmp:
ipfw add deny icmp from any to any
是不是和Cisco的很像,然而却和iptables的一点都不像。
  • 1
  • 2
  • 下一页

相关内容