
一、防火墻概述
網(wǎng)絡防火墻技術(shù)是一種用來加強網(wǎng)絡之間訪問控制,防止外部網(wǎng)絡用戶以非法手段通過外部網(wǎng)絡進入內(nèi)部網(wǎng)絡,訪問內(nèi)部網(wǎng)絡資源,保護內(nèi)部網(wǎng)絡操作環(huán)境的特殊網(wǎng)絡互聯(lián)設備。它對兩個或多個網(wǎng)絡之間傳輸?shù)臄?shù)據(jù)包按照一定的安全策略來實施檢查,以決定網(wǎng)絡之間的通信是否被允許,并監(jiān)視網(wǎng)絡運行狀態(tài)。
根據(jù)防火墻所采用的技術(shù)不同,可以將它分為四種基本類型:包過濾型、網(wǎng)絡地址轉(zhuǎn)換—NAT、代理型和監(jiān)測型。包過濾型產(chǎn)品是防火墻的初級產(chǎn)品,其技術(shù)依據(jù)是網(wǎng)絡中的分包傳輸技術(shù)。包過濾技術(shù)的優(yōu)點是簡單實用,實現(xiàn)成本較低,在應用環(huán)境比較簡單的情況下,能夠以較小的代價在一定程度上保證系統(tǒng)的安全。網(wǎng)絡地址轉(zhuǎn)換是一種用于把IP地址轉(zhuǎn)換成臨時的、外部的、注冊的IP地址標準。它允許具有私有IP地址的內(nèi)部網(wǎng)絡訪問因特網(wǎng)。
代理型防火墻也可以被稱為代理服務器,它的安全性要高于包過濾型產(chǎn)品,并已經(jīng)開始向應用層發(fā)展。代理型防火墻的優(yōu)點是安全性較高,可以針對應用層進行偵測和掃描,對付基于應用層的侵入和病毒都十分有效。其缺點是對系統(tǒng)的整體性能有較大的影響,而且代理服務器必須針對客戶機可能產(chǎn)生的所有應用類型逐一進行設置,大大增加了系統(tǒng)管理的復雜性。
監(jiān)測型防火墻是新一代的產(chǎn)品,能夠?qū)Ω鲗拥臄?shù)據(jù)進行主動的、實時的監(jiān)測,在對這些數(shù)據(jù)加以分析的基礎(chǔ)上,監(jiān)測型防火墻能夠有效地判斷出各層中的非法侵入。同時,這種檢測型防火墻產(chǎn)品一般還帶有分布式探測器,這些探測器安置在各種應用服務器和其他網(wǎng)絡的節(jié)點之中,不僅能夠檢測來自網(wǎng)絡外部的攻擊,同時對來自內(nèi)部的惡意破壞也有極強的防范作用。監(jiān)測型防火墻在安全性上已超越了包過濾型和代理服務器型防火墻,但其實現(xiàn)成本較高。基于對系統(tǒng)成本與安全技術(shù)成本的綜合考慮,用戶可以選擇性地使用某些監(jiān)測型技術(shù)。
二、基于Linux個人防火墻總體設計
本文研究的是防火墻系統(tǒng)的軟硬件環(huán)境以及該防火墻的開發(fā)步驟和所要實現(xiàn)的功能,最后重點對該防火墻系統(tǒng)所需要的硬件和軟件平臺原理進行說明。盡管所有Linux系統(tǒng)都自帶防火墻內(nèi)核程序,但需要用戶進行配置才能起到保護網(wǎng)絡安全的目的。
1、防火墻系統(tǒng)總體設計
Linux系統(tǒng)下實現(xiàn)軟件防火墻的設計與應用,實質(zhì)上就是基于主機的網(wǎng)絡安全解決方案。因此,我們完全可以選擇合適的軟硬件平臺和相應的防火墻設計原理,自己開發(fā)出一套能夠滿足要求的防火墻系統(tǒng)。
歸納起來這里要實現(xiàn)的防火墻需要滿足兩大要求:第一,必須能夠?qū)χ鳈C提供安全保護,即對主機與局域網(wǎng)以外的主機進行數(shù)據(jù)傳輸時實施安全保護;第二,必須能夠提供良好的人機接口界面,具有容易操作、容易管理的優(yōu)點。
考慮到現(xiàn)有硬件設備的限制,在保證滿足實驗要求的環(huán)境下盡可能地簡化了實驗環(huán)境。因為該防火墻系統(tǒng)是基于主機設計的,故只需要一個聯(lián)網(wǎng)的主機即可進行實驗。該系統(tǒng)是在Linux環(huán)境下用C語言實現(xiàn)包過濾型軟件防火墻的設計與應用,采用Kylix開發(fā)工具進行界面設計和數(shù)據(jù)庫連接。
基于Linux的個人防火墻系統(tǒng)主要具有以下功能:
(1)全程動態(tài)包過濾 本防火墻要在Linux下實現(xiàn)全程動態(tài)包過濾功能,通過分析數(shù)據(jù)包的地址、協(xié)議、端口對任何網(wǎng)絡連接當前狀態(tài)進行訪問控制,從而提高系統(tǒng)的性能和安全性。
(2)提供日志審計 本防火墻配備了日志記錄系統(tǒng)和查詢工具,用于記錄系統(tǒng)管理、系統(tǒng)訪問及針對安全策略的網(wǎng)絡訪問情況。
(3)防火墻數(shù)據(jù)庫的備份 本防火墻制作防火墻過濾數(shù)據(jù)庫,并且管理員可以能動地對該數(shù)據(jù)庫進行設置。
三、基于Linux的數(shù)據(jù)包捕獲模塊結(jié)構(gòu)與原理分析
本節(jié)就監(jiān)控層數(shù)據(jù)包捕獲模塊的結(jié)構(gòu)特性進行探討,并詳細論述其原理,且對實現(xiàn)數(shù)據(jù)包捕獲功能的程序的一些重要函數(shù)進行說明。
1、數(shù)據(jù)包捕獲模塊結(jié)構(gòu)
數(shù)據(jù)包捕獲模塊用于監(jiān)視和驗證網(wǎng)絡流量情況,它可以截取或者閱讀網(wǎng)絡上OSI協(xié)議模型中各個協(xié)議層次上的數(shù)據(jù)包。
本文所設計的數(shù)據(jù)包捕獲程序可以捕獲通過原始套接口(Socket)的原始數(shù)據(jù)包(Raw Packet),當一個數(shù)據(jù)包到達網(wǎng)絡接口時,數(shù)據(jù)包捕獲程序就直接從緩存區(qū)讀取捕獲的數(shù)據(jù)包,以供數(shù)據(jù)分析和處理時調(diào)用。數(shù)據(jù)捕獲模塊的結(jié)構(gòu)如圖1所示:
TCP/IP網(wǎng)絡↓
數(shù)據(jù)捕獲
網(wǎng)卡設置
獲取數(shù)據(jù)包
得到數(shù)據(jù)包頭信息
圖1 數(shù)據(jù)捕獲程序結(jié)構(gòu)圖
2、數(shù)據(jù)包捕獲模塊原理分析
(1)網(wǎng)卡設置原理
在一個實際的系統(tǒng)中,數(shù)據(jù)的收發(fā)是由網(wǎng)卡來完成的,網(wǎng)卡接收到傳輸來的數(shù)據(jù),網(wǎng)卡內(nèi)的程序接收數(shù)據(jù)幀的目的MAC地址,根據(jù)計算機上的網(wǎng)卡驅(qū)動程序設置的接收模式判斷該不該接收,認為不該接收就丟掉不管。而對于網(wǎng)卡來說一般有四種接收模式:廣播模式組播模式、直接方式、混雜模式。數(shù)據(jù)包捕獲程序首先使網(wǎng)絡接口(網(wǎng)卡)處于混雜狀態(tài),從而可截獲網(wǎng)絡上的內(nèi)容,并且通過相應的軟件處理,可以實時分析這些數(shù)據(jù)的內(nèi)容,為數(shù)據(jù)包過濾作準備。
(2)基本函數(shù)說明
本文中在Linux主機上用C語言編寫數(shù)據(jù)包捕獲程序,所編寫的程序中用到很多Linux中的預定義函數(shù),在此節(jié)將對這些基本函數(shù)的功能和使用特點進行說明。
1)ioctl函數(shù)定義
ioctl()函數(shù)非常龐雜,它可以控制各種文件的屬性。它用于控制特殊文件的底層設備參數(shù),這些特殊文件通常是指終端、套接字和接口。ioctl函數(shù)原型為:
int ioctl(int handle,int cmd[,int *argdx,int argcx]);
2)socket函數(shù)定義
常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)包式Socket (SOCK_DGRAM)。流式是一種面向連接的Socket,針對面向連接的TCP服務應用;數(shù)據(jù)報式Socket是一種無連接的Socket,針對無連接的UDP服務應用。Socket函數(shù)原型為:
int socket(int domain, int type,int protocol);
3)recvfrom()函數(shù)定義
用recvfrom()函數(shù)來實現(xiàn)接收數(shù)據(jù)包,recvfrom()是具備“阻塞式I/O”特性的函數(shù),能夠在沒有數(shù)據(jù)包到達的情況下暫時掛起等待,直至接收到數(shù)據(jù)包后,再激活轉(zhuǎn)入下一步處理。recvfrom()函數(shù)的原型為:
int recvfrom(SOCKET s,char FAR *buf,int len,int flags,struct sockaddr FAR *from,int *fromlen);
本函數(shù)從已連接套接口上接收數(shù)據(jù),并捕獲數(shù)據(jù)發(fā)送源的地址。對于SOCK_STREAM類型的套接口,最多可以接收緩沖區(qū)大小個數(shù)據(jù)。如果套接口被設置為線內(nèi)接收帶外數(shù)據(jù)(選項為 SO_OOBINLINE),且有帶外數(shù)據(jù)未讀入,則返回帶外數(shù)據(jù)。應用程序可通過調(diào)用ioctlsocket()的SOCATMARK命令來確定是否有帶外數(shù)據(jù)待讀入。對于SOCK_STREAM類型套接口,忽略from和fromlen參數(shù)。
4)一些“字節(jié)順序”轉(zhuǎn)換函數(shù)
因為網(wǎng)絡和主機采用的存儲字節(jié)時內(nèi)存順序安排方式的差異,就存在“字節(jié)順序”的問題。在網(wǎng)絡環(huán)境下存儲時,高位字節(jié)存放在內(nèi)存的起始位置,而低字節(jié)則存放在較高的位置。主機形式的存放順序恰好相反,低位字節(jié)存放在內(nèi)存的起始位置。這就需要以下相應的字節(jié)順序轉(zhuǎn)換函數(shù):
inet_ntoa():將32位的網(wǎng)絡二進制數(shù)值轉(zhuǎn)換為可讀十進制形式的帶點分割符的IP地址。
inet_addr():將帶有分割符的IP地址轉(zhuǎn)換為32位的unsigned long的格式。
ntohs():將網(wǎng)絡字節(jié)順序轉(zhuǎn)換為32位的主機字節(jié)順序。
ntohl():將網(wǎng)絡字節(jié)順序轉(zhuǎn)換成16位的主機字節(jié)順序。
htonl():將32位u_long的值由主機字節(jié)順序轉(zhuǎn)換為網(wǎng)絡字節(jié)順序。
htons():將16位u_long的值由主機字節(jié)順序轉(zhuǎn)換為網(wǎng)絡字節(jié)順序。
本文設計的數(shù)據(jù)捕獲程序需要使用SOCK_PACKET設備,SOCK_PACKET只在基于Linux的操作系統(tǒng)中有效定義。為此,美國洛侖茲伯克利國家實驗室編寫了專用于數(shù)據(jù)包截獲的API函數(shù)庫“Libpcap”。該函數(shù)的設計目標是統(tǒng)一不同系統(tǒng)上所提供的用于數(shù)據(jù)包截獲的不同類型接口,并使得類似的高層應用程序的編寫和移植變得簡單有效,不再需要對每一個應用都使用不同的依賴于具體系統(tǒng)的數(shù)據(jù)包截獲模塊。
四、基于Linux的數(shù)據(jù)包捕獲模塊設計實現(xiàn)
1、 數(shù)據(jù)包捕獲模塊設計流程圖
在數(shù)據(jù)包捕獲程序中,通過設置網(wǎng)卡工作于混雜狀態(tài),對網(wǎng)絡鏈路進行監(jiān)聽并收集數(shù)據(jù)包,從而獲得數(shù)據(jù)包頭信息。其流程圖如圖2所示:
啟動SOCKET函數(shù)
設置網(wǎng)卡為混雜模式
從緩沖區(qū)接收數(shù)據(jù)
數(shù)據(jù)包格式檢查并顯示
數(shù)據(jù)處理模塊
圖2 數(shù)據(jù)包捕獲模塊流程圖
2、數(shù)據(jù)包捕獲模塊實現(xiàn)
該數(shù)據(jù)包捕獲程序用C語言來編寫,程序中用到很多Linux網(wǎng)絡編程中的函數(shù)。
(1)設置網(wǎng)絡接口為混雜模式
網(wǎng)絡接口的混雜模式使得一個網(wǎng)絡接口設備從只能讀取目標地址為6字節(jié)MAC地址的數(shù)據(jù)包,變?yōu)榭勺x取網(wǎng)絡廣播媒體中的所有數(shù)據(jù)包。該部分通過兩次ioctl函數(shù)調(diào)用實現(xiàn):
ioctl(sock, SIOCGIFFLAGS, &ifr)
ifr.ifr_flags |= IFF_PROMISC
ioctl(sock, SIOCGIFFLAGS, &ifr)
第一次的ioctl函數(shù)調(diào)用,用來截獲ifr(struct ifreq)結(jié)構(gòu)中所含接口名稱所指接口的標記。第一個參數(shù)是打開的原始套接字描述符“sock”,第二個參數(shù)是所要執(zhí)行的請求操作。第三個參數(shù)是接口請求數(shù)據(jù)結(jié)構(gòu)的地址指針,該結(jié)構(gòu)中包含了所以進行請求操作的接口名稱值。
我們通過將混合標記(IFF_PROMISC)應用到接口請求結(jié)構(gòu)的標記位變量中來改變接口標記位。操作符“|=”將混合標記符與原有的接口標記進行 “或”操作來設置新的接口標記。獲得新的接口標記后,將其設置到實際接口中。第二次的ioctl調(diào)用,將接口設備設置為混合模式。正如第一個ioctl調(diào)用是獲得網(wǎng)絡接口的標記,這次調(diào)用是設置ifr結(jié)構(gòu)中修改過的新標記寫到物理接口上。
(2)打開Socket設備
用socket函數(shù)來打開Socket設備。
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
domain域使用AF_PACKET,能夠既接收鏈路層也接收網(wǎng)絡層的數(shù)據(jù)包。
(3)接收數(shù)據(jù)
使用recvfrom()函數(shù)來實現(xiàn)接收數(shù)據(jù)包:
recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len)
這是從打開的網(wǎng)絡插座Socket讀取數(shù)據(jù)包的地方,但要注意,addr結(jié)構(gòu)有一個強制類型轉(zhuǎn)換,以適應recvfrom()函數(shù)的語法要求,recvfrom()函數(shù)在成功讀取的情況下返回讀取的字節(jié)數(shù),否則返回-1。
(4)判斷包頭指針
該數(shù)據(jù)包捕獲模塊可以接收到的數(shù)據(jù)包都是原始數(shù)據(jù)包,它們的格式一般先是以太網(wǎng)數(shù)據(jù)幀的頭部,接著是ARP或者IP數(shù)據(jù)包的頭部。IP數(shù)據(jù)包后緊跟著 TCP或UDP、ICMP的頭部,最后才是真正要傳輸?shù)臄?shù)據(jù)。于是,在拆分IP數(shù)據(jù)包時,先提取以太網(wǎng)數(shù)據(jù)幀的頭部,再提取IP數(shù)據(jù)包的頭部,然后分析 TCP或UDP、ICMP數(shù)據(jù)包的頭部。最后,從數(shù)據(jù)包提取出需要的數(shù)據(jù)。
3、程序中用到的一些結(jié)構(gòu)體解析
(1)sockadd_in結(jié)構(gòu)體
在網(wǎng)絡中第一個被創(chuàng)造的結(jié)構(gòu)類型是sockaddr。這個數(shù)據(jù)結(jié)構(gòu)是為許多類型的套接口儲存地址信息。它的定義如下:
struct sockaddr{
unsigned shortsa_family; /*這個是地址族,通常是AF-xxxx的形式*/
charsa_data[14]; /*14字節(jié)的地址信息*/};
(2)ethhdr結(jié)構(gòu)體
以下是相應數(shù)據(jù)結(jié)構(gòu):
struct ethhdr {
unsigned char h_dest[ETH_ALEN];/*48位的目標地址的網(wǎng)卡物理地址*/
unsigned char h_source[ETH_ALEN];/*48位的源地址的物理網(wǎng)卡地址*/
unsigned short h_proto;/*16位的以太網(wǎng)協(xié)議*/}
(3)iphdr結(jié)構(gòu)體
這是Linux 的ip協(xié)議報頭,針對版本的不同它可以有不同的定義,我們國內(nèi)一般用BIG的定義,其中version 是ip的版本,protocol是ip的協(xié)議分類,saddr是32位的源ip地址,daddr是32位的目標ip地址。
(4)tcphdr結(jié)構(gòu)體
這是Linux 下tcp協(xié)議的一部分,與ip協(xié)議相同取BIG,其中source是源端口,dest 是目的端口,seq是s序,ack_seq是a序號,其余的是tcp的連接標志其中包括6個標志:syn表示連接請求,urg 表示緊急信息,fin表示連接結(jié)束,ack表示連接應答,psh表示推棧標志,rst表示中斷連接。window是表示接受數(shù)據(jù)窗口大小,check是校驗碼,urg ptr是緊急指針。
(5)udphdr結(jié)構(gòu)體
這是Linux下ip協(xié)議中udp協(xié)議的一部分,以下是相應數(shù)據(jù)結(jié)構(gòu):
struct udphdr{
u_int16_t source;/* 源端口*/
u_int16_t dest;/* 目的端口*/
u_int16_t len;/* udp 長度*/
u_int16_t check;/*校驗碼*/}
本文設計的是一個基于Linux主機的包過濾型個人防火墻,它實現(xiàn)的功能和現(xiàn)今市場上流行的防火墻有巨大差距。隨著技術(shù)的不斷發(fā)展,防火墻也處于不斷的變化之中。防火墻技術(shù)經(jīng)歷了包過濾、應用代理網(wǎng)關(guān)再到狀態(tài)檢測三個階段。其中狀態(tài)檢測是比較先進的防火墻技術(shù),它摒棄了包過濾防火墻僅考查數(shù)據(jù)包的 IP 地址等幾個參數(shù),而不關(guān)心數(shù)據(jù)包連接狀態(tài)變化的缺點,在防火墻的核心部分建立狀態(tài)連接表,并將進出網(wǎng)絡的數(shù)據(jù)當成一個個的會話,利用狀態(tài)表跟蹤每一個會話狀態(tài)。狀態(tài)檢測技術(shù)在大力提高安全防范能力的同時也改進了流量處理速度。狀態(tài)監(jiān)測技術(shù)采用了一系列優(yōu)化技術(shù),使防火墻性能大幅度提升,能應用在各類網(wǎng)絡環(huán)境中,尤其是在一些規(guī)則復雜的大型網(wǎng)絡上。深度包檢測技術(shù)將為防火墻的發(fā)展提升到一個新的階段。該技術(shù)對數(shù)據(jù)包頭或有效載荷所封裝的內(nèi)容進行分析,從而引導、過濾和記錄基于IP的應用程序和Web服務通信流量,其工作并不受協(xié)議種類和應用程序類型的限制。采用深度包檢測技術(shù),企業(yè)網(wǎng)絡可以獲得性能上的大幅度提升而無需購買昂貴的服務器或是其他安全產(chǎn)品。
文章作者:馬麗麗
CIO頻道人物視窗
CIO頻道方案案例庫
大數(shù)據(jù)建設方案案例庫
電子政務建設方案案例庫
互聯(lián)集成系統(tǒng)構(gòu)建方案案例庫
商務智能建設方案案例庫
系統(tǒng)集成類軟件信息研發(fā)企業(yè)名錄