初探BSD的ipfw防火墻-創(chuàng)新互聯(lián)

使用Mac OS X已經(jīng)半年多了,很炫是真的,很懸也不假!Mac有太多太多的特性值得讓你花大量的時間仔細(xì)琢磨,用起來讓你自豪的找不著北,最終你會深信自己是一個很時尚的人...我承認(rèn)自己很土,也不是什么果粉,更不是什么達(dá)人,因此我除了使用Mac最基本的功能外,幾乎沒有去深究其它。突然間,我發(fā)現(xiàn)Mac居然是一個BSD,雖然這個事實我早就知道,但是也只有在我在命令行敲入man ipfw的時候,我才真的想深究一下這個手邊的Unix,于是乎,不再覺得Unix很遙遠(yuǎn),它居然就在手邊,于是乎,我的MacBook也就成了我的Unix試驗機(jī)了。
       偉大的Unix初看很龐大,然而用起來還真的比Linux簡單,Cisco IOS這樣的網(wǎng)絡(luò)操作系統(tǒng)內(nèi)核也是基于BSD的,在BSD之上出現(xiàn)了兩個ios,一個是Cisco的IOS,一個是Apple的iOS,足見其偉大!

一.防火墻軟件學(xué)習(xí)歷程

關(guān)于防火墻,最開始學(xué)習(xí)的是華為VRP系統(tǒng)的命令,那是2004年,聽講師說和Cisco命令差不多,當(dāng)時我們都一準(zhǔn)認(rèn)為有抄襲的內(nèi)幕,于是自學(xué)了Cisco,發(fā)現(xiàn)還真的很像,幾乎是一模一樣...2006年參加工作第一次看到有人在Linux終端前敲命令,我開口就給同事說,我們配路由器配防火墻就是那樣的...太丟人了,其實那是Linux而已,于是就自學(xué)了Linux,學(xué)習(xí)iptables是08年的事了。
       現(xiàn)在想想,但凡命令行,差別都不大,如果你在windows命令行輸入netsh,結(jié)果也差不多。因此我不認(rèn)為那是抄襲了,充其量是拿來主義,共同點(diǎn)的底層一定是相同的組件,這種組件其實就是BSD內(nèi)核。最終如果你比較一下各種包過濾機(jī)制,就會發(fā)現(xiàn),Cisco,H3C,Windows的都差不多,只有Linux的Netfilter是個例外。Mac OS基于BSD,因此只要懂得Cisco,Mac OS上的命令行防火墻命令也就很容易駕馭了。

二.ipfw簡介以及與Netfilter的異同

想要簡介,最好就是man一下ipfw,這里就不列舉了。最關(guān)鍵的是一個章節(jié),那就是“PACKET FLOW”這一章節(jié)。只有你知道數(shù)據(jù)包在協(xié)議棧的哪些地方被過濾,你才能設(shè)計好良好的規(guī)則集。過濾點(diǎn)如下圖所示:
初探BSD的ipfw防火墻
相比于Netfilter的5個HOOK點(diǎn),這幅圖看起來清爽多了,一個包最多經(jīng)過4個HOOK點(diǎn),而Netfilter則復(fù)雜的多,按照路由前,路由后以及路由結(jié)果三個要素將HOOK點(diǎn)劃分為5個,任何點(diǎn)的規(guī)則都需要你仔細(xì)考慮路由的結(jié)果以及是否可以過濾,ip_conntrack機(jī)制以及由于conntrack機(jī)制內(nèi)置的動態(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.
這段話說了兩個意思,第一個意思就是ruleset是全局的,不區(qū)分HOOK點(diǎn)的,每一個HOOK點(diǎn)都要遍歷所有的ruleset中的rule;另一個意思是說需要配置者來完成一切。我們看一個簡單的規(guī)則,禁掉icmp:
ipfw add deny icmp from any to any
是不是和Cisco的很像,然而卻和iptables的一點(diǎn)都不像。

三.ipfw的動態(tài)規(guī)則

Netfilter有ip_conntrack機(jī)制可以追蹤每一個流。這個ip_conntrack機(jī)制讓人歡喜讓人愁,于是可以在PREROUTING的raw表上配置notrack。ipfw就不一樣了,它可以在任意地方針對任意流進(jìn)行track,這就是其state機(jī)制,ipfw通過keep-state來追蹤一個流,并且建立針對該包反向包的動態(tài)規(guī)則,通過check-state來匹配keep-state建立的動態(tài)規(guī)則,ipfw的state可以在任意匹配的地方被keep,所謂的keep就是建立一條動態(tài)規(guī)則,其動作就是keep-state的動作,這個比較類似Netfilter的ip_conntrack和state match的聯(lián)動機(jī)制。以下是一個man手冊中的實例,我在前面加上了注釋:
對每一個包c(diǎn)heck所有的動態(tài)創(chuàng)建的rule:
ipfw add check-state
對本地子網(wǎng)始發(fā)的TCP流量放行且保持連接,創(chuà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
上述實例的分析:
內(nèi)網(wǎng)始發(fā)一個TCP,由于沒有任何動態(tài)rule,因此直接匹配到第二個rule并且保持了這個conntrack創(chuàng)建了反向動態(tài)rule,該連接的返回包到達(dá)這個Box時,由于匹配到了動態(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了,它可以隨時進(jìn)行track,隨時進(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只是一個target,存在用戶態(tài)的natd進(jìn)程來進(jìn)行nat,也可以使用ipnat來完成,不管哪種方式,都使用了divert這個動作,所謂divert,其實就是其字面含義,將控制轉(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,然而如果你想小實驗一把keep-state和check-state,那么你可能會注意到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時已經(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)可能會和natd中的狀態(tài)相沖突,因此對于有狀態(tài)的協(xié)議比如TCP,此方式工作的很好,對于UDP和ICMP會有不穩(wěn)定的問題。

五.最后再來點(diǎn)比較

ipfw和Cisco一樣,畢竟都是BSD的緣故,都是將數(shù)據(jù)包分為了in和out兩個方向,并且都可以認(rèn)為應(yīng)用于接口,雖然ipfw在內(nèi)核中保存了一份全局的ruleset。不管怎樣,Netfilter絕不是這樣,另外,Netfilter的iptables區(qū)分了INPUT和FORWARD,所以FORWARD的數(shù)據(jù)包無需經(jīng)過INPUT鏈,而ipfw則是全局的rule。ipfw和natd可以在任意位置相互插入,任意動作包括divert natd都可以和state聯(lián)動,實現(xiàn)了動作的stateful,也就是說,ipfw的機(jī)制可以記住一個流的頭包或者任意包的第一次匹配的動作,而Netfilter的conntrack和rule則是分離的,conntrack僅僅追蹤了連接,filter動作需要自己去匹配,沒有filter的動態(tài)rule。最后,ipfw保存一份ruleset,在man ipfw所示的圖的一路最多4個HOOK點(diǎn)重復(fù)check。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比駐馬店網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式駐馬店網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋駐馬店地區(qū)。費(fèi)用合理售后完善,十載實體公司更值得信賴。

網(wǎng)頁標(biāo)題:初探BSD的ipfw防火墻-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://www.muchs.cn/article8/picop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化網(wǎng)站設(shè)計公司、微信公眾號企業(yè)建站、品牌網(wǎng)站制作、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)