Linux個人防火牆的設計與實現(轉)

BSDLite發表於2007-08-11
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”。該函式的設計目標是統一不同系統上所提供的用於資料包截獲的不同型別介面,並使得類似的高層應用程式的編寫和移植變得簡單有效,不再需要對每一個應用都使用不同的依賴於具體系統的資料包截獲模組。

四、基於Linux的資料包捕獲模組設計實現
1、 資料包捕獲模組設計流程圖
在資料包捕獲程式中,透過設定網路卡工作於混雜狀態,對網路鏈路進行監聽並收集資料包,從而獲得資料包頭資訊。其流程圖如圖2所示:
啟動SOCKET函式

設定網路卡為混雜模式

從緩衝區接收資料

資料包格式檢查並顯示

資料處理模組

圖2 資料包捕獲模組流程圖

2、資料包捕獲模組實現
該資料包捕獲程式用C語言來編寫,程式中用到很多Linux網路程式設計中的函式。
(1)設定網路介面為混雜模式
網路介面的混雜模式使得一個網路介面裝置從只能讀取目標地址為6位元組MAC地址的資料包,變為可讀取網路廣播媒體中的所有資料包。該部分透過兩次ioctl函式呼叫實現:
ioctl(sock, SIOCGIFFLAGS, &ifr)
ifr.ifr_flags |= IFF_PROMISC
ioctl(sock, SIOCGIFFLAGS, &ifr)
第一次的ioctl函式呼叫,用來截獲ifr(struct ifreq)結構中所含介面名稱所指介面的標記。第一個引數是開啟的原始套接字描述符“sock”,第二個引數是所要執行的請求操作。第三個引數是介面請求資料結構的地址指標,該結構中包含了所以進行請求操作的介面名稱值。
我們透過將混合標記(IFF_PROMISC)應用到介面請求結構的標記位變數中來改變介面標記位。運算子“|=”將混合標記符與原有的介面標記進行“或”操作來設定新的介面標記。獲得新的介面標記後,將其設定到實際介面中。第二次的ioctl呼叫,將介面裝置設定為混合模式。正如第一個ioctl呼叫是獲得網路介面的標記,這次呼叫是設定ifr結構中修改過的新標記寫到物理介面上。
(2)開啟Socket裝置
用socket函式來開啟Socket裝置。
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
domain域使用AF_PACKET,能夠既接收鏈路層也接收網路層的資料包。
(3)接收資料
使用recvfrom()函式來實現接收資料包:
recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len)
這是從開啟的網路插座Socket讀取資料包的地方,但要注意,addr結構有一個強制型別轉換,以適應recvfrom()函式的語法要求,recvfrom()函式在成功讀取的情況下返回讀取的位元組數,否則返回-1。
(4)判斷包頭指標
該資料包捕獲模組可以接收到的資料包都是原始資料包,它們的格式一般先是乙太網資料幀的頭部,接著是ARP或者IP資料包的頭部。IP資料包後緊跟著TCP或UDP、ICMP的頭部,最後才是真正要傳輸的資料。於是,在拆分IP資料包時,先提取乙太網資料幀的頭部,再提取IP資料包的頭部,然後分析TCP或UDP、ICMP資料包的頭部。最後,從資料包提取出需要的資料。

3、程式中用到的一些結構體解析
(1)sockadd_in結構體
在網路中第一個被創造的結構型別是sockaddr。這個資料結構是為許多型別的套介面儲存地址資訊。它的定義如下:
struct sockaddr{
unsigned shortsa_family; /*這個是地址族,通常是AF-xxxx的形式*/
charsa_data[14]; /*14位元組的地址資訊*/
};
(2)ethhdr結構體
以下是相應資料結構:
struct ethhdr
{
unsigned char h_dest[ETH_ALEN];/*48位的目標地址的網路卡實體地址*/
unsigned char h_source[ETH_ALEN];/*48位的源地址的物理網路卡地址*/
unsigned short h_proto;/*16位的乙太網協議*/
}
(3)iphdr結構體
這是Linux 的ip協議報頭,針對版本的不同它可以有不同的定義,我們國內一般用BIG的定義,其中version 是ip的版本,protocol是ip的協議分類,saddr是32位的源ip地址,daddr是32位的目標ip地址。
(4)tcphdr結構體
這是Linux 下tcp協議的一部分,與ip協議相同取BIG,其中source是源埠,dest 是目的埠,seq是s序,ack_seq是a序號,其餘的是tcp的連線標誌其中包括6個標誌:syn表示連線請求,urg 表示緊急資訊,fin表示連線結束,ack表示連線應答,psh表示推棧標誌,rst表示中斷連線。window是表示接受資料視窗大小,check是校驗碼,urg ptr是緊急指標。
(5)udphdr結構體
這是Linux下ip協議中udp協議的一部分,以下是相應資料結構:
struct udphdr
{
u_int16_t source;/* 源埠*/
u_int16_t dest;/* 目的埠*/
u_int16_t len;/* udp 長度*/
u_int16_t check;/*校驗碼*/
}
本文設計的是一個基於Linux主機的包過濾型個人防火牆,它實現的功能和現今市場上流行的防火牆有巨大差距。隨著技術的不斷髮展,防火牆也處於不斷的變化之中。防火牆技術經歷了包過濾、應用代理閘道器再到狀態檢測三個階段。其中狀態檢測是比較先進的防火牆技術,它摒棄了包過濾防火牆僅考查資料包的 IP 地址等幾個引數,而不關心資料包連線狀態變化的缺點,在防火牆的核心部分建立狀態連線表,並將進出網路的資料當成一個個的會話,利用狀態表跟蹤每一個會話狀態。狀態檢測技術在大力提高安全防範能力的同時也改進了流量處理速度。狀態監測技術採用了一系列最佳化技術,使防火牆效能大幅度提升,能應用在各類網路環境中,尤其是在一些規則複雜的大型網路上。深度包檢測技術將為防火牆的發展提升到一個新的階段。該技術對資料包頭或有效載荷所封裝的內容進行分析,從而引導、過濾和記錄基於IP的應用程式和Web服務通訊流量,其工作並不受協議種類和應用程式型別的限制。採用深度包檢測技術,企業網路可以獲得效能上的大幅度提升而無需購買昂貴的伺服器或是其他安全產品。

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

相關文章