劉 琦(江西科技師范大學(xué)理工學(xué)院,南昌 330013)
Libpcap的BPF過(guò)濾器的分析
劉琦
(江西科技師范大學(xué)理工學(xué)院,南昌330013)
摘要:本文分析與研究了Libpcap的BPF過(guò)濾器的過(guò)濾本質(zhì),首先,分析了BPF過(guò)濾器在Linux內(nèi)核中的位置和結(jié)構(gòu);其次,詳細(xì)分析了BPF過(guò)濾器怎樣處理高層語(yǔ)言表示的過(guò)濾器;最后,設(shè)置一個(gè)高層語(yǔ)言表示的過(guò)濾器,利用BPF過(guò)濾器捕獲滿足要求的網(wǎng)絡(luò)數(shù)據(jù)包。
關(guān)鍵詞:BPF;Libpcap;過(guò)濾器;網(wǎng)絡(luò)數(shù)據(jù)包
現(xiàn)代網(wǎng)絡(luò)時(shí)代中進(jìn)行大數(shù)據(jù)網(wǎng)絡(luò)監(jiān)控程序是具有其各自目的前提,我們所期望網(wǎng)絡(luò)的數(shù)據(jù)中包類型都是不盡相同的。應(yīng)該在絕大多數(shù)的情況之下都需要不一樣網(wǎng)絡(luò)數(shù)據(jù)包中的一部分甚至一大部分。
我們說(shuō)的BPF一般意義上由兩大部分組成的:網(wǎng)絡(luò)分接頭、數(shù)據(jù)包形成口和過(guò)濾器暫借口幾個(gè)部分。趨于網(wǎng)絡(luò)鐘的分接頭最主要是從網(wǎng)絡(luò)新型設(shè)備部分和驅(qū)動(dòng)應(yīng)用驅(qū)動(dòng)程序處的疏密收集數(shù)據(jù)包中拷貝開(kāi)始實(shí)現(xiàn)的,并不斷地先后傳遞給其中在監(jiān)聽(tīng)中運(yùn)行的各種各樣的有機(jī)應(yīng)用程序。狹義上的過(guò)濾器的決定數(shù)目的數(shù)據(jù)包不僅僅是被接受也可能是直接拒絕的,而且又是根據(jù)本身所發(fā)生的不斷變化和形象的轉(zhuǎn)運(yùn)體而實(shí)現(xiàn)出來(lái)的一種傳遞信息的符號(hào)。
當(dāng)其中的不斷產(chǎn)生的大數(shù)據(jù)包接近或者已經(jīng)到達(dá)網(wǎng)絡(luò)各個(gè)設(shè)備需要的復(fù)雜接口設(shè)備時(shí),這期間所發(fā)生的簡(jiǎn)介的鏈路層和設(shè)計(jì)設(shè)備驅(qū)動(dòng)器就通常就把它傳遞給我們所需系統(tǒng)協(xié)議棧進(jìn)行有效實(shí)質(zhì)性預(yù)處理模式。但是BPF又會(huì)在該網(wǎng)絡(luò)接口上監(jiān)上聽(tīng)取時(shí),這樣有效的實(shí)施驅(qū)動(dòng)器將會(huì)能夠先調(diào)用到BPF中間進(jìn)行有效處理,有了BPF就會(huì)將數(shù)據(jù)包傳遞不段的傳遞給其中每個(gè)監(jiān)控進(jìn)程運(yùn)行中的過(guò)濾器。使得這些用戶得到自定義過(guò)濾器后就一定會(huì)發(fā)生變化,然后自覺(jué)將決定數(shù)據(jù)包是否被接受,以及到達(dá)的各種數(shù)據(jù)包中哪些內(nèi)容是否應(yīng)該被保存下來(lái)處理。對(duì)于其中的每一個(gè)決定是否接受數(shù)據(jù)包的各種過(guò)濾器系統(tǒng),BPF還會(huì)將需求的數(shù)據(jù)包不斷的輸入拷貝到他們與之相連的形勢(shì)短針軌道緩存之中去。
一個(gè)用高層語(yǔ)言(例如:C語(yǔ)言學(xué)習(xí)和C++語(yǔ)言學(xué)習(xí)運(yùn)用中)表示使用新型的過(guò)濾器的結(jié)構(gòu)組成差別部分,有效的實(shí)行被編譯和優(yōu)化成BPF各種虛擬機(jī)運(yùn)行中的字節(jié)碼虛擬運(yùn)行部分。這種有效的字節(jié)碼會(huì)不斷的跟隨和接著經(jīng)過(guò)保護(hù)邊界的地方,現(xiàn)在有效的檢查代碼和有效的合法性生產(chǎn)部門(mén),后面的接著會(huì)在線解釋并發(fā)出指令去執(zhí)行。BPF系統(tǒng)發(fā)生后會(huì)根據(jù)處理器的形成購(gòu)置也就是包括一系列有效組件規(guī)律性質(zhì)把用過(guò)高層語(yǔ)言表示的過(guò)濾器不斷逐步的轉(zhuǎn)換為可視的底層可執(zhí)行的輸入設(shè)備管理器來(lái)使用。
那么我們形成最有效的無(wú)虛擬性前段前端輸入是一個(gè)中低層語(yǔ)言表示形成軌跡過(guò)濾器,它是被最初Libpcap使用的機(jī)器語(yǔ)言中公開(kāi)的謂詞語(yǔ)法等。
BPF編譯器把該過(guò)濾器轉(zhuǎn)換為一些命令,用一個(gè)SSA中間形式的控制流程圖表示。
SSA中間形式的控制流程圖通過(guò)代碼優(yōu)化器執(zhí)行全局的與局部的數(shù)據(jù)優(yōu)化器,優(yōu)化器的輸出為一個(gè)與BPF虛擬機(jī)一致的字節(jié)碼。
BPF字節(jié)碼接著被傳遞到一個(gè)可執(zhí)行的環(huán)境中,比如穿過(guò)用戶層-內(nèi)核層的保護(hù)邊界去執(zhí)行用戶定義的協(xié)議分析。
當(dāng)進(jìn)入目標(biāo)保護(hù)區(qū)域,安全確認(rèn)機(jī)制就認(rèn)為該字節(jié)碼是可信的。
接著在BPF內(nèi)核解釋執(zhí)行過(guò)濾器的字節(jié)碼。
現(xiàn)代化生產(chǎn)環(huán)境下的BPF中虛擬機(jī)指令生成的有效結(jié)構(gòu)被分成編譯器、優(yōu)行器兩個(gè)并列產(chǎn)生獨(dú)立的適用性組成部分。最先是編譯器譯碼器會(huì)將高層語(yǔ)言表示的過(guò)濾器不斷的轉(zhuǎn)化為無(wú)環(huán)控制系統(tǒng)流圖的CFG有效部分,然后其再將此控制流圖有效的圖形不斷的轉(zhuǎn)化為符合運(yùn)行適應(yīng)的SSA中間處理器表示形式控制流圖指令接受的一種完整的過(guò)濾形勢(shì),最后會(huì)發(fā)生優(yōu)化器會(huì)總的負(fù)責(zé)對(duì)SSA形式控制流圖不斷的進(jìn)行優(yōu)化使用部分,并生成最終虛擬機(jī)指令流派系列過(guò)度性語(yǔ)言,這也是虛擬機(jī)和指令語(yǔ)言中間的生產(chǎn)字節(jié)碼語(yǔ)言所在。
BPF(BerkeleyPacketFilter-BPF)是McCanne和VanJacobson在1993公布的Berkeley網(wǎng)絡(luò)數(shù)據(jù)包過(guò)濾器。BPF是對(duì)CSPF的改進(jìn)過(guò)濾過(guò)程是從一個(gè)用戶所定義的過(guò)濾器(比如:捕獲起所有的TCP數(shù)據(jù)包)開(kāi)始,首先應(yīng)用程序調(diào)用Libpcap源碼中的gencode.c文件中的pcap_compile()函數(shù)來(lái)編譯過(guò)濾器,通過(guò)該函數(shù)生成所需的虛擬機(jī)中間字節(jié)碼。然后應(yīng)用程序調(diào)用Libpcap源碼中的pcap.c文件中的pcap_setfilter()函數(shù)將一個(gè)過(guò)濾器與一個(gè)捕獲實(shí)例相關(guān)聯(lián),把過(guò)濾器的字節(jié)碼傳遞給內(nèi)核的BPF驅(qū)動(dòng)程序中,當(dāng)進(jìn)行數(shù)據(jù)捕獲時(shí),驅(qū)動(dòng)程序執(zhí)行該過(guò)濾器對(duì)來(lái)自網(wǎng)絡(luò)的所有數(shù)據(jù)包進(jìn)行過(guò)濾,所有符合要求的數(shù)據(jù)包將會(huì)復(fù)制給應(yīng)用程序,否則丟棄該數(shù)據(jù)包。
BPF的設(shè)計(jì)思想和當(dāng)時(shí)的計(jì)算機(jī)硬件的發(fā)展有很大的聯(lián)系,在過(guò)濾算法上,CSPF使用的是老式的布爾表達(dá)式樹(shù)(Booleanexpression tree),BPF使用的是無(wú)環(huán)控制流圖(controlflowgraph,CFG),這樣大大提高了過(guò)濾網(wǎng)絡(luò)數(shù)據(jù)包的效率。
假設(shè)我們的過(guò)濾器是ip or arp,CSPF和BPF的過(guò)濾算法如圖1和圖2。
圖1
圖2
從我們的上圖就可以得出結(jié)論:利用設(shè)置了過(guò)濾器的BPF過(guò)濾器在Linux系統(tǒng)網(wǎng)絡(luò)應(yīng)用程序進(jìn)行數(shù)據(jù)鏈路層MAC幀的捕獲,捕獲到了滿足要求的SourceIPAddress是192.168.1.6的網(wǎng)絡(luò)數(shù)據(jù)包。進(jìn)一步證明了分析和研究BPF過(guò)濾器的重要性和必要性。從而可以大大提高我們捕獲網(wǎng)絡(luò)數(shù)據(jù)包的效率。
參考文獻(xiàn):
[1]劉文濤.網(wǎng)絡(luò)安全開(kāi)發(fā)包詳解[M].北京:電子工業(yè)出版社,2005.
[2]唐正軍.黑客入侵防護(hù)系統(tǒng)源代碼分析[M].北京:機(jī)械工業(yè)出版社,2002.