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