[導讀]本文設計的是一個基於Linux主機的包過濾型我的防火牆,它實現的功能和現今市場上流行的防火牆有巨大差距。隨着技術的不斷髮展,防火牆也處於不斷的變化之中。防火牆技術經歷了包過濾、應用代理網關再到狀態檢測三個階段。 數據庫
摘 要 防火牆是網絡安全研究的一個重要內容,數據包捕獲是包過濾型防火牆的前提,本文對基於Linux主機的我的防火牆的數據包捕獲模塊進行了研究,重點論述數據包捕獲模塊的結構、組成以及功能。首先對信息安全及防火牆的重要性進行論述,並給出防火牆的詳細分類;而後分析了基於Linux主機的我的防火牆整體設計及軟硬件平臺原理,接着論述Linux下的數據包捕獲模塊結構與原理,並詳述其具體實現步驟。 編程
關鍵詞 防火牆 Linux 數據包捕獲模塊 包過濾 緩存
1、防火牆概述 安全
網絡防火牆技術是一種用來增強網絡之間訪問控制,防止外部網絡用戶以非法手段經過外部網絡進入內部網絡,訪問內部網絡資源,保護內部網絡操做環境的特殊網絡互聯設備。它對兩個或多個網絡之間傳輸的數據包按照必定的安全策略來實施檢查,以決定網絡之間的通訊是否被容許,並監視網絡運行狀態。 服務器
根據防火牆所採用的技術不一樣,能夠將它分爲四種基本類型:包過濾型、網絡地址轉換—NAT、代理型和監測型。包過濾型產品是防火牆的初級產品,其技術依據是網絡中的分包傳輸技術。包過濾技術的優勢是簡單實用,實現成本較低,在應用環境比較簡單的狀況下,可以以較小的代價在必定程度上保證系統的安全。網絡地址轉換是一種用於把IP地址轉換成臨時的、外部的、註冊的IP地址標準。它容許具備私有IP地址的內部網絡訪問因特網。 網絡
代理型防火牆也能夠被稱爲代理服務器,它的安全性要高於包過濾型產品,並已經開始嚮應用層發展。代理型防火牆的優勢是安全性較高,能夠針對應用層進行偵測和掃描,對付基於應用層的侵入和病毒都十分有效。其缺點是對系統的總體性能有較大的影響,並且代理服務器必須針對客戶機可能產生的全部應用類型逐一進行設置,大大增長了系統管理的複雜性。 數據結構
監測型防火牆是新一代的產品,可以對各層的數據進行主動的、實時的監測,在對這些數據加以分析的基礎上,監測型防火牆可以有效地判斷出各層中的非法侵入。同時,這種檢測型防火牆產品通常還帶有分佈式探測器,這些探測器安置在各類應用服務器和其餘網絡的節點之中,不只可以檢測來自網絡外部的攻擊,同時對來自內部的惡意破壞也有極強的防範做用。監測型防火牆在安全性上已超越了包過濾型和代理服務器型防火牆,但其實現成本較高。基於對系統成本與安全技術成本的綜合考慮,用戶能夠選擇性地使用某些監測型技術。 dom
2、基於Linux我的防火牆整體設計 socket
本文研究的是防火牆系統的軟硬件環境以及該防火牆的開發步驟和所要實現的功能,最後重點對該防火牆系統所須要的硬件和軟件平臺原理進行說明。儘管全部Linux系統都自帶防火牆內核程序,但須要用戶進行配置才能起到保護網絡安全的目的。 tcp
一、防火牆系統整體設計
Linux系統下實現軟件防火牆的設計與應用,實質上就是基於主機的網絡安全解決方案。所以,咱們徹底能夠選擇合適的軟硬件平臺和相應的防火牆設計原理,本身開發出一套可以知足要求的防火牆系統。
概括起來這裏要實現的防火牆須要知足兩大要求:第一,必須可以對主機提供安全保護,即對主機與局域網之外的主機進行數據傳輸時實施安全保護;第二,必須可以提供良好的人機接口界面,具備容易操做、容易管理的優勢。
考慮到現有硬件設備的限制,在保證知足實驗要求的環境下儘量地簡化了實驗環境。由於該防火牆系統是基於主機設計的,故只須要一個聯網的主機便可進行實驗。該系統是在Linux環境下用C語言實現包過濾型軟件防火牆的設計與應用,採用Kylix開發工具進行界面設計和數據庫鏈接。
基於Linux的我的防火牆系統主要具備如下功能:
(1)全程動態包過濾 本防火牆要在Linux下實現全程動態包過濾功能,經過分析數據包的地址、協議、端口對任何網絡鏈接當前狀態進行訪問控制,從而提升系統的性能和安全性。
(2)提供日誌審計 本防火牆配備了日誌記錄系統和查詢工具,用於記錄系統管理、系統訪問及針對安全策略的網絡訪問狀況。
(3)防火牆數據庫的備份 本防火牆製做防火牆過濾數據庫,而且管理員能夠能動地對該數據庫進行設置。
3、基於Linux的數據包捕獲模塊結構與原理分析
本節就監控層數據包捕獲模塊的結構特性進行探討,並詳細論述其原理,且對實現數據包捕獲功能的程序的一些重要函數進行說明。
一、數據包捕獲模塊結構
數據包捕獲模塊用於監視和驗證網絡流量狀況,它能夠截取或者閱讀網絡上OSI協議模型中各個協議層次上的數據包。
本文所設計的數據包捕獲程序能夠捕獲經過原始套接口(Socket)的原始數據包(Raw Packet),當一個數據包到達網絡接口時,數據包捕獲程序就直接從緩存區讀取捕獲的數據包,以供數據分析和處理時調用。數據捕獲模塊的結構如圖1所示:
TCP/IP網絡
↓
數據捕獲
網卡設置
獲取數據包
獲得數據包頭信息
圖1 數據捕獲程序結構圖
二、數據包捕獲模塊原理分析
(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」。該函數的設計目標是統一不一樣系統上所提供的用於數據包截獲的不一樣類型接口,並使得相似的高層應用程序的編寫和移植變得簡單有效,再也不須要對每個應用都使用不一樣的依賴於具體系統的數據包截獲模塊。
4、基於Linux的數據包捕獲模塊設計實現
一、 數據包捕獲模塊設計流程圖
在數據包捕獲程序中,經過設置網卡工做於混雜狀態,對網絡鏈路進行監聽並收集數據包,從而得到數據包頭信息。其流程圖如圖2所示:
啓動SOCKET函數
設置網卡爲混雜模式
從緩衝區接收數據
數據包格式檢查並顯示
數據處理模塊
圖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數據包的頭部。最後,從數據包提取出須要的數據。
三、程序中用到的一些結構體解析
(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服務通訊流量,其工做並不受協議種類和應用程序類型的限制。採用深度包檢測技術,企業網絡能夠得到性能上的大幅度提高而無需購買昂貴的服務器或是其餘安全產品。
參考文獻
[1]孫建華 等編著. 網絡系統管理――Linux實訓篇[M]. 人民郵電出版社.2003.10.
[2][美]Robert L.Ziegler著. 餘青霓譯. Linux防火牆[M]. 人民郵電出版社. 2000.10.
[3][美]Arthur Griffith著. GCC技術參考大全[M]. 清華大學出版社. 2004.7.
[4][美]Christopher Negus著. Red Hat Linux 9寶典[M]. 電子工業出版社.2004.10.
[5][美]Terry William Ogletree著. 防火牆原理與實施[M]. 電子工業出版社.2001.2.
[6]林宇 郭凌雲編著. Linux網絡編程[M]. 人民郵電出版社 2000.10.
[7]Linux環境下的網絡編程. http://www.blog.edu.cn/more.asp?name=minico&id=114134.
[8]深刻學習Linux下的網絡監聽技術. http://www.fengnet.com/showart.asp?art_id=611&cat_id=9.