close
1 防火牆的基本概念
1.1什麼是防火牆
在大廈構造中,防火牆被設計用來防止或從大廈的一部分傳播到另一部分。我們所涉及的防火牆服務於類似的目的:防止因特網的危險傳播到你的內部網絡。實際上,因特網防火牆不像一座現代化大廈中的防火牆,它更像中世紀城堡的護城河。
防火牆一方面阻止來自因特網的對受保護網絡的未授權或未驗證的訪問,另一方面允許內部網絡的用戶對因特網進行Web訪問或收發E-mail等。防火牆也可以作為一個訪問因特網的權限控制關口,如允許組織內的特定的人可以訪問因特網。現在的許多防火牆同時還具有一些其他特點,如進行身份鑒別,對信息進行安全(加密)處理等等。
防火牆不單用於對因特網的連接,也可以用來在組織內部保護大型機和重要的資源(數據)。對受保護數據的訪問都必須經過防火牆的過濾,即使該訪問是來自組織內部。
當外部網絡的用戶訪問網內資源時,要經過防火牆;而內部網絡的用戶訪問網外資源時,也會經過防火牆。這樣,防火牆起了一個「警衛」的作用,可以將需要禁止的數據包在這裡給丟掉。
1.2網絡的不安全因素
一個網絡系統的最主要的目的是實現「資源共享」,同時實現對數據的協作處理、信息的傳遞等等。網絡自身的這種開放性是引發網絡安全問題的最直接原因。
網絡的不安全因素有以下幾類:
1)環境:各類天災及事故都會對網絡造成損害,令網絡完全癱瘓或不能正常工作。
2)資源共享:包括硬件共享、軟件共享、數據共享。資源的相互共享為異地用戶提供了方便,同時也給非法用戶創造了條件。非法用戶可以通過終端來竊取信息、破壞信息。共享資源與使用者之間有相當一段距離,這也為竊取信息在時間和空間上提供了便利條件。
3)數據傳輸:信息需要通過數據通信來傳輸。在傳輸過程中,信息容易被竊聽、修改。
4)計算機病毒:借助網絡,病毒可以在短時間內感染大量的計算機,使網絡趨於癱瘓。如「蠕蟲」病毒及電子郵件「炸彈」。
5)網絡管理:對系統的管理措施不當,會造成設備的損壞、重要信息的人為洩露等等。
1.3防火牆的作用
我們將防火牆比作中世紀城堡的護城河,並且像護城河一樣,防火牆不是堅不可摧的。它不防備已經是裡面的人;如果與內部的防禦相配合,它工作的最好;同時,即使你把所有的船都收藏起來,人們有時仍然能設法橫渡。構築防火牆需要昂貴的花費和努力,而且它對內部人員的限制是令人厭煩的。
防火牆對網絡威脅進行極好的防範,但是,它們不是安全解決方案的全部。某些威脅是防火牆力所不及的。
1)防火牆不能防範惡意的知情者:防火牆可以禁止系統用戶通過網絡發送專有的信息。但是用戶可以將數據複製到磁盤或者紙上,放在公文包裡帶出去。如果侵襲者已經在防火牆的內部,防火牆實際上無能為力。
2)防火牆對不通過它的連接難有作為:防火牆能有效的控制穿過它的傳輸信息,但對於不穿過它的傳輸信息無能為力。
3)防火牆不能防備所有新的威脅:一個好的設計能防備新的威脅,但沒有防火牆能自動防禦所有新的威脅。人們不斷發現利用以前可信賴的服務的新的侵襲方法。
4)防火牆不能防備病毒:有太多種的病毒和太多種的方法可以使得病毒隱藏在數據中。
2 防火牆的實現
2.1防火牆的分類
一般把防火牆分為兩類:網絡層防火牆、應用層防火牆。網絡層的防火牆主要獲取數據包的包頭信息,如協議號、源地址、目的地址、目的端口等或者直接獲取包頭的一段數據。應用層的防火牆對於整個信息流進行分析。
實現防火牆時,共有以下幾種:
1 應用網關(application gateway):檢驗通過此網關的所有數據包中的應用層的數據;經常是由經過修改的應用程序組成運行在防火牆上。如FTP應用網關,對於連接的client端來說是一個FTP server,對於server端來說是一個FTP client。連接中傳輸的所有ftp數據包都必須經過此FTP應用網關。
2 電路級網關(circuit-level gateway):此電路指虛電路。在TCP或UDP發起(open)一個連接或電路之前,驗證該會話的可靠性。只有在握手被驗證為合法且握手完成之後,才允許數據包的傳輸。一個會話建立後,此會話的信息被寫入防火牆維護的有效連接表中。數據包只有在它所含的會話信息符合該有效連接表中的某一入口(entry)時,才被允許通過。會話結束時,該會話在表中的入口被刪掉。電路級網關只對連接在會話層進行驗證。一旦驗證通過,在該連接上可以運行任何一個應用程序。以FTP為例,電路層網關只在一個FTP會話開始時,在tcp層對此會話進行驗證。如果驗證通過,則所有的數據都可以通過此連接進行傳輸,直至會話結束。
3 包過濾(packet filter):對每個數據包按照用戶所定義的進行過濾,如比較數據包的源地址、目的地址是否符合規則等。包過濾不管會話的狀態,也不分析數據。如用戶規定允許端口是21或者大於等於1024的數據包通過,則只要端口符合該條件,數據包便可以通過此防火牆。如果配置的規則比較符合實際應用的話,在這一層能夠過濾掉很多有安全隱患的數據包。
4 代理(proxy):通常情況下指的是地址代理,一般位於一台代理服務器或路由器上。它的機制是將網內主機的IP地址和端口替換為服務器或路由器的IP地址和端口。舉例來說,一個公司內部網絡的地址是129.0.0.0網段,而公司對外的正式IP地址是202.138.160.2~202.38.160.6,則內部的主機129.9.10.100以WWW方式訪問網外的某一台服務器時,在通過代理服務器後,IP地址和端口可能為202.138.160.2:6080。
在代理服務器中維護著一張地址對應表。當外部網絡的WWW服務器返回結果時,代理服務器會將此IP地址及端口轉化為內部網絡的IP地址和端口80。使用代理服務器可以讓所有的外部網絡的主機與內部網絡之間的訪問都必須通過它來實現。這樣可以控制對內部網絡帶有重要資源的機器的訪問。
路由器中的防火牆主要是指包過濾加地址轉換。
2.2包過濾
包過濾應用在路由器中,就為路由器增加了對數據包的過濾功能。一般情況下,指的是對IP數據包的過濾。對路由器需要轉發的數據包,先獲取包頭信息,包括IP層所承載的上層協議的協議號,數據包的源地址、目的地址、源端口、目的端口等,然後和設定的規則進行比較,根據比較的結果對數據包進行轉發或者丟棄。
包過濾在IP數據包中所取的用來判斷的元素如圖3所示(圖中IP所承載的上層協議為TCP):
大多數數據包過濾系統在數據本身上不做任何事:它們不做基於內容的決定。有了數據包過濾,你可以說:
不讓任何人從外界使用Telnet登錄。
或者:
讓每個人經由SMTP向我們發送電子郵件。
或者是:
那機器經由NNTP能把新聞發給我們,但是沒有其他機器能這樣做。
然而,你不可以這樣說:
這個用戶能從外部遠程登錄,但是其它用戶不能這樣做。
因為「用戶」 不是數據包過濾系統所能辨認的。同時,你也不可以說:
你能發送這些文件而不是那些文件。
因為「文件」也不是數據包過濾系統所能辨認的
2.3訪問列表
為了過濾數據包,需要配置一些規則,規定什麼樣的數據包可以通過,什麼樣的不能通過。IP層所能獲取的通用信息如上圖。則配置的規則應該對這些參數作出規定。
一般採用稱為訪問列表的技術用來配置過濾規則。訪問列表分為兩類:標準訪問列表、擴展訪問列表。
2.3.1標準訪問列表
標準訪問列表的格式如下:
access-list listnumber permit│deny address {wildcard-mask}
此格式表示:允許或拒絕來自指定網絡的數據包,該網絡由IP地址(address)和地址通配比較位(wildcard-mask)指定。
通配比較位用法類似於子網掩碼而寫法不相同。IP地址與地址通配位的關係語法上規定如下:在通配位中相應位為1的地址中的位在比較中被忽略。地址與通配位都是32位的長整形數(unsigned long)。如通配位是0x00ffffff(0.255.255.255),則比較時,高8位需要比較,其他的都被忽略。又如IP地址是129.102.1.1,通配位是0.0.255.255,則地址與通配位合在一起表示129.102.0.0網段。若要表示202.38.160.0網段,地址位寫成202.38.160.X(X是0~255之間的任意一個數字),通配位為0.0.0.255。在程序中,用異或等位*作高效率的實現這類比較。
標準訪問列表的例子:
1) access-list 4 deny 202.38.160.0 0.0.255.255
表示該規則序號為4,禁止來自202.38.0.0網絡的主機的訪問。
2) access-list 4 permit 202.38.160.1 0.0.0.255
表示該規則序號為4,允許來自202.38.160.0網絡的主機的訪問。與2)規則一起表示禁止一個大網段上的主機但允許其中的一小部分主機的訪問。 2.3.2擴展訪問列表:
擴展訪問列表的格式如下:
access-list listnumber permit│deny protocol source source-wildcard-mask destination destination-wildcard-mask {operator operand} {log}
此格式表示允許或拒絕滿足如下條件的數據包:
帶有指定的協議(portocol),如tcp、udp等;
數據包來自由source及source-wildcard-mask指定的網絡;
數據包去往由destination及destination-wildcard-mask指定的網絡;
{可選} 該數據包的目的端口在由operator operand規定的端口範圍之內;
並按要求做或不做日誌。
擴展訪問列表的例子:
1) 100 deny tcp 129.9.0.0 0.0.255.255 202.38.160.0 0.0.0.255 eq www log
表示該規則序號為100,禁止129.9.0.0網段內的主機建立與202.38.160.0網段內的主機的www端口(80)的連接,並對違反此規則的事件作日誌。
2) 100 permit tcp 129.9.8.0 0.0.0.255 202.38.160.0 0.0.0.255 eq www
表示該規則序號為100,允許129.9.8.0網段內的主機建立與202.38.160.0網段內的主機的WWW端口(80)的連接。
3) 101 deny tcp any 202.38.160.1 0.0.0.0 eq telnet
表示該規則序號為101,禁止一切主機建立與IP地址為202.38.160.1的主機的telnet(23)的連接。
4) 102 deny udp 129.9.8.0 0.0.0.255 202.38.160.0 0.0.0.255 gt 128
表示該規則序號為102,禁止129.9.8.0網段內的主機建立與202.38.160.0網段內的主機的端口號大於128的UDP(用戶數據報協議)連接。
2.3.3刪除訪問列表:
no access-list listnumber {subitem}
表示刪除指定的listnumber的訪問列表,或者刪除其中的一項。
2.3.4建立訪問列表的索引
建立索引的目的是:進行快速定位;即對於需要過濾的數據包,快速的確定需要和哪些規則進行比較。
索引項根據網段的大小(unsigned long類型,帶地址通配位如0.0.255.255)進行排列,比較時採用二分法進行比較。
索引項中的一個域指向一個指針鏈。如圖中的10.0.0.0索引項指向規則2,規則2再指向規則102,表示一個源地址為10.0.0.0網段的數據包,需要和規則為2和102的進行比較。先比較規則為2的標準規則(標準規則判斷的範圍比較大)。
規定如下:
比較的時候,先比較規則序號小的(在索引指向的域中可以做到這一點)。如先比較2,再比較4,再比較103,再比較104。倘若用戶將要判定的源地址屬於同一個網段的規則寫成了好幾個不同規則序號的規則,那麼過濾的效率降低也是沒有辦法的。一般較正常的情況下,一個索引項後跟一個或兩個規則序號。如圖1中所示。如果在索引中,沒有那個網段的話,需要與源地址為any的規則進行比較。
• 不同序號的規則沒有時間上的先後順序。例如:先配置103,再配102,如果這兩個序號的規則序列中都有判斷129.9.0.0網絡的規則,則過來一個129.9.0.0網絡的包,先和102的比較,再和103的比較。(和上面一點有些重合)
同一序號的規則的配置也沒有時間上的先後順序。在排列時,深度最大的那個排在前面。
這一點需要加以特別說明,也是程序中應該注意的地方。例如:先配置 2 permit 129.102.1.1 0.0.0.0; 再配置一條同樣序號的 2 deny 129.102.0.0 0.0.255.255;前一條直接指定了主機,它的深度最大,還是排在前面。比較時,129.102.0.0網絡的數據包會在序號為4的規則中搜索。若是129.102.1.1,則被前一條滿足,就不再往後比較了。這是因為規則是按照深度的大小來排的。
可以看出,深度是指通配位而言的。一般來說,深度越大,通配位越小。如 0.0.0.0比較時的深度要比0.0.255.255的深度大。 此觀點來自於:一個數據包只被一組規則中的某一個允許或拒絕,也就是最終起作用的是一條規則(該規則的深度最大)。
如果通配位不規則(如0.0.123.234),規則的組織仍是按照通配位的大小。這是基於這樣的考慮:
1)這種寫法非常的少;
2)倘若真的寫出了這樣的規則,一般不太明白這樣的通配位與地址相結合表示什麼樣的地址範圍;
3)可能運用的地方應該是屬於圈定一小部分IP地址,如0.0.0.128,它的深度比較大,比0.0.0.255要大。滿足0.0.0.255的不一定滿足0.0.0.128所指的。
規定規則以通配位大小進行排列,通配位小的在前面,可以減少很多麻煩,也方便了程序的編寫。
根據深度優先的排列後,在命令行上配置的規則就沒有先後順序之分了。
如果源地址是any,則將此規則放在數組下標為199的那一項上。規則間也以序號大小排列。
將源地址為any的規則組織在一起是基於如下考慮:
1)索引的每一個值都屬於any,沒有必要將這些規則所在的access-list的序號加在每一個索引所指的內容中去;否則的話,每一個數據包都需要和該序號的所有規則進行比較;
2)any的情況容易引發安全漏洞。允許any代表允許來自世界各地的訪問。一般不建議配置源地址是any的規則(deny any是個例外)。
3)配置any的情況,大部分是因為需要配置一個對其他情況的一個缺省處理。如配置access-list 1 deny any表示其他規則不能判定的數據包都會被拒絕掉。
4)一般源地址為any的規則數目比較少,可以組織在一起。
用戶配置的規則和現有的規則有衝突的情況,如用戶已經配了一條1 deny any;現在又配了一條2 permit any;這兩條命令的比較範圍是重疊的,實際比較時序號為2的起作用(2把1的結論給推翻了)。序號為1的是無效的,降低了效率。如果和同樣序號的規則發生衝突,如上面的2是1,則將後一條放在排在前一條的後面。
可以看出,不同深度的規則在配置時是沒有衝突的。
一個數據包的過濾經過如下,以圖1中的索引為例,
1)若過來一個129.9.0.0網絡的數據包,在索引中找到第二個是匹配的,該數據包將和序號為103的規則以深度優先進行比較;如果被某一個規則拒絕或者允許,則返回該結果(不再比較源地址為any的規則);如果不在103的任何一條規則之內(103屬於擴展規則,還需要比較其他項,可以有這種情況出現),則和源地址為any的規則進行比較;如果還是沒有規則拒絕或者允許該數據包,則返回缺省過濾結果;
2)若數據包來自129.8.0.0網絡,在索引中找不到匹配的項,則直接和源地址為any的規則進行比較;如果沒有規則拒絕或者允許該數據包,則返回缺省過濾結果;
2.3.5 包過濾在路由器中的實現
包過濾模塊不是作為一個進程在系統中運行,而是向IP層提供了一個函數接口。該函數的參數是pMBuf及pIp等,也就是能提供數據包信息的一些參數,如源地址、目的地址、源端口、目的端口等。
那麼什麼時候調用該函數?當路由器的IP層收到一個數據包時,該數據包有兩個去處:路由器本身或者由路由器轉發到某一個地方。對數據包進行檢查應該在這兩個地方進行。
在程序中,對於到路由器本身的數據包,在交給上層協議處理之前調用包過濾提供的函數;對於路由器需要轉發的數據包,在調用轉發函數之前調用包過濾提供的函數。
模塊實現時的重點在於:
將用戶在命令行上所敲的命令轉換成自己的一個數據結構;
為數據結構建立一個索引;
數據結構本身需要包括實現擴展訪問列表的所有內容,如源、目的地址與端口,源、目的通配位等等。標準的訪問列表可以採用和擴展訪問列表一致的數據結構,其中某些域無意義。
訪問列表數據結構:
typedef struct tagExtendAL
{
int listnumber; /* 訪問列表序號(1-199) */
int permission; /* 禁止(0)或允許(1) */
UCHAR protocol; /* 協議類型,如6代表tcp */
ULONG sourceaddr; /* 源地址,如129.102.2.21 */
ULONG sourcemask; /* 源地址通配位 */
ULONG destaddr; /* 源地址,如129.9.181.1 */
ULONG destmask; /* 目的地址通配位 */
struct PortRange portnum; /* 端口範圍,如ftp(21)—www(80) */
int blog; /* 是否做記錄 */
struct tagExtendAL *pNextAL; /* 指向下一個ExtendAL 數據結構 */
} ExtendAL; (Extended Access-List,擴展訪問列表)
標準訪問列表也採用此數據結構(listnumber{1-99})。其中的destaddr、destmask、portnum、blog域在此時無意義。ExtendAL數據結構中的portnum域的類型是struct PortRange,該結構定義如下:
struct PortRange
{
USHORT min;/* 小的端口號 */
USHORT max;/* 大的端口號 */
};
在PortRange結構中,當min為最大值65535時,代表的是「neq」這種情況,neq的那個值在max中。這樣就能表示不連續的範圍。如neq www,則min為65535,max為80,相當於表示範圍 {1,79} {81,65535}。
3 常用網絡攻擊方法
1)IP地址偽裝(IP Spoofing):攻擊方發出的數據包中的源地址改成受攻擊方的網絡地址,向該網絡發送數據包。
2)IP搶劫(IP Hijacking、IP Splicing):攻擊者中途截取一個已經連接成功的會話。這種攻擊通常發生在用戶身份被驗證後,這樣攻擊者看起來是一個合法用戶。對於這種攻擊的最主要的防範方法是對網絡層或會話層的傳輸的數據進行加密。
3)Smurf:攻擊方通過第三方網絡介以一偽造的地址將數據包傳入,大量的數據包使得網絡速度迅速下降直至崩潰。這種攻擊很難查出攻擊者。
4)Dumpster diving:通過搜尋公司的垃圾文件以獲得口令等敏感性數據。
5)War-dialing:通過不斷快速的枚舉法來獲得用戶帳號和口令。這是一非常古老的方法。但現在使用它的逐漸又多了起來。如對於採用密鑰長度為56位的DES加密的數據,可以在一個月之內被破譯(按照目前的計算速度),對於40位或48位的則只需幾個小時或幾天。DES是使用最廣泛的加密技術。
6)利用*作系統缺陷:利用系統中漏洞直接對系統進行攻擊。如「蠕蟲」病毒是利用finger命令中的bug,令緩衝區溢出,再將控制轉移到自己的程序中。還可以利用系統缺陷,繞過防火牆的檢驗,直接獲取數據。發現系統中的缺陷,應該立即採取對策,防止對系統的進一步危害。
7)拒絕服務denial of service:特徵是攻擊者通過各種方法使合法的用戶不能使用某種服務。
例如:
「淹沒」一個網絡,從而阻止合法的數據傳輸;
☆破壞兩台機器見間的連接,使用戶不能訪問該服務;
☆阻止特定的個人訪問某種資源;
☆中斷到某個特定系統或個人的服務;
一些拒絕服務攻擊被稱為「非對稱攻擊」,特點是攻擊方利用有限的資源去攻擊一個比較大的網絡。如攻擊者可能可以利用一個低速的modem,將一個大型的網絡搞垮。
拒絕服務攻擊的種類有多種,以下三種是比較基本的:
☆消耗有限的、不可更新的資源;
☆毀壞或者更改配置的信息;
☆對於網絡的物理組件的破壞或者更改;
這裡就第一種即「消耗有限的資源」做一些說明。
計算機和網絡需要有特定的資源來運行:網絡帶寬、內存和磁盤空間、cpu時間、數據結構、對其他網絡和計算機的訪問;並且還包括一些環境資源,如電、冷氣甚至還有水。
有這樣一種攻擊方法:攻擊者建立一個到目標機器的連接,但是用某種方法阻止將此連接的最終完成;這樣,在目標機器上就預留了一些用來完成連接所需的數據結構。結果一些合法的連接被拒絕了,因為目標機器正在等待完成那些已經完成一半的連接。應該注意到,這種攻擊並不消耗網絡帶寬,它只是消耗建立連接所需的核心的數據結構。這也意味著可以從利用撥號上網來攻擊一個非常快速的網絡。這是一個「非對稱攻擊」的好例子。
其他的方法有創建一個惡意的進程不斷的生成新的進程,消耗系統資源
1.1什麼是防火牆
在大廈構造中,防火牆被設計用來防止或從大廈的一部分傳播到另一部分。我們所涉及的防火牆服務於類似的目的:防止因特網的危險傳播到你的內部網絡。實際上,因特網防火牆不像一座現代化大廈中的防火牆,它更像中世紀城堡的護城河。
防火牆一方面阻止來自因特網的對受保護網絡的未授權或未驗證的訪問,另一方面允許內部網絡的用戶對因特網進行Web訪問或收發E-mail等。防火牆也可以作為一個訪問因特網的權限控制關口,如允許組織內的特定的人可以訪問因特網。現在的許多防火牆同時還具有一些其他特點,如進行身份鑒別,對信息進行安全(加密)處理等等。
防火牆不單用於對因特網的連接,也可以用來在組織內部保護大型機和重要的資源(數據)。對受保護數據的訪問都必須經過防火牆的過濾,即使該訪問是來自組織內部。
當外部網絡的用戶訪問網內資源時,要經過防火牆;而內部網絡的用戶訪問網外資源時,也會經過防火牆。這樣,防火牆起了一個「警衛」的作用,可以將需要禁止的數據包在這裡給丟掉。
1.2網絡的不安全因素
一個網絡系統的最主要的目的是實現「資源共享」,同時實現對數據的協作處理、信息的傳遞等等。網絡自身的這種開放性是引發網絡安全問題的最直接原因。
網絡的不安全因素有以下幾類:
1)環境:各類天災及事故都會對網絡造成損害,令網絡完全癱瘓或不能正常工作。
2)資源共享:包括硬件共享、軟件共享、數據共享。資源的相互共享為異地用戶提供了方便,同時也給非法用戶創造了條件。非法用戶可以通過終端來竊取信息、破壞信息。共享資源與使用者之間有相當一段距離,這也為竊取信息在時間和空間上提供了便利條件。
3)數據傳輸:信息需要通過數據通信來傳輸。在傳輸過程中,信息容易被竊聽、修改。
4)計算機病毒:借助網絡,病毒可以在短時間內感染大量的計算機,使網絡趨於癱瘓。如「蠕蟲」病毒及電子郵件「炸彈」。
5)網絡管理:對系統的管理措施不當,會造成設備的損壞、重要信息的人為洩露等等。
1.3防火牆的作用
我們將防火牆比作中世紀城堡的護城河,並且像護城河一樣,防火牆不是堅不可摧的。它不防備已經是裡面的人;如果與內部的防禦相配合,它工作的最好;同時,即使你把所有的船都收藏起來,人們有時仍然能設法橫渡。構築防火牆需要昂貴的花費和努力,而且它對內部人員的限制是令人厭煩的。
防火牆對網絡威脅進行極好的防範,但是,它們不是安全解決方案的全部。某些威脅是防火牆力所不及的。
1)防火牆不能防範惡意的知情者:防火牆可以禁止系統用戶通過網絡發送專有的信息。但是用戶可以將數據複製到磁盤或者紙上,放在公文包裡帶出去。如果侵襲者已經在防火牆的內部,防火牆實際上無能為力。
2)防火牆對不通過它的連接難有作為:防火牆能有效的控制穿過它的傳輸信息,但對於不穿過它的傳輸信息無能為力。
3)防火牆不能防備所有新的威脅:一個好的設計能防備新的威脅,但沒有防火牆能自動防禦所有新的威脅。人們不斷發現利用以前可信賴的服務的新的侵襲方法。
4)防火牆不能防備病毒:有太多種的病毒和太多種的方法可以使得病毒隱藏在數據中。
2 防火牆的實現
2.1防火牆的分類
一般把防火牆分為兩類:網絡層防火牆、應用層防火牆。網絡層的防火牆主要獲取數據包的包頭信息,如協議號、源地址、目的地址、目的端口等或者直接獲取包頭的一段數據。應用層的防火牆對於整個信息流進行分析。
實現防火牆時,共有以下幾種:
1 應用網關(application gateway):檢驗通過此網關的所有數據包中的應用層的數據;經常是由經過修改的應用程序組成運行在防火牆上。如FTP應用網關,對於連接的client端來說是一個FTP server,對於server端來說是一個FTP client。連接中傳輸的所有ftp數據包都必須經過此FTP應用網關。
2 電路級網關(circuit-level gateway):此電路指虛電路。在TCP或UDP發起(open)一個連接或電路之前,驗證該會話的可靠性。只有在握手被驗證為合法且握手完成之後,才允許數據包的傳輸。一個會話建立後,此會話的信息被寫入防火牆維護的有效連接表中。數據包只有在它所含的會話信息符合該有效連接表中的某一入口(entry)時,才被允許通過。會話結束時,該會話在表中的入口被刪掉。電路級網關只對連接在會話層進行驗證。一旦驗證通過,在該連接上可以運行任何一個應用程序。以FTP為例,電路層網關只在一個FTP會話開始時,在tcp層對此會話進行驗證。如果驗證通過,則所有的數據都可以通過此連接進行傳輸,直至會話結束。
3 包過濾(packet filter):對每個數據包按照用戶所定義的進行過濾,如比較數據包的源地址、目的地址是否符合規則等。包過濾不管會話的狀態,也不分析數據。如用戶規定允許端口是21或者大於等於1024的數據包通過,則只要端口符合該條件,數據包便可以通過此防火牆。如果配置的規則比較符合實際應用的話,在這一層能夠過濾掉很多有安全隱患的數據包。
4 代理(proxy):通常情況下指的是地址代理,一般位於一台代理服務器或路由器上。它的機制是將網內主機的IP地址和端口替換為服務器或路由器的IP地址和端口。舉例來說,一個公司內部網絡的地址是129.0.0.0網段,而公司對外的正式IP地址是202.138.160.2~202.38.160.6,則內部的主機129.9.10.100以WWW方式訪問網外的某一台服務器時,在通過代理服務器後,IP地址和端口可能為202.138.160.2:6080。
在代理服務器中維護著一張地址對應表。當外部網絡的WWW服務器返回結果時,代理服務器會將此IP地址及端口轉化為內部網絡的IP地址和端口80。使用代理服務器可以讓所有的外部網絡的主機與內部網絡之間的訪問都必須通過它來實現。這樣可以控制對內部網絡帶有重要資源的機器的訪問。
路由器中的防火牆主要是指包過濾加地址轉換。
2.2包過濾
包過濾應用在路由器中,就為路由器增加了對數據包的過濾功能。一般情況下,指的是對IP數據包的過濾。對路由器需要轉發的數據包,先獲取包頭信息,包括IP層所承載的上層協議的協議號,數據包的源地址、目的地址、源端口、目的端口等,然後和設定的規則進行比較,根據比較的結果對數據包進行轉發或者丟棄。
包過濾在IP數據包中所取的用來判斷的元素如圖3所示(圖中IP所承載的上層協議為TCP):
大多數數據包過濾系統在數據本身上不做任何事:它們不做基於內容的決定。有了數據包過濾,你可以說:
不讓任何人從外界使用Telnet登錄。
或者:
讓每個人經由SMTP向我們發送電子郵件。
或者是:
那機器經由NNTP能把新聞發給我們,但是沒有其他機器能這樣做。
然而,你不可以這樣說:
這個用戶能從外部遠程登錄,但是其它用戶不能這樣做。
因為「用戶」 不是數據包過濾系統所能辨認的。同時,你也不可以說:
你能發送這些文件而不是那些文件。
因為「文件」也不是數據包過濾系統所能辨認的
2.3訪問列表
為了過濾數據包,需要配置一些規則,規定什麼樣的數據包可以通過,什麼樣的不能通過。IP層所能獲取的通用信息如上圖。則配置的規則應該對這些參數作出規定。
一般採用稱為訪問列表的技術用來配置過濾規則。訪問列表分為兩類:標準訪問列表、擴展訪問列表。
2.3.1標準訪問列表
標準訪問列表的格式如下:
access-list listnumber permit│deny address {wildcard-mask}
此格式表示:允許或拒絕來自指定網絡的數據包,該網絡由IP地址(address)和地址通配比較位(wildcard-mask)指定。
通配比較位用法類似於子網掩碼而寫法不相同。IP地址與地址通配位的關係語法上規定如下:在通配位中相應位為1的地址中的位在比較中被忽略。地址與通配位都是32位的長整形數(unsigned long)。如通配位是0x00ffffff(0.255.255.255),則比較時,高8位需要比較,其他的都被忽略。又如IP地址是129.102.1.1,通配位是0.0.255.255,則地址與通配位合在一起表示129.102.0.0網段。若要表示202.38.160.0網段,地址位寫成202.38.160.X(X是0~255之間的任意一個數字),通配位為0.0.0.255。在程序中,用異或等位*作高效率的實現這類比較。
標準訪問列表的例子:
1) access-list 4 deny 202.38.160.0 0.0.255.255
表示該規則序號為4,禁止來自202.38.0.0網絡的主機的訪問。
2) access-list 4 permit 202.38.160.1 0.0.0.255
表示該規則序號為4,允許來自202.38.160.0網絡的主機的訪問。與2)規則一起表示禁止一個大網段上的主機但允許其中的一小部分主機的訪問。 2.3.2擴展訪問列表:
擴展訪問列表的格式如下:
access-list listnumber permit│deny protocol source source-wildcard-mask destination destination-wildcard-mask {operator operand} {log}
此格式表示允許或拒絕滿足如下條件的數據包:
帶有指定的協議(portocol),如tcp、udp等;
數據包來自由source及source-wildcard-mask指定的網絡;
數據包去往由destination及destination-wildcard-mask指定的網絡;
{可選} 該數據包的目的端口在由operator operand規定的端口範圍之內;
並按要求做或不做日誌。
擴展訪問列表的例子:
1) 100 deny tcp 129.9.0.0 0.0.255.255 202.38.160.0 0.0.0.255 eq www log
表示該規則序號為100,禁止129.9.0.0網段內的主機建立與202.38.160.0網段內的主機的www端口(80)的連接,並對違反此規則的事件作日誌。
2) 100 permit tcp 129.9.8.0 0.0.0.255 202.38.160.0 0.0.0.255 eq www
表示該規則序號為100,允許129.9.8.0網段內的主機建立與202.38.160.0網段內的主機的WWW端口(80)的連接。
3) 101 deny tcp any 202.38.160.1 0.0.0.0 eq telnet
表示該規則序號為101,禁止一切主機建立與IP地址為202.38.160.1的主機的telnet(23)的連接。
4) 102 deny udp 129.9.8.0 0.0.0.255 202.38.160.0 0.0.0.255 gt 128
表示該規則序號為102,禁止129.9.8.0網段內的主機建立與202.38.160.0網段內的主機的端口號大於128的UDP(用戶數據報協議)連接。
2.3.3刪除訪問列表:
no access-list listnumber {subitem}
表示刪除指定的listnumber的訪問列表,或者刪除其中的一項。
2.3.4建立訪問列表的索引
建立索引的目的是:進行快速定位;即對於需要過濾的數據包,快速的確定需要和哪些規則進行比較。
索引項根據網段的大小(unsigned long類型,帶地址通配位如0.0.255.255)進行排列,比較時採用二分法進行比較。
索引項中的一個域指向一個指針鏈。如圖中的10.0.0.0索引項指向規則2,規則2再指向規則102,表示一個源地址為10.0.0.0網段的數據包,需要和規則為2和102的進行比較。先比較規則為2的標準規則(標準規則判斷的範圍比較大)。
規定如下:
比較的時候,先比較規則序號小的(在索引指向的域中可以做到這一點)。如先比較2,再比較4,再比較103,再比較104。倘若用戶將要判定的源地址屬於同一個網段的規則寫成了好幾個不同規則序號的規則,那麼過濾的效率降低也是沒有辦法的。一般較正常的情況下,一個索引項後跟一個或兩個規則序號。如圖1中所示。如果在索引中,沒有那個網段的話,需要與源地址為any的規則進行比較。
• 不同序號的規則沒有時間上的先後順序。例如:先配置103,再配102,如果這兩個序號的規則序列中都有判斷129.9.0.0網絡的規則,則過來一個129.9.0.0網絡的包,先和102的比較,再和103的比較。(和上面一點有些重合)
同一序號的規則的配置也沒有時間上的先後順序。在排列時,深度最大的那個排在前面。
這一點需要加以特別說明,也是程序中應該注意的地方。例如:先配置 2 permit 129.102.1.1 0.0.0.0; 再配置一條同樣序號的 2 deny 129.102.0.0 0.0.255.255;前一條直接指定了主機,它的深度最大,還是排在前面。比較時,129.102.0.0網絡的數據包會在序號為4的規則中搜索。若是129.102.1.1,則被前一條滿足,就不再往後比較了。這是因為規則是按照深度的大小來排的。
可以看出,深度是指通配位而言的。一般來說,深度越大,通配位越小。如 0.0.0.0比較時的深度要比0.0.255.255的深度大。 此觀點來自於:一個數據包只被一組規則中的某一個允許或拒絕,也就是最終起作用的是一條規則(該規則的深度最大)。
如果通配位不規則(如0.0.123.234),規則的組織仍是按照通配位的大小。這是基於這樣的考慮:
1)這種寫法非常的少;
2)倘若真的寫出了這樣的規則,一般不太明白這樣的通配位與地址相結合表示什麼樣的地址範圍;
3)可能運用的地方應該是屬於圈定一小部分IP地址,如0.0.0.128,它的深度比較大,比0.0.0.255要大。滿足0.0.0.255的不一定滿足0.0.0.128所指的。
規定規則以通配位大小進行排列,通配位小的在前面,可以減少很多麻煩,也方便了程序的編寫。
根據深度優先的排列後,在命令行上配置的規則就沒有先後順序之分了。
如果源地址是any,則將此規則放在數組下標為199的那一項上。規則間也以序號大小排列。
將源地址為any的規則組織在一起是基於如下考慮:
1)索引的每一個值都屬於any,沒有必要將這些規則所在的access-list的序號加在每一個索引所指的內容中去;否則的話,每一個數據包都需要和該序號的所有規則進行比較;
2)any的情況容易引發安全漏洞。允許any代表允許來自世界各地的訪問。一般不建議配置源地址是any的規則(deny any是個例外)。
3)配置any的情況,大部分是因為需要配置一個對其他情況的一個缺省處理。如配置access-list 1 deny any表示其他規則不能判定的數據包都會被拒絕掉。
4)一般源地址為any的規則數目比較少,可以組織在一起。
用戶配置的規則和現有的規則有衝突的情況,如用戶已經配了一條1 deny any;現在又配了一條2 permit any;這兩條命令的比較範圍是重疊的,實際比較時序號為2的起作用(2把1的結論給推翻了)。序號為1的是無效的,降低了效率。如果和同樣序號的規則發生衝突,如上面的2是1,則將後一條放在排在前一條的後面。
可以看出,不同深度的規則在配置時是沒有衝突的。
一個數據包的過濾經過如下,以圖1中的索引為例,
1)若過來一個129.9.0.0網絡的數據包,在索引中找到第二個是匹配的,該數據包將和序號為103的規則以深度優先進行比較;如果被某一個規則拒絕或者允許,則返回該結果(不再比較源地址為any的規則);如果不在103的任何一條規則之內(103屬於擴展規則,還需要比較其他項,可以有這種情況出現),則和源地址為any的規則進行比較;如果還是沒有規則拒絕或者允許該數據包,則返回缺省過濾結果;
2)若數據包來自129.8.0.0網絡,在索引中找不到匹配的項,則直接和源地址為any的規則進行比較;如果沒有規則拒絕或者允許該數據包,則返回缺省過濾結果;
2.3.5 包過濾在路由器中的實現
包過濾模塊不是作為一個進程在系統中運行,而是向IP層提供了一個函數接口。該函數的參數是pMBuf及pIp等,也就是能提供數據包信息的一些參數,如源地址、目的地址、源端口、目的端口等。
那麼什麼時候調用該函數?當路由器的IP層收到一個數據包時,該數據包有兩個去處:路由器本身或者由路由器轉發到某一個地方。對數據包進行檢查應該在這兩個地方進行。
在程序中,對於到路由器本身的數據包,在交給上層協議處理之前調用包過濾提供的函數;對於路由器需要轉發的數據包,在調用轉發函數之前調用包過濾提供的函數。
模塊實現時的重點在於:
將用戶在命令行上所敲的命令轉換成自己的一個數據結構;
為數據結構建立一個索引;
數據結構本身需要包括實現擴展訪問列表的所有內容,如源、目的地址與端口,源、目的通配位等等。標準的訪問列表可以採用和擴展訪問列表一致的數據結構,其中某些域無意義。
訪問列表數據結構:
typedef struct tagExtendAL
{
int listnumber; /* 訪問列表序號(1-199) */
int permission; /* 禁止(0)或允許(1) */
UCHAR protocol; /* 協議類型,如6代表tcp */
ULONG sourceaddr; /* 源地址,如129.102.2.21 */
ULONG sourcemask; /* 源地址通配位 */
ULONG destaddr; /* 源地址,如129.9.181.1 */
ULONG destmask; /* 目的地址通配位 */
struct PortRange portnum; /* 端口範圍,如ftp(21)—www(80) */
int blog; /* 是否做記錄 */
struct tagExtendAL *pNextAL; /* 指向下一個ExtendAL 數據結構 */
} ExtendAL; (Extended Access-List,擴展訪問列表)
標準訪問列表也採用此數據結構(listnumber{1-99})。其中的destaddr、destmask、portnum、blog域在此時無意義。ExtendAL數據結構中的portnum域的類型是struct PortRange,該結構定義如下:
struct PortRange
{
USHORT min;/* 小的端口號 */
USHORT max;/* 大的端口號 */
};
在PortRange結構中,當min為最大值65535時,代表的是「neq」這種情況,neq的那個值在max中。這樣就能表示不連續的範圍。如neq www,則min為65535,max為80,相當於表示範圍 {1,79} {81,65535}。
3 常用網絡攻擊方法
1)IP地址偽裝(IP Spoofing):攻擊方發出的數據包中的源地址改成受攻擊方的網絡地址,向該網絡發送數據包。
2)IP搶劫(IP Hijacking、IP Splicing):攻擊者中途截取一個已經連接成功的會話。這種攻擊通常發生在用戶身份被驗證後,這樣攻擊者看起來是一個合法用戶。對於這種攻擊的最主要的防範方法是對網絡層或會話層的傳輸的數據進行加密。
3)Smurf:攻擊方通過第三方網絡介以一偽造的地址將數據包傳入,大量的數據包使得網絡速度迅速下降直至崩潰。這種攻擊很難查出攻擊者。
4)Dumpster diving:通過搜尋公司的垃圾文件以獲得口令等敏感性數據。
5)War-dialing:通過不斷快速的枚舉法來獲得用戶帳號和口令。這是一非常古老的方法。但現在使用它的逐漸又多了起來。如對於採用密鑰長度為56位的DES加密的數據,可以在一個月之內被破譯(按照目前的計算速度),對於40位或48位的則只需幾個小時或幾天。DES是使用最廣泛的加密技術。
6)利用*作系統缺陷:利用系統中漏洞直接對系統進行攻擊。如「蠕蟲」病毒是利用finger命令中的bug,令緩衝區溢出,再將控制轉移到自己的程序中。還可以利用系統缺陷,繞過防火牆的檢驗,直接獲取數據。發現系統中的缺陷,應該立即採取對策,防止對系統的進一步危害。
7)拒絕服務denial of service:特徵是攻擊者通過各種方法使合法的用戶不能使用某種服務。
例如:
「淹沒」一個網絡,從而阻止合法的數據傳輸;
☆破壞兩台機器見間的連接,使用戶不能訪問該服務;
☆阻止特定的個人訪問某種資源;
☆中斷到某個特定系統或個人的服務;
一些拒絕服務攻擊被稱為「非對稱攻擊」,特點是攻擊方利用有限的資源去攻擊一個比較大的網絡。如攻擊者可能可以利用一個低速的modem,將一個大型的網絡搞垮。
拒絕服務攻擊的種類有多種,以下三種是比較基本的:
☆消耗有限的、不可更新的資源;
☆毀壞或者更改配置的信息;
☆對於網絡的物理組件的破壞或者更改;
這裡就第一種即「消耗有限的資源」做一些說明。
計算機和網絡需要有特定的資源來運行:網絡帶寬、內存和磁盤空間、cpu時間、數據結構、對其他網絡和計算機的訪問;並且還包括一些環境資源,如電、冷氣甚至還有水。
有這樣一種攻擊方法:攻擊者建立一個到目標機器的連接,但是用某種方法阻止將此連接的最終完成;這樣,在目標機器上就預留了一些用來完成連接所需的數據結構。結果一些合法的連接被拒絕了,因為目標機器正在等待完成那些已經完成一半的連接。應該注意到,這種攻擊並不消耗網絡帶寬,它只是消耗建立連接所需的核心的數據結構。這也意味著可以從利用撥號上網來攻擊一個非常快速的網絡。這是一個「非對稱攻擊」的好例子。
其他的方法有創建一個惡意的進程不斷的生成新的進程,消耗系統資源
全站熱搜
留言列表