Linux防火牆資料包捕獲模組(轉)

amyz發表於2007-08-13
Linux防火牆資料包捕獲模組(轉)[@more@]

  一、防火牆概述

  網路防火牆技術是一種用來加強網路之間訪問控制,防止外部網路使用者以非法手段透過外部網路進入內部網路,訪問內部網路資源,保護內部網路操作環境的特殊網路互聯裝置。它對兩個或多個網路之間傳輸的資料包按照一定的安全策略來實施檢查,以決定網路之間的通訊是否被允許,並監視網路執行狀態。?

  根據防火牆所採用的技術不同,可以將它分為四種基本型別:包過濾型、網路地址轉換—NAT、代理型和監測型。包過濾型產品是防火牆的初級產品,其技術依據是網路中的分包傳輸技術。包過濾技術的優點是簡單實用,實現成本較低,在應用環境比較簡單的情況下,能夠以較小的代價在一定程度上保證系統的安全。網路地址轉換是一種用於把IP地址轉換成臨時的、外部的、註冊的IP地址標準。它允許具有私有IP地址的內部網路訪問因特網。

  代理型防火牆也可以被稱為代理伺服器,它的安全性要高於包過濾型產品,並已經開始嚮應用層發展。代理型防火牆的優點是安全性較高,可以針對應用層進行偵測和掃描,對付基於應用層的侵入和病毒都十分有效。其缺點是對系統的整體效能有較大的影響,而且代理伺服器必須針對客戶機可能產生的所有應用型別逐一進行設定,大大增加了系統管理的複雜性。

  監測型防火牆是新一代的產品,能夠對各層的資料進行主動的、實時的監測,在對這些資料加以分析的基礎上,監測型防火牆能夠有效地判斷出各層中的非法侵入。同時,這種檢測型防火牆產品一般還帶有分散式探測器,這些探測器安置在各種應用伺服器和其他網路的節點之中,不僅能夠檢測來自網路外部的攻擊,同時對來自內部的惡意破壞也有極強的防範作用。監測型防火牆在安全性上已超越了包過濾型和代理伺服器型防火牆,但其實現成本較高。基於對系統成本與安全技術成本的綜合考慮,使用者可以選擇性地使用某些監測型技術。

二、基於Linux個人防火牆總體設計

  本文研究的是防火牆系統的軟硬體環境以及該防火牆的開發步驟和所要實現的功能,最後重點對該防火牆系統所需要的硬體和軟體平臺原理進行說明。儘管所有Linux系統都自帶防火牆核心程式,但需要使用者進行配置才能起到保護網路安全的目的。

  1、防火牆系統總體設計

  Linux系統下實現軟體防火牆的設計與應用,實質上就是基於主機的網路安全解決方案。因此,我們完全可以選擇合適的軟硬體平臺和相應的防火牆設計原理,自己開發出一套能夠滿足要求的防火牆系統。

  歸納起來這裡要實現的防火牆需要滿足兩大要求:第一,必須能夠對主機提供安全保護,即對主機與區域網以外的主機進行資料傳輸時實施安全保護;第二,必須能夠提供良好的人機介面介面,具有容易操作、容易管理的優點。

  考慮到現有硬體裝置的限制,在保證滿足實驗要求的環境下儘可能地簡化了實驗環境。因為該防火牆系統是基於主機設計的,故只需要一個聯網的主機即可進行實驗。該系統是在Linux環境下用C語言實現包過濾型軟體防火牆的設計與應用,採用Kylix開發工具進行介面設計和資料庫連線。

  基於Linux的個人防火牆系統主要具有以下功能:

  (1)全程動態包過濾 本防火牆要在Linux下實現全程動態包過濾功能,透過分析資料包的地址、協議、埠對任何網路連線當前狀態進行訪問控制,從而提高系統的效能和安全性。

  (2)提供日誌審計 本防火牆配備了日誌記錄系統和查詢工具,用於記錄系統管理、系統訪問及針對安全策略的網路訪問情況。

  (3)防火牆資料庫的備份 本防火牆製作防火牆過濾資料庫,並且管理員可以能動地對該資料庫進行設定。

