使用Mac OS X已經(jīng)半年多了,很炫是真的,很懸也不假!Mac有太多太多的特性值得讓你花大量的時(shí)間仔細(xì)琢磨,用起來讓你自豪的找不著北,最終你會(huì)深信自己是一個(gè)很時(shí)尚的人...我承認(rèn)自己很土,也不是什么果粉,更不是什么達(dá)人,因此我除了使用Mac最基本的功能外,幾乎沒有去深究其它。突然間,我發(fā)現(xiàn)Mac居然是一個(gè)BSD,雖然這個(gè)事實(shí)我早就知道,但是也只有在我在命令行敲入man ipfw的時(shí)候,我才真的想深究一下這個(gè)手邊的Unix,于是乎,不再覺得Unix很遙遠(yuǎn),它居然就在手邊,于是乎,我的MacBook也就成了我的Unix試驗(yàn)機(jī)了。
偉大的Unix初看很龐大,然而用起來還真的比Linux簡單,Cisco IOS這樣的網(wǎng)絡(luò)操作系統(tǒng)內(nèi)核也是基于BSD的,在BSD之上出現(xiàn)了兩個(gè)ios,一個(gè)是Cisco的IOS,一個(gè)是Apple的iOS,足見其偉大!
一.防火墻軟件學(xué)習(xí)歷程
關(guān)于防火墻,最開始學(xué)習(xí)的是華為VRP系統(tǒng)的命令,那是2004年,聽講師說和Cisco命令差不多,當(dāng)時(shí)我們都一準(zhǔn)認(rèn)為有抄襲的內(nèi)幕,于是自學(xué)了Cisco,發(fā)現(xiàn)還真的很像,幾乎是一模一樣...2006年參加工作第一次看到有人在Linux終端前敲命令,我開口就給同事說,我們配路由器配防火墻就是那樣的...太丟人了,其實(shí)那是Linux而已,于是就自學(xué)了Linux,學(xué)習(xí)iptables是08年的事了。
現(xiàn)在想想,但凡命令行,差別都不大,如果你在windows命令行輸入netsh,結(jié)果也差不多。因此我不認(rèn)為那是抄襲了,充其量是拿來主義,共同點(diǎn)的底層一定是相同的組件,這種組件其實(shí)就是BSD內(nèi)核。最終如果你比較一下各種包過濾機(jī)制,就會(huì)發(fā)現(xiàn),Cisco,H3C,Windows的都差不多,只有Linux的Netfilter是個(gè)例外。Mac OS基于BSD,因此只要懂得Cisco,Mac OS上的命令行防火墻命令也就很容易駕馭了。
二.ipfw簡介以及與Netfilter的異同
想要簡介,最好就是man一下ipfw,這里就不列舉了。最關(guān)鍵的是一個(gè)章節(jié),那就是“PACKET FLOW”這一章節(jié)。只有你知道數(shù)據(jù)包在協(xié)議棧的哪些地方被過濾,你才能設(shè)計(jì)好良好的規(guī)則集。
相比于Netfilter的5個(gè)HOOK點(diǎn),這幅圖看起來清爽多了,一個(gè)包最多經(jīng)過4個(gè)HOOK點(diǎn),而Netfilter則復(fù)雜的多,按照路由前,路由后以及路由結(jié)果三個(gè)要素將HOOK點(diǎn)劃分為5個(gè),任何點(diǎn)的規(guī)則都需要你仔細(xì)考慮路由的結(jié)果以及是否可以過濾,ip_conntrack機(jī)制以及由于conntrack機(jī)制內(nèi)置的動(dòng)態(tài)規(guī)則加重了事情的復(fù)雜度。
現(xiàn)摘錄一段ipfw命令的man手冊內(nèi)容:
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.這段話說了兩個(gè)意思,第一個(gè)意思就是ruleset是全局的,不區(qū)分HOOK點(diǎn)的,每一個(gè)HOOK點(diǎn)都要遍歷所有的ruleset中的rule;另一個(gè)意思是說需要配置者來完成一切。我們看一個(gè)簡單的規(guī)則,禁掉icmp:
ipfw add deny icmp from any to any是不是和Cisco的很像,然而卻和iptables的一點(diǎn)都不像。
三.ipfw的動(dòng)態(tài)規(guī)則
Netfilter有ip_conntrack機(jī)制可以追蹤每一個(gè)流。這個(gè)ip_conntrack機(jī)制讓人歡喜讓人愁,于是可以在PREROUTING的raw表上配置notrack。ipfw就不一樣了,它可以在任意地方針對任意流進(jìn)行track,這就是其state機(jī)制,ipfw通過keep-state來追蹤一個(gè)流,并且建立針對該包反向包的動(dòng)態(tài)規(guī)則,通過check-state來匹配keep-state建立的動(dòng)態(tài)規(guī)則,ipfw的state可以在任意匹配的地方被keep,所謂的keep就是建立一條動(dòng)態(tài)規(guī)則,其動(dòng)作就是keep-state的動(dòng)作,這個(gè)比較類似Netfilter的ip_conntrack和state match的聯(lián)動(dòng)機(jī)制。以下是一個(gè)man手冊中的實(shí)例,我在前面加上了注釋:
對每一個(gè)包c(diǎn)heck所有的動(dòng)態(tài)創(chuàng)建的rule:
ipfw add check-state對本地子網(wǎng)始發(fā)的TCP流量放行且保持連接,創(chuàng)建動(dòng)態(tài)rule:
ipfw add allow tcp from my-subnet to any setup keep-state禁用其它地方始發(fā)的TCP連接:
ipfw add deny tcp from any to any上述實(shí)例的分析:
內(nèi)網(wǎng)始發(fā)一個(gè)TCP,由于沒有任何動(dòng)態(tài)rule,因此直接匹配到第二個(gè)rule并且保持了這個(gè)conntrack創(chuàng)建了反向動(dòng)態(tài)rule,該連接的返回包到達(dá)這個(gè)Box時(shí),由于匹配到了動(dòng)態(tài)rule,因此通過。如果是外網(wǎng)始發(fā)的TCP到達(dá)內(nèi)網(wǎng),將直接匹配到第三條rule。如果使用iptables的話,則如下配置:
iptables -t raw -A PREROUTING -p tcp -s ! my-subbet -j NOTRACK
iptables -A FORWARD -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s my-subnet -j ACCEPT
iptables -A FORWARD -p tcp -j DROP使用ipfw,就不用非要在特定的HOOK點(diǎn)來進(jìn)行track了,它可以隨時(shí)進(jìn)行track,隨時(shí)進(jìn)行check。ipfw可以將track和target結(jié)合在一條rule中,可以針對特定的filter rule進(jìn)行track,而Netfilte的iptables卻必須將這些關(guān)聯(lián)解除。
四.ipfw和natd
使用iptables,我們可以使用nat表來配置NAT,然而使用ipfw卻不能做到這一點(diǎn),在BSD中,nat只是一個(gè)target,存在用戶態(tài)的natd進(jìn)程來進(jìn)行nat,也可以使用ipnat來完成,不管哪種方式,都使用了divert這個(gè)動(dòng)作,所謂divert,其實(shí)就是其字面含義,將控制轉(zhuǎn)發(fā)到其它的邏輯,對于nat,很常見的就是將控制轉(zhuǎn)發(fā)到natd進(jìn)程。我在Mac OS上,配置以下的nat:
ipfw add divert natd all from any to any via en1
natd -interface en1其中divert natd將匹配的數(shù)據(jù)包“路由”到natd進(jìn)程。至于natd進(jìn)程,也可以man一下,有下列關(guān)鍵的敘述:
The natd normally runs in the background as a daemon. It is passed raw IP packets as they travel into and out of the machine, and will possibly change these before re-injecting them back into the IP packet stream.
It changes all packets destined for another host so that their source IP number is that of the current machine. For each packet changed in this manner,an internal table entry is created to record this fact. The source port number is also changed to indicate the table entry applying to the packet. Packets that are received with a target IP of the current host are checked against this internal table. If an entry is found, it is used to determine the correct target IP number and port to place in the packet.可見natd本身就是保持狀態(tài)的,不需要keep-state和check-state,然而如果你想小實(shí)驗(yàn)一把keep-state和check-state,那么你可能會(huì)注意到ipfw有一via/recv/xmit系列match,上例中是使用via,如果使用xmit的話,那么只能適用于out方向的數(shù)據(jù)包,man ipfw中有下述:
The recv interface can be tested on either incoming or outgoing packets, while the xmit interface can only be tested on outgoing packets. So out is required (and in is invalid) whenever xmit is used.注意,in/out匹配的是數(shù)據(jù)包方向,而via/recv/xmit匹配的是接口。xmit時(shí)已經(jīng)確定了接口,對于in方向的數(shù)據(jù)包,由于還沒有路由,所以不能確定出口設(shè)備,進(jìn)而不能用于xmit。如果我們創(chuàng)建以下的rule:
ipfw add divert natd all from any to any xmit en1
natd -interface en1如此一來,對于返回的數(shù)據(jù)包將全部放過,雖然natd是保持狀態(tài)的,然而并沒有rule將數(shù)據(jù)包divert到natd,所以僅僅為了將數(shù)據(jù)包divert到natd,需要使用keep-state:
ipfw add check-state
ipfw add divert natd all from any to any xmit en1 keep-state這樣就可以對付返回的數(shù)據(jù)包了。然而問題是,內(nèi)核保持的state狀態(tài)可能會(huì)和natd中的狀態(tài)相沖突,因此對于有狀態(tài)的協(xié)議比如TCP,此方式工作的很好,對于UDP和ICMP會(huì)有不穩(wěn)定的問題。
五.最后再來點(diǎn)比較
ipfw和Cisco一樣,畢竟都是BSD的緣故,都是將數(shù)據(jù)包分為了in和out兩個(gè)方向,并且都可以認(rèn)為應(yīng)用于接口,雖然ipfw在內(nèi)核中保存了一份全局的ruleset。不管怎樣,Netfilter絕不是這樣,另外,Netfilter的iptables區(qū)分了INPUT和FORWARD,所以FORWARD的數(shù)據(jù)包無需經(jīng)過INPUT鏈,而ipfw則是全局的rule。ipfw和natd可以在任意位置相互插入,任意動(dòng)作包括divert natd都可以和state聯(lián)動(dòng),實(shí)現(xiàn)了動(dòng)作的stateful,也就是說,ipfw的機(jī)制可以記住一個(gè)流的頭包或者任意包的第一次匹配的動(dòng)作,而Netfilter的conntrack和rule則是分離的,conntrack僅僅追蹤了連接,filter動(dòng)作需要自己去匹配,沒有filter的動(dòng)態(tài)rule。最后,ipfw保存一份ruleset,在man ipfw所示的圖的一路最多4個(gè)HOOK點(diǎn)重復(fù)check。
分享名稱:初探BSD的ipfw防火墻
分享網(wǎng)址:http://www.chinadenli.net/article6/igphig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、搜索引擎優(yōu)化、動(dòng)態(tài)網(wǎng)站、域名注冊、品牌網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)