使用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的一點都不像。