郭 偉
(湖北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院,湖北武漢430068)
網(wǎng)絡(luò)監(jiān)聽技術(shù)的應(yīng)用
郭 偉
(湖北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院,湖北武漢430068)
網(wǎng)絡(luò)監(jiān)聽系統(tǒng)是網(wǎng)絡(luò)安全維護(hù)的基礎(chǔ)技術(shù)和核心手段,是利用計(jì)算機(jī)技術(shù)捕獲網(wǎng)絡(luò)上的數(shù)據(jù)包,并對(duì)捕獲的數(shù)據(jù)包進(jìn)行分析。本文探析了網(wǎng)絡(luò)監(jiān)聽技術(shù)的基本原理。闡述了利用Libpcap技術(shù)在Linux下捕獲數(shù)據(jù)包的方法和應(yīng)用技術(shù)。
網(wǎng)絡(luò)數(shù)據(jù)包;捕獲;Linux;Libpcap
當(dāng)今計(jì)算機(jī)網(wǎng)絡(luò)及通訊技術(shù)的廣泛應(yīng)用,促使Internet迅速發(fā)展,給我們帶來了巨大的社會(huì)和經(jīng)濟(jì)效益。盡管開放的、自由的、國際化的Internet的發(fā)展給政府機(jī)構(gòu)、企事業(yè)單位帶來了革命性的改革和開放,使他們能夠利用Internet提高辦事效率和市場(chǎng)反應(yīng)能力,從而更具競(jìng)爭(zhēng)力,但同時(shí)網(wǎng)絡(luò)開放也帶來了數(shù)據(jù)安全的危險(xiǎn)和挑戰(zhàn)。因此,如何保護(hù)機(jī)密信息不受黑客和間諜的入侵,確保網(wǎng)絡(luò)系統(tǒng)的正常安全運(yùn)行,已成為政府機(jī)構(gòu)、企事業(yè)單位信息化健康發(fā)展所要考慮的重要因素之一[1]。
計(jì)算機(jī)網(wǎng)絡(luò)監(jiān)聽和檢測(cè)軟件就是在這種情況下而產(chǎn)生發(fā)展起來的。本文主要論述了如何在Linux環(huán)境中利用Libpcap開發(fā)包開發(fā)網(wǎng)絡(luò)實(shí)時(shí)監(jiān)聽程序,并給出了具體的設(shè)計(jì)與實(shí)現(xiàn)方法。
共享式以太網(wǎng)所采用的是廣播信道,也就是說每臺(tái)主機(jī)所發(fā)出的報(bào)文都會(huì)被整個(gè)網(wǎng)絡(luò)內(nèi)的所有主機(jī)接收到,而現(xiàn)在通常采用的交換式以太網(wǎng)則是基于數(shù)據(jù)鏈路層的Peer T o Peer信道,它檢測(cè)經(jīng)過以太網(wǎng)端口的數(shù)據(jù)包的源地址和目標(biāo)地址的介質(zhì)訪問層(MAC)地址,然后與系統(tǒng)內(nèi)部的動(dòng)態(tài)查找表進(jìn)行比較,若數(shù)據(jù)包的MAC地址不在查找表中,則將該地址加入查找表,并將數(shù)據(jù)包發(fā)送給相應(yīng)的目標(biāo)端口。因此,對(duì)于這種交換式以太網(wǎng)可以為交換機(jī)配置一個(gè)監(jiān)聽端口,交換機(jī)上所有被傳送的數(shù)據(jù)包都會(huì)拷貝一份傳輸至監(jiān)聽端口,在該端口上進(jìn)行監(jiān)聽則可以完全按照共享式以太網(wǎng)的工作方式來處理。
一般情況下,主機(jī)對(duì)接收到的數(shù)據(jù)幀的處理方式主要是根據(jù)網(wǎng)卡的工作模式來決定的。一般網(wǎng)卡具有四種工作模式:廣播模式、多播模式、直接模式和混雜模式。網(wǎng)卡缺省的工作模式包含廣播模式和直接模式,所謂直播模式即只能接收發(fā)送給自己和廣播的數(shù)據(jù)幀。正常情況下接收主機(jī)的網(wǎng)卡根據(jù)數(shù)據(jù)幀中所包含的目標(biāo)MAC地址進(jìn)行判斷,如果與自己的MAC地址相等,或者是廣播MAC地址,則提交給上層處理程序,否則將丟棄此數(shù)據(jù)幀。當(dāng)網(wǎng)卡處于混雜模式時(shí),網(wǎng)卡對(duì)接收到的任何數(shù)據(jù)幀都不作任何判斷,直接把接收到的所有數(shù)據(jù)幀交給上層處理程序。網(wǎng)絡(luò)監(jiān)聽技術(shù)就是基于這個(gè)原理來捕獲網(wǎng)絡(luò)中所有的數(shù)據(jù)包,實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)實(shí)時(shí)監(jiān)測(cè)和實(shí)時(shí)流量分析的。
在通常情況下,網(wǎng)絡(luò)通信的Socket程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)幀或者以廣播形式發(fā)出的數(shù)據(jù)幀,對(duì)于其他形式的數(shù)據(jù)幀,比如已到達(dá)網(wǎng)卡接口但目標(biāo)地址卻不是發(fā)往此處的數(shù)據(jù)幀,網(wǎng)絡(luò)接口在檢查目標(biāo)地址不等于自身地址之后將不做任何處理,也就是說應(yīng)用程序無法接收與自己無關(guān)的數(shù)據(jù)包。
假如我們要想實(shí)現(xiàn)捕獲流經(jīng)網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就必須轉(zhuǎn)換網(wǎng)卡工作模式:將網(wǎng)卡設(shè)置為混雜模式。這樣的話該主機(jī)的網(wǎng)卡就可以捕獲到所有流經(jīng)其網(wǎng)卡的數(shù)據(jù)包和數(shù)據(jù)幀。但是要注意的是,這種捕獲只是針對(duì)數(shù)據(jù)包的簡(jiǎn)單復(fù)制,而不能對(duì)其進(jìn)行截?cái)唷?/p>
Libpcap主要結(jié)構(gòu)由兩部分組成:網(wǎng)絡(luò)分流器和數(shù)據(jù)過濾裝置。網(wǎng)絡(luò)分流器從網(wǎng)絡(luò)網(wǎng)卡處理的數(shù)據(jù)中收集數(shù)據(jù)拷貝,過濾裝置決定是否接收該數(shù)據(jù)包。Libpcap利用BPF算法對(duì)網(wǎng)卡接收到的數(shù)據(jù)鏈路層數(shù)據(jù)包進(jìn)行過濾操作。BPF算法的基本思想是在包含BPF監(jiān)聽環(huán)境的計(jì)算機(jī)網(wǎng)絡(luò)中,網(wǎng)卡驅(qū)動(dòng)將接收到的數(shù)據(jù)包拷貝一份副本傳遞給BPF過濾裝置,過濾裝置根據(jù)使用者定義的規(guī)則決定是否接收此數(shù)據(jù)包的過濾,以及需要拷貝該數(shù)據(jù)包的哪些內(nèi)容。然后將過濾后的數(shù)據(jù)傳遞到與過濾裝置相對(duì)應(yīng)的上層應(yīng)用程序。
Libpcap的數(shù)據(jù)包捕獲機(jī)制是在數(shù)據(jù)鏈路層的基礎(chǔ)上增加一個(gè)處理環(huán)節(jié)。當(dāng)一個(gè)數(shù)據(jù)包到達(dá)網(wǎng)絡(luò)接口時(shí),Libpcap首先利用已經(jīng)創(chuàng)建好的Socket會(huì)話從數(shù)據(jù)鏈路層驅(qū)動(dòng)程序中獲得該數(shù)據(jù)包的拷貝,再通過分流函數(shù)將數(shù)據(jù)包傳遞給BPF過濾裝置。BPF過濾裝置根據(jù)使用者定義好的過濾規(guī)則對(duì)數(shù)據(jù)包進(jìn)行一對(duì)一的匹配操作,匹配成功則放入內(nèi)核緩沖區(qū),并傳遞給用戶緩沖區(qū),匹配失敗則予以丟棄。還有一種情況,假若沒有設(shè)置過濾規(guī)則,所有數(shù)據(jù)包將會(huì)放入內(nèi)核緩沖區(qū),并傳遞給用戶層緩沖區(qū)[2]。
Libpcap-mmap是Libpcap的一個(gè)增強(qiáng)版,它們捕獲數(shù)據(jù)包的結(jié)構(gòu)大致相同。不同的地方主要有以下兩部分:Libpcap采用額定大小的存儲(chǔ)緩沖器和保持緩沖器來實(shí)現(xiàn)數(shù)據(jù)包從內(nèi)核到用戶層的傳遞工作,而Libpcap-mmap設(shè)計(jì)了一個(gè)空間大小可以調(diào)整的循環(huán)緩沖器,允許用戶程序和內(nèi)核程序同時(shí)對(duì)該循環(huán)緩沖器的不同存儲(chǔ)區(qū)域進(jìn)行直接的讀取。
在采用Libpcap進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包捕獲的過程中,網(wǎng)卡一旦接收到有效的數(shù)據(jù)包,網(wǎng)卡驅(qū)動(dòng)程序便會(huì)通過直接內(nèi)存訪問方式調(diào)用系統(tǒng)函數(shù)Netif_rx ()。將數(shù)據(jù)包從網(wǎng)卡拷貝到核心態(tài)內(nèi)存緩沖區(qū)中,應(yīng)用程序假如想訪問位于核心態(tài)內(nèi)存緩沖區(qū)的數(shù)據(jù),必須將數(shù)據(jù)包從核心態(tài)內(nèi)存緩沖區(qū)中拷貝到用戶態(tài)內(nèi)存緩沖區(qū)中,這樣便會(huì)導(dǎo)致占用更多的內(nèi)存以及CPU時(shí)間等系統(tǒng)資源,并且會(huì)造成一定的處理延遲,這樣也會(huì)降低數(shù)據(jù)包的捕獲性能以及對(duì)數(shù)據(jù)包的處理性能。
而Libpcap-mmap采用內(nèi)存映射技術(shù),建立核心態(tài)內(nèi)存和用戶態(tài)內(nèi)存的映射,將系統(tǒng)分配給網(wǎng)卡設(shè)備文件的核心態(tài)內(nèi)存映射到一塊用戶態(tài)內(nèi)存中,這樣一來應(yīng)用程序可以通過調(diào)用Recv_From()函數(shù)把數(shù)據(jù)包從網(wǎng)卡上直接傳送到用戶態(tài)內(nèi)存中,減少了一次數(shù)據(jù)拷貝操作過程,減少了系統(tǒng)資源的消耗,相應(yīng)地?cái)?shù)據(jù)包捕獲效率提高了。
以下是捕獲網(wǎng)絡(luò)數(shù)據(jù)包的實(shí)例代碼:
這個(gè)程序監(jiān)聽由pcap_Lookupdevice()函數(shù)返回的設(shè)備,并將它置為工作在混雜模式下。程序監(jiān)聽每一個(gè)經(jīng)過端口25(SMTP簡(jiǎn)單郵件傳輸系統(tǒng)的工作端口)的數(shù)據(jù)包。并且告訴用戶此數(shù)據(jù)包的大小,以字節(jié)為單位。這個(gè)程序最后包含了一個(gè)新的函數(shù)調(diào)用pcap_close(),用來終止當(dāng)前會(huì)話。
我們可以使用的另一種手段,但是要復(fù)雜的多,并且可能也更為有用。一般情況下,編程人員使用pcap_loop()或pcap_dispatch()。實(shí)際上pcap_dispatch()是具有pcap_loop()的某些相似功能。為了了解這兩個(gè)函數(shù)的用法,你必須了解回調(diào)函數(shù)的思想?;卣{(diào)函數(shù)在很多的程序API中是非常常見的。它的概念是比較簡(jiǎn)單的。假設(shè)我有一段程序,正在等候某一個(gè)事件的結(jié)果。為了達(dá)到這個(gè)例子的目的,讓我們假設(shè)我希望用戶通過在鍵盤上按一個(gè)按鍵,只要用戶按下一個(gè)按鍵,程序便呼叫具有相應(yīng)處理功能的函數(shù)。這個(gè)具有處理用戶行為消息的函數(shù)便是一個(gè)回調(diào)函數(shù)。用戶每次按下一個(gè)按鍵,程序便會(huì)調(diào)用回調(diào)函數(shù)一次。結(jié)合在pcap函數(shù)的回調(diào)函數(shù)中,當(dāng)用戶按下一個(gè)功能按鍵,并且這個(gè)按鍵具有網(wǎng)絡(luò)數(shù)據(jù)包捕獲功能的時(shí)候,pcap函數(shù)便會(huì)立即調(diào)用回調(diào)函數(shù)。執(zhí)行消息的傳遞和處理。它們可以被定義在以下兩個(gè)函數(shù)中pcap_loop()和pcap_dispatch()。這兩個(gè)函數(shù)在回調(diào)函數(shù)中的使用方法非常類似。它們都是當(dāng)捕獲到一個(gè)符合網(wǎng)絡(luò)數(shù)據(jù)包過濾裝置所要求的規(guī)則和數(shù)據(jù)包時(shí),隨即調(diào)用回調(diào)函數(shù),前提是必須要有一個(gè)數(shù)據(jù)包過濾裝置,否則所有被捕獲到的數(shù)據(jù)包都會(huì)被回調(diào)函數(shù)處理。
Pcap_Loop()的原型函數(shù)如下:Int Pcap_Loop (Pcap_T*pcap,Int Count,Pcap_handle Callback, u_char*The_User)。其中*pcap是會(huì)話句柄,其次是一個(gè)整型變量,它表示pcap_loop()返回前必須捕獲數(shù)據(jù)包的數(shù)目。如果是負(fù)數(shù),則表示是這項(xiàng)工作直到發(fā)生了錯(cuò)誤才會(huì)停止。第三個(gè)參數(shù)是回調(diào)函數(shù)的系統(tǒng)保留字,系統(tǒng)檢測(cè)到該保留字將會(huì)自動(dòng)調(diào)用回調(diào)函數(shù)。最后一個(gè)參數(shù)在某些應(yīng)用場(chǎng)合可能會(huì)用到,作為保留使用。但更多時(shí)候則置為NULL。假設(shè)我們有我們自己的想送往回調(diào)函數(shù)的參數(shù),另外還有pcap_loop()發(fā)送的參數(shù),這就需要用到它。很明顯,必須是一個(gè)u_char類型的指針以確保結(jié)果正確;正像我們稍后見到的,pcap使用了很有意思的方法以u(píng)_char指針的形式傳遞數(shù)據(jù)。Pcap_dispatch()的用法幾乎是一樣的。唯一不同的是它們?nèi)绾翁幚沓瑫r(shí)。還記得在調(diào)用pcap_open_live()時(shí)怎樣設(shè)置超時(shí)嗎?這就是它起作用的地方。Pcap_ loop()忽略超時(shí),而pcap_dispatch()則不。在使用pcap_loop()之前,我們必須檢查我們的回調(diào)函數(shù)的格式。我們不能武斷地定義回調(diào)函數(shù)的原型,否則pcap_loop()將會(huì)不知道如何去使用它。
因此,使用下述格式作為回調(diào)函數(shù)的原型:
首先,你會(huì)注意到該函數(shù)返回void類型,這是符合邏輯的,因?yàn)閜cap_loop()不知道如何去處理一個(gè)回調(diào)返回值。*args對(duì)應(yīng)于 pcap_loop()的*The_User參數(shù)。回調(diào)函數(shù)一旦被調(diào)用的時(shí)候,不管*The_User傳給pcap_loop()的是什么值,都會(huì)傳遞到我自己的回調(diào)函數(shù)的*args參數(shù)中。Pcap_ pkhdr是在pcap頭文件中定義的,包括數(shù)據(jù)包被捕獲的時(shí)間、大小和長(zhǎng)度等信息。
這些變量的作用注釋中已經(jīng)描述得非常清楚。*pakt在函數(shù)中是一個(gè) u_char指針,它包括由Pcap_Loop()所捕獲到的所有的數(shù)據(jù)包。至此,我們實(shí)現(xiàn)了數(shù)據(jù)包捕獲的基本框架:打開一個(gè)pcap會(huì)話,有關(guān)它的全體屬性,嗅探數(shù)據(jù)包,使用過濾裝置,使用回調(diào)函數(shù),等等。如果有網(wǎng)絡(luò)數(shù)據(jù)包捕獲方面的應(yīng)用,可以在此基礎(chǔ)上再做修改和完善。
本文對(duì)網(wǎng)絡(luò)監(jiān)聽系統(tǒng)的概念、原理進(jìn)行了簡(jiǎn)單的討論。通過具體代碼實(shí)例演示了如何實(shí)現(xiàn)網(wǎng)絡(luò)上數(shù)據(jù)包的實(shí)時(shí)捕獲。對(duì)于網(wǎng)絡(luò)安全系統(tǒng)設(shè)計(jì)人員來說是非常重要的,它使得網(wǎng)絡(luò)安全工程師能夠通過數(shù)據(jù)包捕獲,動(dòng)態(tài)了解當(dāng)前網(wǎng)絡(luò)安全狀態(tài)以及迅速發(fā)現(xiàn)網(wǎng)絡(luò)可能遭受的風(fēng)險(xiǎn)。很大程度上提高了網(wǎng)絡(luò)的安全性和可靠性。
[1]徐其興.計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)及應(yīng)用[M].北京:高等教育出版社,2008:277.
[2]閆麗麗,涂天祿,周興濤.Libpcap數(shù)據(jù)包捕獲機(jī)制剖析與研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2006(4):38-40.
Application of Network Monitoring Technology
GUO Wei
(School of Computer Science,Hubei University of Technology,Wuhan 430068,China)
Network monitoring system is the basic technology and core means of network security maintenance.It is the use of computer technology to capture and analyze packets on the network.This article explores the basic principles of network monitoring technology,describes the methods and application technology using Libpcap technology to capture packets under Linux.
network packet;capture;Linux;Libpcap
book=91,ebook=135
TP393.08
A
1008-4738(2010)04-0091-03
2010-06-20
郭 偉(1981-),男,湖北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院在讀碩士,十堰職業(yè)技術(shù)學(xué)院信息與智能工程系講師,研究方向:計(jì)算機(jī)應(yīng)用技術(shù)。