使用Mac OS X已經(jīng)半年多了,很炫是真的,很懸也不假!Mac有太多太多的特性值得讓你花大量的時(shí)間仔細(xì)琢磨,用起來(lái)讓你自豪的找不著北,最終你會(huì)深信自己是一個(gè)很時(shí)尚的人...我承認(rèn)自己很土,也不是什么果粉,更不是什么達(dá)人,因此我除了使用Mac最基本的功能外,幾乎沒(méi)有去深究其它。突然間,我發(fā)現(xiàn)Mac居然是一個(gè)BSD,雖然這個(gè)事實(shí)我早就知道,但是也只有在我在命令行敲入man ipfw的時(shí)候,我才真的想深究一下這個(gè)手邊的Unix,于是乎,不再覺(jué)得Unix很遙遠(yuǎn),它居然就在手邊,于是乎,我的MacBook也就成了我的Unix試驗(yàn)機(jī)了。
偉大的Unix初看很龐大,然而用起來(lái)還真的比Linux簡(jiǎn)單,Cisco IOS這樣的網(wǎng)絡(luò)操作系統(tǒng)內(nèi)核也是基于BSD的,在BSD之上出現(xiàn)了兩個(gè)ios,一個(gè)是Cisco的IOS,一個(gè)是Apple的iOS,足見(jiàn)其偉大!
一.防火墻軟件學(xué)習(xí)歷程
關(guān)于防火墻,最開(kāi)始學(xué)習(xí)的是華為VRP系統(tǒng)的命令,那是2004年,聽(tīng)講師說(shuō)和Cisco命令差不多,當(dāng)時(shí)我們都一準(zhǔn)認(rèn)為有抄襲的內(nèi)幕,于是自學(xué)了Cisco,發(fā)現(xiàn)還真的很像,幾乎是一模一樣...2006年參加工作第一次看到有人在Linux終端前敲命令,我開(kāi)口就給同事說(shuō),我們配路由器配防火墻就是那樣的...太丟人了,其實(shí)那是Linux而已,于是就自學(xué)了Linux,學(xué)習(xí)iptables是08年的事了。
現(xiàn)在想想,但凡命令行,差別都不大,如果你在windows命令行輸入netsh,結(jié)果也差不多。因此我不認(rèn)為那是抄襲了,充其量是拿來(lái)主義,共同點(diǎn)的底層一定是相同的組件,這種組件其實(shí)就是BSD內(nèi)核。最終如果你比較一下各種包過(guò)濾機(jī)制,就會(huì)發(fā)現(xiàn),Cisco,H3C,Windows的都差不多,只有Linux的Netfilter是個(gè)例外。Mac OS基于BSD,因此只要懂得Cisco,Mac OS上的命令行防火墻命令也就很容易駕馭了。
二.ipfw簡(jiǎn)介以及與Netfilter的異同
想要簡(jiǎn)介,最好就是man一下ipfw,這里就不列舉了。最關(guān)鍵的是一個(gè)章節(jié),那就是“PACKET FLOW”這一章節(jié)。只有你知道數(shù)據(jù)包在協(xié)議棧的哪些地方被過(guò)濾,你才能設(shè)計(jì)好良好的規(guī)則集。過(guò)濾點(diǎn)如下圖所示:
相比于Netfilter的5個(gè)HOOK點(diǎn),這幅圖看起來(lái)清爽多了,一個(gè)包最多經(jīng)過(guò)4個(gè)HOOK點(diǎn),而Netfilter則復(fù)雜的多,按照路由前,路由后以及路由結(jié)果三個(gè)要素將HOOK點(diǎn)劃分為5個(gè),任何點(diǎn)的規(guī)則都需要你仔細(xì)考慮路由的結(jié)果以及是否可以過(guò)濾,ip_conntrack機(jī)制以及由于conntrack機(jī)制內(nèi)置的動(dòng)態(tài)規(guī)則加重了事情的復(fù)雜度。
現(xiàn)摘錄一段ipfw命令的man手冊(cè)內(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.這段話說(shuō)了兩個(gè)意思,第一個(gè)意思就是ruleset是全局的,不區(qū)分HOOK點(diǎn)的,每一個(gè)HOOK點(diǎn)都要遍歷所有的ruleset中的rule;另一個(gè)意思是說(shuō)需要配置者來(lái)完成一切。我們看一個(gè)簡(jiǎn)單的規(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就不一樣了,它可以在任意地方針對(duì)任意流進(jìn)行track,這就是其state機(jī)制,ipfw通過(guò)keep-state來(lái)追蹤一個(gè)流,并且建立針對(duì)該包反向包的動(dòng)態(tài)規(guī)則,通過(guò)check-state來(lái)匹配keep-state建立的動(dòng)態(tài)規(guī)則,ipfw的state可以在任意匹配的地方被keep,所謂的keep就是建立一條動(dòng)態(tài)規(guī)則,其動(dòng)作就是keep-state的動(dòng)作,這個(gè)比較類(lèi)似Netfilter的ip_conntrack和state match的聯(lián)動(dòng)機(jī)制。以下是一個(gè)man手冊(cè)中的實(shí)例,我在前面加上了注釋?zhuān)?br />對(duì)每一個(gè)包c(diǎn)heck所有的動(dòng)態(tài)創(chuàng)建的rule:
ipfw add check-state對(duì)本地子網(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,由于沒(méi)有任何動(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,因此通過(guò)。如果是外網(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)來(lái)進(jìn)行track了,它可以隨時(shí)進(jìn)行track,隨時(shí)進(jìn)行check。ipfw可以將track和target結(jié)合在一條rule中,可以針對(duì)特定的filter rule進(jìn)行track,而Netfilte的iptables卻必須將這些關(guān)聯(lián)解除。
四.ipfw和natd
使用iptables,我們可以使用nat表來(lái)配置NAT,然而使用ipfw卻不能做到這一點(diǎn),在BSD中,nat只是一個(gè)target,存在用戶(hù)態(tài)的natd進(jìn)程來(lái)進(jìn)行nat,也可以使用ipnat來(lái)完成,不管哪種方式,都使用了divert這個(gè)動(dòng)作,所謂divert,其實(shí)就是其字面含義,將控制轉(zhuǎn)發(fā)到其它的邏輯,對(duì)于nat,很常見(jiàn)的就是將控制轉(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.可見(jiàn)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)確定了接口,對(duì)于in方向的數(shù)據(jù)包,由于還沒(méi)有路由,所以不能確定出口設(shè)備,進(jìn)而不能用于xmit。如果我們創(chuàng)建以下的rule:
ipfw add divert natd all from any to any xmit en1
natd -interface en1如此一來(lái),對(duì)于返回的數(shù)據(jù)包將全部放過(guò),雖然natd是保持狀態(tài)的,然而并沒(méi)有rule將數(shù)據(jù)包divert到natd,所以?xún)H僅為了將數(shù)據(jù)包divert到natd,需要使用keep-state:
ipfw add check-state
ipfw add divert natd all from any to any xmit en1 keep-state這樣就可以對(duì)付返回的數(shù)據(jù)包了。然而問(wèn)題是,內(nèi)核保持的state狀態(tài)可能會(huì)和natd中的狀態(tài)相沖突,因此對(duì)于有狀態(tài)的協(xié)議比如TCP,此方式工作的很好,對(duì)于UDP和ICMP會(huì)有不穩(wěn)定的問(wèn)題。
五.最后再來(lái)點(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ù)包無(wú)需經(jīng)過(guò)INPUT鏈,而ipfw則是全局的rule。ipfw和natd可以在任意位置相互插入,任意動(dòng)作包括divert natd都可以和state聯(lián)動(dòng),實(shí)現(xiàn)了動(dòng)作的stateful,也就是說(shuō),ipfw的機(jī)制可以記住一個(gè)流的頭包或者任意包的第一次匹配的動(dòng)作,而Netfilter的conntrack和rule則是分離的,conntrack僅僅追蹤了連接,filter動(dòng)作需要自己去匹配,沒(méi)有filter的動(dòng)態(tài)rule。最后,ipfw保存一份ruleset,在man ipfw所示的圖的一路最多4個(gè)HOOK點(diǎn)重復(fù)check。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
成都創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比駐馬店網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式駐馬店網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋駐馬店地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴(lài)。
當(dāng)前題目:初探BSD的ipfw防火墻-創(chuàng)新互聯(lián)
文章分享:
http://weahome.cn/article/picop.html