三、基於Linux的資料包捕獲模組結構與原理分析

  本節就監控層資料包捕獲模組的結構特性進行探討,並詳細論述其原理,且對實現資料包捕獲功能的程式的一些重要函式進行說明。

  1、資料包捕獲模組結構

  資料包捕獲模組用於監視和驗證網路流量情況,它可以擷取或者閱讀網路上OSI協議模型中各個協議層次上的資料包。

  本文所設計的資料包捕獲程式可以捕獲透過原始套介面(Socket)的原始資料包(Raw Packet),當一個資料包到達網路介面時,資料包捕獲程式就直接從快取區讀取捕獲的資料包,以供資料分析和處理時呼叫。資料捕獲模組的結構如圖1所示:

  TCP/IP網路

  ↓

  資料捕獲

  網路卡設定

  獲取資料包

  得到資料包頭資訊

  圖1 資料捕獲程式結構圖

  2、資料包捕獲模組原理分析

  (1)網路卡設定原理

  在一個實際的系統中,資料的收發是由網路卡來完成的,網路卡接收到傳輸來的資料,網路卡內的程式接收資料幀的目的MAC地址,根據計算機上的網路卡驅動程式設定的接收模式判斷該不該接收,認為不該接收就丟掉不管。而對於網路卡來說一般有四種接收模式:廣播模式組播模式、直接方式、混雜模式。資料包捕獲程式首先使網路介面(網路卡)處於混雜狀態,從而可截獲網路上的內容,並且透過相應的軟體處理,可以實時分析這些資料的內容,為資料包過濾作準備。

  (2)基本函式說明

  本文中在Linux主機上用C語言編寫資料包捕獲程式,所編寫的程式中用到很多Linux中的預定義函式,在此節將對這些基本函式的功能和使用特點進行說明。

  1)ioctl函式定義

  ioctl()函式非常龐雜,它可以控制各種檔案的屬性。它用於控制特殊檔案的底層裝置引數,這些特殊檔案通常是指終端、套接字和介面。ioctl函式原型為:

  int ioctl(int handle,int cmd[,int *argdx,int argcx]);

  2)socket函式定義

  常用的Socket型別有兩種:流式Socket(SOCK_STREAM)和資料包式Socket (SOCK_DGRAM)。流式是一種面向連線的Socket,針對面向連線的TCP服務應用;資料包式Socket是一種無連線的Socket,針對無連線的UDP服務應用。Socket函式原型為:

  int socket(int domain, int type,int protocol);

  3)recvfrom()函式定義

  用recvfrom()函式來實現接收資料包,recvfrom()是具備“阻塞式I/O”特性的函式,能夠在沒有資料包到達的情況下暫時掛起等待,直至接收到資料包後,再啟用轉入下一步處理。recvfrom()函式的原型為:

  int recvfrom(SOCKET s,char FAR *buf,int len,int flags,struct sockaddr FAR *from,int *fromlen);

  本函式從已連線套介面上接收資料,並捕獲資料傳送源的地址。對於SOCK_STREAM型別的套介面,最多可以接收緩衝區大小個資料。如果套介面被設定為線內接收帶外資料(選項為 SO_OOBINLINE),且有帶外資料未讀入,則返回帶外資料。應用程式可透過呼叫ioctlsocket()的SOCATMARK命令來確定是否有帶外資料待讀入。對於SOCK_STREAM型別套介面,忽略from和fromlen引數。

  4)一些“位元組順序”轉換函式

  因為網路和主機採用的儲存位元組時記憶體順序安排方式的差異,就存在“位元組順序”的問題。在網路環境下儲存時,高位位元組存放在記憶體的起始位置,而低位元組則存放在較高的位置。主機形式的存放順序恰好相反,低位位元組存放在記憶體的起始位置。這就需要以下相應的位元組順序轉換函式:

  inet_ntoa():將32位的網路二進位制數值轉換為可讀十進位制形式的帶點分割符的IP地址。

  inet_addr():將帶有分割符的IP地址轉換為32位的unsigned long的格式。

  ntohs():將網路位元組順序轉換為32位的主機位元組順序。

  ntohl():將網路位元組順序轉換成16位的主機位元組順序。

  htonl():將32位u_long的值由主機位元組順序轉換為網路位元組順序。

  htons():將16位u_long的值由主機位元組順序轉換為網路位元組順序。

  本文設計的資料捕獲程式需要使用SOCK_PACKET裝置,SOCK_PACKET只在基於Linux的作業系統中有效定義。為此,美國洛侖茲伯克利國家實驗室編寫了專用於資料包截獲的API函式庫“Libpcap”。該函式的設計目標是統一不同系統上所提供的用於資料包截獲的不同型別介面,並使得類似的高層應用程式的編寫和移植變得簡單有效,不再需要對每一個應用都使用不同的依賴於具體系統的資料包截獲模組。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-955525/,如需轉載,請註明出處,否則將追究法律責任。

相關文章