FreeSWAN+結(jié)構(gòu)框架教學(xué)文稿_第1頁
FreeSWAN+結(jié)構(gòu)框架教學(xué)文稿_第2頁
FreeSWAN+結(jié)構(gòu)框架教學(xué)文稿_第3頁
FreeSWAN+結(jié)構(gòu)框架教學(xué)文稿_第4頁
FreeSWAN+結(jié)構(gòu)框架教學(xué)文稿_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。FreeSWAN+結(jié)構(gòu)框架-1實現(xiàn)總體思想通過改造Linux的IP協(xié)議棧源代碼,使得IP實現(xiàn)與IPSec實現(xiàn)完全整合。該實現(xiàn)按功能分,可以分為以下幾個功能模塊模塊:安全策略庫,安全關(guān)聯(lián)庫,AH協(xié)議處理,ESP協(xié)議處理,算法(加密卡的實現(xiàn)),日志、統(tǒng)計、配置與審計,面向應(yīng)用的接口。按處理過程分,還可以分為以下幾個處理模塊:進入IP層預(yù)處理、IPSec進入策略處理、路由、本機對IP包處理、IPSec進入處理、轉(zhuǎn)發(fā)處理、本地IP包處理、IPSec外出處理、發(fā)送處理。Ipsec協(xié)議實現(xiàn)與IP實現(xiàn)的整合思想:利用

2、Netfilter的HOOK機制,在接受IP包和發(fā)送IP包的過程中,在適當(dāng)?shù)奶幚砦恢谜{(diào)用相關(guān)的ipsec處理模塊。1.1Netfilter的HOOK機制的介紹圖1Netfilter是linux2.4內(nèi)核實現(xiàn)數(shù)據(jù)包過濾/數(shù)據(jù)包處理/NAT等功能的抽象、通用化的框架。Netfilter框架包含以下三部分:1、為每種網(wǎng)絡(luò)協(xié)議(IPv4、IPv6等)定義一套鉤子函數(shù)(IPv4定義了5個鉤子函數(shù)),這些鉤子函數(shù)在數(shù)據(jù)報流過協(xié)議棧的幾個關(guān)鍵點被調(diào)用。在這幾個點中,協(xié)議棧將把數(shù)據(jù)報及鉤子函數(shù)標(biāo)號作為參數(shù)調(diào)用netfilter框架。2、內(nèi)核的任何模塊可以對每種協(xié)議的一個或多個鉤子進行注冊,實現(xiàn)掛接,這樣當(dāng)某個

3、數(shù)據(jù)包被傳遞給netfilter框架時,內(nèi)核能檢測是否有任何模塊對該協(xié)議和鉤子函數(shù)進行了注冊。若注冊了,則調(diào)用該模塊的注冊時使用的回調(diào)函數(shù),這樣這些模塊就有機會檢查(可能還會修改)該數(shù)據(jù)包、丟棄該數(shù)據(jù)包及指示netfilter將該數(shù)據(jù)包傳入用戶空間的隊列。3、那些排隊的數(shù)據(jù)包是被傳遞給用戶空間的異步地進行處理。一個用戶進程能檢查數(shù)據(jù)包,修改數(shù)據(jù)包,甚至可以重新將該數(shù)據(jù)包通過離開內(nèi)核的同一個鉤子函數(shù)中注入到內(nèi)核中。IP層的五個HOOK點的位置如圖1所示:(ipv4)1.NF_IP_PRE_ROUTING:剛剛進入網(wǎng)絡(luò)層的數(shù)據(jù)包通過此點(剛剛進行完版本號,校驗和等檢測),源地址轉(zhuǎn)換在此點進行;2.

4、NF_IP_LOCAL_IN:經(jīng)路由查找后,送往本機的通過此檢查點,INPUT包過濾在此點進行;3.NF_IP_FORWARD:要轉(zhuǎn)發(fā)的包通過此檢測點,FORWORD包過濾在此點進行;4.NF_IP_POST_ROUTING:所有馬上便要通過網(wǎng)絡(luò)設(shè)備出去的包通過此檢測點,內(nèi)置的目的地址轉(zhuǎn)換功能(包括地址偽裝)在此點進行;5.NF_IP_LOCAL_OUT:本機進程發(fā)出的包通過此檢測點,OUTPUT包過濾在此點進行。1.2處理模塊之間的關(guān)系IPSec安全網(wǎng)關(guān)對IP報文的接收、轉(zhuǎn)發(fā)和發(fā)送處理的整個過程如圖2。當(dāng)安全網(wǎng)關(guān)的網(wǎng)卡接收的數(shù)據(jù)報時,通過中斷觸發(fā)內(nèi)核的中斷處理程序,將網(wǎng)卡接收的數(shù)據(jù)報傳送到內(nèi)

5、核空間,然后再通過IP層預(yù)處理程序?qū)?shù)據(jù)報轉(zhuǎn)換為IP包。此時,我們將利用內(nèi)核的Netfilter機制提供的HOOK點PRE_ROUTING,將IP包傳送到IPSec進入策略處理模塊。該模塊將決定哪些包可以進入安全網(wǎng)關(guān),哪些包需要丟棄。對于允許進入網(wǎng)關(guān)的IP包,將送回到路由處理模塊。路由處理根據(jù)IP頭決定IP包是發(fā)送到本機還是繼續(xù)轉(zhuǎn)發(fā)。對于發(fā)送到本機的IP包,首先經(jīng)過內(nèi)核對IP包的處理,如:分片重組、選項處理等等。然后利用HOOK點LOCAL_IN,將重組的IP包傳送到IPSec進入處理模塊。IPSec進入處理模塊將對IPSec包和非IPSec包進行區(qū)分,對于發(fā)往本機的非IPSec包將直接傳送到

6、傳輸層處理模塊;對于IPSec包將進行認(rèn)證或解密等IPSec處理,并剝?nèi)PSec頭。處理完后,將重新組裝成IP包發(fā)回到IP層預(yù)處理模塊。這樣該IP包將重新通過路由來決定發(fā)往何處。對于轉(zhuǎn)發(fā)的IP包,首先進行轉(zhuǎn)發(fā)處理,如:決定下一跳、減少TTL、對某些特殊情況發(fā)送ICMP包。然后,利用HOOK點IP_FORWARD,將IP包傳送到外出IPSec外出處理模塊。IPSec處理將根據(jù)策略區(qū)分IPSec包、非IPSec包以及包發(fā)往何處。對于IPSec包將丟棄。對于發(fā)往內(nèi)部網(wǎng)的非IPSec包,直接將包傳送給發(fā)送處理模塊,發(fā)往內(nèi)部網(wǎng)。對于發(fā)往外部網(wǎng)的IP包,將根據(jù)策略進行認(rèn)證或加密等IPSec處理,最后將處

7、理過的IP包傳送到發(fā)送處理模塊。對于從安全網(wǎng)關(guān)傳輸層發(fā)送的報文,首先進行本地的IP包處理,構(gòu)建IP包。然后對IP包進行路由,決定IP包的出口。路由之后將利用HOOK點LOCAL_OUTPUT,將IP包傳送到IPSec外出處理模塊。IPSec外出處理將根據(jù)策略決定那些包需要進行IPSec處理。對于不需要處理的IP包,直接傳送到發(fā)送處理模塊。對于需要進行IPSec處理的IP包,將根據(jù)策略進行認(rèn)證或加密等IPSec處理,然后將IPSec包重新發(fā)回到路由處理模塊,決定IPSec包將發(fā)往何處。當(dāng)再次經(jīng)過HOOK點時,IPSec外出處理將通過策略將處理過的IP包直接傳送到發(fā)送處理模塊。發(fā)送處理模塊將進行分

8、片等處理,最后將包發(fā)送到網(wǎng)卡。圖21.3功能模塊之間的關(guān)系各功能模塊之間的關(guān)系如圖3所示。安全策略庫存放了由用戶或系統(tǒng)管理員所制定的策略,策略將決定通訊的雙方是否采用IPSec處理,以及決定采用何種IPSec協(xié)議、模式、算法和嵌套需求。安全關(guān)聯(lián)庫由一系列安全關(guān)聯(lián)項組成。安全關(guān)聯(lián)是兩個通訊實體經(jīng)過協(xié)商建立起來的一種協(xié)定。它們決定了用來保護數(shù)據(jù)包安全所需的各種參數(shù):序號計數(shù)器;抗重播窗口;AH驗證算法及其密鑰;ESP加密、認(rèn)證算法、密鑰;安全關(guān)聯(lián)的生存期;IPsec協(xié)議模式。算法庫存放了多種可選的認(rèn)證和加密算法,在處理時將通過安全關(guān)聯(lián)中的算法項來指明所需要使用的算法。面向應(yīng)用的接口提供了管理安全策

9、略庫,以及配置網(wǎng)關(guān),處理日志、統(tǒng)計、審計信息的接口。用戶或系統(tǒng)管理員可通過配置服務(wù)器關(guān)聯(lián)全策略庫,還可以進行手工注入安全關(guān)聯(lián)或者啟動IKE動態(tài)協(xié)商安全關(guān)聯(lián),以及對日志、統(tǒng)計、配置、審計信息的提取和處理。圖32各個模塊的實現(xiàn)2.1處理模塊的實現(xiàn)2.1.1Netfilter鉤子函數(shù)2.1.1.1實現(xiàn)思想利用Linux提供的Netfilter框架,并在Netfilter框架提供的HOOK點上注冊并實現(xiàn)IPSec相關(guān)處理函數(shù),使得IPSec處理能加入到IP包接收或發(fā)送處理過程的適當(dāng)位置。2.1.1.2實現(xiàn)細(xì)節(jié)Linux內(nèi)核的Netfilter框架在ipv4中提供了5個HOOK點(圖1),在每個HOOK

10、點上都可以通過一個注冊函數(shù)nf_register_hook(structnf_hook_ops*reg)將自己實現(xiàn)的處理函數(shù)掛接到HOOK點上。這樣在每一次HOOK點被激活時,都將查詢并執(zhí)行該HOOK點所注冊的處理函數(shù)。然后在處理結(jié)束時返回相關(guān)的信息來決定被處理的包是丟棄、拒絕,還是繼續(xù)進行HOOK點后面的處理。因此我們的工作便是生成一個structnf_hook_ops結(jié)構(gòu)的實例(結(jié)構(gòu)如下):structnf_hook_opsstructlist_headlist;nf_hookfn*hook;intpf;inthooknum;intpriority;并將該結(jié)構(gòu)中的一個相關(guān)處理函數(shù)nf_ho

11、okfn(定義如下)實現(xiàn)為我們所需的相關(guān)IPSec處理函數(shù):unsignedintnf_hookfn(unsignedinthooknum,structsk_buff*skb,conststructnet_device*in,conststructnet_device*out,int(*okfn)(structsk_buff*);并用nf_register_hook將該實例注冊到由hooknum所指定的HOOK點上。這樣,當(dāng)hooknum指定的HOOK點被激活時(如在ip_rcv中的:NF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv_f

12、inish)),將根據(jù)priority所指定的優(yōu)先級,依次執(zhí)行在該HOOK點注冊的函數(shù),因此我們所實現(xiàn)的相關(guān)IPSec處理函數(shù)將得到執(zhí)行。Netfilter還提供了一系列返回信息(如下):NF_ACCEPT繼續(xù)正常傳輸數(shù)據(jù)報NF_DROP丟棄該數(shù)據(jù)報,不再傳輸NF_STOLEN模塊接管該數(shù)據(jù)報,不要繼續(xù)傳輸該數(shù)據(jù)報NF_QUEUE對該數(shù)據(jù)報進行排隊(通常用于將數(shù)據(jù)報給用戶空間的進程進行處理)NF_REPEAT再次調(diào)用該鉤子函數(shù)在處理結(jié)束后將通過返回信息來決定被處理的數(shù)據(jù)報在HOOK點之后應(yīng)該怎樣處理。2.1.2初始化IPSec的實現(xiàn)2.1.2.1注冊HOOK點2.1.3進入IP包預(yù)處理2.1.

13、3.1實現(xiàn)思想從網(wǎng)卡傳來的數(shù)據(jù)報在進入IP層處理之前先進行一些檢查,并在此時激活第一個HOOK點:NF_IP_PRE_ROUTING,對進入本機的包進行進入前預(yù)處理。我們實現(xiàn)的IPSec進入策略處理模塊也在此時通過HOOK點被調(diào)用執(zhí)行。2.1.3.2實現(xiàn)細(xì)節(jié)該模塊首先對傳入的IP包進行必要的檢查:1、通過包類型標(biāo)志pkt_type檢查IP包是否是其他機器(PACKET_OTHERHOST)的,如果是就丟棄。2、檢查IP包的長度是否合法。3、檢查IP版本。4、檢查校樣和。最后激活HOOK點:NF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv

14、_finish)。然后將依次調(diào)用在該HOOK點上注冊處理函數(shù),其中包括我們實現(xiàn)的IPSec進入策略處理模塊。2.1.4IPSec進入策略處理2.1.4.1實現(xiàn)思想該模塊將根據(jù)IP報文的相關(guān)信息構(gòu)造選擇符。然后通過選擇符查詢進入安全策略庫,找到第一個匹配項(策略)。再根據(jù)策略對IP包進行策略檢查和處理:1、對于外部網(wǎng)的進入包drop:(增強型包過濾)不允許某些外部網(wǎng)的包進入;不允許某些外部網(wǎng)的不加密包進入;不允許某些網(wǎng)應(yīng)該加密卻未加密的包進入;不允許某些外部網(wǎng)的加密包進入。reject:類似于drop,不過要對ICMP包進行特殊處理。accept:對某些外部網(wǎng)的不加密包或加密包允許通過,對已經(jīng)經(jīng)

15、過IPSec處理的包(用于IPSec嵌套的情況)允許通過。2、對于內(nèi)部網(wǎng)的進入包drop:對某些內(nèi)部網(wǎng)機器的IP包不允許通過accept:允許內(nèi)部網(wǎng)的IP包通過最后對于通過的包,傳回到ip_rcv_finish繼續(xù)處理2.1.4.2實現(xiàn)細(xì)節(jié)1、從IP包中提取源目的IP地址、源目的端口、下一層協(xié)議等信息。2、根據(jù)這些提取的信息查詢進入安全策略庫,找到匹配的策略項。3、根據(jù)策略項所指定的策略進行處理:丟棄:返回NF_DROP,Netfilter機制將丟棄該數(shù)據(jù)包,不再傳輸。并將該事件記錄到日志中。拒絕:返回NF_STOLEN,Netfilter機制將接管該數(shù)據(jù)包,不再繼續(xù)傳輸。并將該事件記錄到日志

16、中。接收:返回NF_ACCEPT,Netfilter機制將正常傳輸該數(shù)據(jù)包:將該包傳送給ip_rcv_finish。其中對于IPSec包需要作上標(biāo)記(利用標(biāo)記變量nmask),表明該包需要在以后進行IPSec處理。2.1.5路由2.1.5.1實現(xiàn)思想根據(jù)IP包的源地址、目的地址和服務(wù)類型(tos)等信息查找路由表,找到該IP包對應(yīng)的路由項,并記錄該項。在路由項中指出了IP包接下來該如何處理:對于本地IP包,將交給本機的IP處理模塊ip_local_deliver;對于非本機接收包,適合轉(zhuǎn)發(fā)的將交給轉(zhuǎn)發(fā)處理模塊ip_forward,其他情況將作特殊處理。2.1.5.2實現(xiàn)細(xì)節(jié)1、將從IP包中提取

17、的源地址、目的地址和服務(wù)類型值,通過適當(dāng)?shù)纳⒘兴惴óa(chǎn)生散列值。2、根據(jù)散列值在路由緩存散列表中查找散列位置3、進一步根據(jù)源地址、目的地址、輸入接口、服務(wù)類型在散列鏈中找到正確的路由項。4、根據(jù)路由項中指定的輸入處理函數(shù),調(diào)用適當(dāng)?shù)暮瘮?shù):對于本地IP包調(diào)用ip_local_deliver;對于其他IP包調(diào)用ip_forward。2.1.6本機對IP包處理2.1.6.1實現(xiàn)思想對經(jīng)過路由傳送來的IP包,首先檢查是否存在分片。如果存在分片,必須緩存IP分片包。等所有的分片到齊時,進行分片重組處理,將分片合成完整的IP報文。然后激活HOOK點:NF_IP_LOCAL_IN,對進入IP包進行相關(guān)處理。我

18、們實現(xiàn)的IPSec進入處理模塊也在此時調(diào)用。2.1.6.2實現(xiàn)細(xì)節(jié)1、檢查IP包的3位標(biāo)志字段,當(dāng)IP包片偏量(frag_off)第14位(IP_MF)為1時,表示該IP包有后繼分片。這時將進行分片重組處理ip_defrag。2、分片重組處理:根據(jù)分片包的16位標(biāo)識、源地址、目的地址、協(xié)議字段計算分片包的散列值。根據(jù)散列值,定位該包在分片鏈中的位置。如果有分片鏈,說明已有其他分片到達(dá)。將該分片插入到對應(yīng)的分片隊列中。檢查該分片是否是最后一個分片,分片是否都到齊了。如果都滿足,則將分片重組為一個完整的IP包。返回新的IP包。3、激活HOOK點:NF_HOOK(PF_INET,NF_IP_LOCA

19、L_IN,skb,skb-dev,NULL,ip_local_deliver_finish)。然后將依次調(diào)用在該HOOK點上注冊處理函數(shù),其中包括我們實現(xiàn)的IPSec進入處理模塊。2.1.7IPSec進入處理2.1.7.1實現(xiàn)思想首先檢查nmask標(biāo)記,判斷該IP包是否是一個IPSec包。如果不是,則將利用返回值NF_ACCEPT,繼續(xù)正常傳輸該數(shù)據(jù)報到ip_local_deliver_finish。如果是,則將進行IPSec進入處理,并在處理完后調(diào)用ip_rcv將IP包傳送回進入IP包預(yù)處理模塊,此時應(yīng)該返回NF_DROP,使該包不在向上傳輸。IPSec進入處理首先將從IP包中提取目的地址、

20、下一協(xié)議、安全參數(shù)索引(spi)信息,并根據(jù)這些信息查找安全關(guān)聯(lián)庫(SAD),找到對應(yīng)的唯一的一個SA。然后根據(jù)找到的SA進行:SA狀態(tài)處理、SA生存期處理、重播窗口處理、模式處理、相關(guān)IPSec協(xié)議處理(AH或ESP)。當(dāng)處理完一個SA后,必須要標(biāo)記處理過的SA(用于后期的進入策略匹配),并檢查是否存在SA串(即多個SA)。如果有,則循環(huán)處理SA串,直到遇到傳輸層協(xié)議頭或者非本機的IP頭(表明SA串上的所有SA都處理完畢)。最后根據(jù)處理過的IP包的相關(guān)信息查找安全策略庫(SPD),找到該IP包所對應(yīng)的進入策略(該策略應(yīng)該與發(fā)送端的外出策略是相同的)。然后檢查該策略所指定的SA串是否與處理過并

21、標(biāo)記的SA串相同,從而判斷是否進行了所要求的IPSec處理。如果不相同,則丟棄該IP包,并進行日志記錄。2.1.7.2實現(xiàn)細(xì)節(jié)1、檢查nmask標(biāo)記(該標(biāo)記在進入策略處理時被設(shè)置上)。如果不是IPSec包,返回NF_ACCEPT;如果是,繼續(xù)進行IPSec進入處理。2、提取IP頭中的目的地址、下一協(xié)議,通過下一協(xié)議字段信息,提取IPSec頭中的安全參數(shù)索引(spi)信息。3、根據(jù)三元組查找安全關(guān)聯(lián)庫(SAD)。如果沒找到對應(yīng)的SA(或SA串),則將該IP包丟棄,并記錄日志信息;如果找到了對應(yīng)的SA(或SA串),則將根據(jù)SA(或SA串)對IPSec包進行下面的處理。4、檢查SA的狀態(tài):對于幼稚(

22、SADB_SASTATE_LARVAL)和死亡(SADB_SASTATE_DEAD)狀態(tài)的包將丟棄,并記錄日志信息5、檢查SA的生存期。生存期分為以下幾種:字節(jié)數(shù)、包數(shù)、使用時間、增加時間,并且對于每一種生存期還有軟硬之分。如果是硬生存期過期了,則將激活I(lǐng)KE模塊動態(tài)協(xié)商一個新的SA,將過期的SA(或SA束)刪除,并將IP包丟棄,并記錄日志信息;如果是軟生存期過期了,同樣要激活I(lǐng)KE模塊動態(tài)協(xié)商一個新的SA,但此時并不刪除SA(或SA束),而是將SA的狀態(tài)標(biāo)記為正在死亡(SADB_SASTATE_DYING)。而且不丟棄該數(shù)據(jù)包,繼續(xù)進行處理。6、檢查重播窗口:檢查時將判斷到達(dá)的IPSec包的

23、序列號是否小于該網(wǎng)關(guān)所記錄的處理過的最大IPSec包的序列號。如果小,則再檢查序號的差值是否超過了窗口的大小。如果沒有超過,則檢查窗口,判斷該IPSec包是否已經(jīng)到達(dá)過,如果已經(jīng)到達(dá)過,則將該包丟棄;如果沒到達(dá),則接收。如果到達(dá)的IPSec包的序列號大于處理過的最大序列號,則接收,并繼續(xù)處理。7、根據(jù)SA指定的IPSec協(xié)議(AH或ESP)、算法和密鑰進行認(rèn)證或(和)解密處理。8、更新重播窗口:此時檢查如果被處理的IPSec包的序列號大于網(wǎng)關(guān)處理過的最大序列號,并且序號的差值小于窗口大小,則更新窗口,標(biāo)記該到達(dá)并處理過的包。最后將網(wǎng)關(guān)處理的最大序列號更新為該被處理IPSec包的序列號。9、更新

24、SA的生存期:字節(jié)數(shù)、包數(shù)、使用時間。10、記錄下該SA信息,以便與以后進行進入策略檢查。11、提取IPSec頭指出的下一協(xié)議:如果還是IPSec協(xié)議,說明有多個SA(SA串)對該數(shù)據(jù)包進行了處理,則需要利用原IP頭和處理過的數(shù)據(jù)區(qū)組成新的IP包,進行循環(huán)處理;如果是IP協(xié)議,說明SA(或SA串)已經(jīng)處理完畢,則需要根據(jù)內(nèi)部的IP頭信息組建新的IP包,并跳出循環(huán)進入后繼的處理。12、進行進入策略匹配:根據(jù)新的IP包信息(源地址目的地址、源端口目的端口、協(xié)議)查找安全策略庫(SPD),找到該包所對應(yīng)的第一個進入處理策略(可能匹配多個)。檢查該策略所指定的SA(或SA串)即其應(yīng)用的順序是否與10中

25、記錄過的SA(或SA串)以及順序相同。如果相同,則說明滿足進入策略允許該數(shù)據(jù)報進入安全網(wǎng)關(guān);如果不相同,則將再次查找策略庫(遍歷策略庫),直到匹配成功。如果最后還沒有找到正確的進入策略,則將丟棄該數(shù)據(jù)報,并記錄日志信息。13、最后調(diào)用IP包與處理模塊(ip_rcv),重新對新生成的IP包進行處理。14、返回NF_DROP,說明IP包不從該HOOK點返回。2.1.8轉(zhuǎn)發(fā)處理2.1.8.1實現(xiàn)思想對于非本地的IP包,需要將它進行轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)處理首先要檢查IP頭的TTL字段不能小于1,否則將向該IP包的發(fā)送者發(fā)送ICMP超時差錯包。減小TTL值。接下來提取該IP包的路由信息(在轉(zhuǎn)發(fā)前已經(jīng)記錄),根據(jù)路

26、由信息獲得該IP包的外出設(shè)備。然后根據(jù)外出設(shè)備的MTU和IP頭的分片標(biāo)志,判斷允許分片,如果需要分片且不允許分片(DF位設(shè)置為1),則發(fā)送ICMP_DEST_UNREACH目的不可達(dá)ICMP報文。最后激活HOOK點:IP_FORWARD,對轉(zhuǎn)發(fā)IP包進行相關(guān)處理。我們實現(xiàn)的IPSec外出處理模塊也在此時調(diào)用。2.1.8.2實現(xiàn)細(xì)節(jié)1、檢查IP頭的TTL字段:如果小于1,則向該IP包的發(fā)送者發(fā)送ICMP生存期超時差錯包,丟棄該包2、減少該IP包的TTL值。3、提取轉(zhuǎn)發(fā)前記錄的路由信息,找到外出設(shè)備。4、根據(jù)外出設(shè)備的MTU和IP頭的分片標(biāo)志,判斷允許分片,如果需要分片且不允許分片(DF位設(shè)置為1

27、),則發(fā)送ICMP_DEST_UNREACH目的不可達(dá)ICMP報文。5、激活HOOK點:NF_HOOK(PF_INET,NF_IP_FORWARD,skb,skb-dev,dev2,ip_forward_finish);調(diào)用我們實現(xiàn)的IPSec外出處理模塊。2.1.9本地IP包處理2.1.9.1實現(xiàn)思想對于本地傳輸層(TCPUDP)產(chǎn)生的包,首先將進行路由,然后組裝成IP包。最后包激活HOOK點5:NF_IP_LOCAL_OUT。在這個HOOK點上將調(diào)用我們實現(xiàn)的IPSec外出處理模塊。2.1.9.2實現(xiàn)細(xì)節(jié)1.查找路由2.填充IP頭,組裝IP包3.激活HOOK點5:NF_IP_LOCAL_O

28、UT,對于TCP:NF_HOOK(PF_INET,NF_IP_LOCAL_OUT,skb,NULL,rt-u.dst.dev,ip_queue_xmit2)對于UDP:NF_HOOK(PF_INET,NF_IP_LOCAL_OUT,skb,NULL,rt-u.dst.dev,ip_send)2.1.10IPSec外出處理2.1.10.1實現(xiàn)思想IPSec的外出處理函數(shù)掛在HOOK點:NF_IP_FORWARD、NF_IP_LOCAL_OUT上。在這里首先將根據(jù)IP包的相關(guān)信息查找安全策略庫(SPD),找到該IP包對應(yīng)的外出策略。策略將決定對該IP包的幾種處理:ACCEPT;IPSECSALis

29、t;DROP;TRAP;HOLD。ACCEPT表示對IP包不做任何IPSec處理,允許IP包直接通過。IPSECSAList表示將根據(jù)SAList指示的安全關(guān)聯(lián)串(SA串)對IP包進行IPSec處理。DROP表示將丟棄策略不允許外出的IP包,或者先前試圖等待SA協(xié)商,但SA卻不能協(xié)商成功的包。TRAP表示要求更新一個安全關(guān)聯(lián)(SA),此時將設(shè)置SA為HOLD,并通過發(fā)送PF_KEY消息來觸發(fā)IKE守護進程進行安全關(guān)聯(lián)(SA)的協(xié)商。HOLD表示SA還未協(xié)商成功,要求丟棄IP包。對于可以進行IPSec外出處理的包,根據(jù)策略提供的信息,查找安全關(guān)聯(lián)庫(SAD),找到該IP包應(yīng)該應(yīng)用的安全關(guān)聯(lián)(SA

30、或SA串)。如果沒有找到SA,則將通過發(fā)送PF_KEY消息來觸發(fā)IKE守護進程進行安全關(guān)聯(lián)(SA或SA串)的協(xié)商,此時IP包被暫時保持,直到sa創(chuàng)建或超時。如果找到了SA(或SA串),則檢查SA的狀態(tài)、生存期。然后進行IPSec協(xié)議處理,根據(jù)SA(或SA串)所指定的協(xié)議(AH或ESP),循環(huán)對IP包進行認(rèn)證、加密等處理。SA串處理完畢后,將重新構(gòu)建IP包,并對新的IP包重新進行路由。最后返回NF_ACCEPT,表示該IP包將進入激活HOOK點時指定的處理函數(shù):ip_queue_xmit2、ip_send,進入發(fā)送處理模塊。2.1.10.2實現(xiàn)細(xì)節(jié)1.查找SPD(外出策略)庫,找到匹配項的所定義

31、的目標(biāo)動作。1)ACCEPT:返回NF_ACCEPT,即包不用經(jīng)過任何加工處理,直接通過。2)DROP:返回NF_DROP,丟掉此包不再傳輸3)TRAP:發(fā)送PF_key消息ACCQUIRE給IKE守護進程,在SPD中把它替換成HOLD,返回NF_STOLEN,不繼續(xù)傳輸該數(shù)據(jù)報。4)HOLD:截取符合此策略的包,更新以前截獲的包,返回NF_STOLEN,不繼續(xù)傳輸該數(shù)據(jù)報。5)IPSECSalist:進行IPSec處理。以下便是詳細(xì)的步驟說明。2.根據(jù)策略提供的信息,查找安全關(guān)聯(lián)庫(SAD),尋找該IP包應(yīng)該應(yīng)用的安全關(guān)聯(lián)(SA或SA串)。如果沒有找到SA,則將通過發(fā)送PF_KEY消息來觸發(fā)

32、IKE守護進程進行安全關(guān)聯(lián)(SA或SA串)的協(xié)商,此時IP包被暫時保持,直到sa創(chuàng)建或超時。3.如果找到了SA(SA串),檢查當(dāng)前SA的狀態(tài),對于已經(jīng)過時的SA,要釋放SA和這個SA包。4.設(shè)置重播窗口。5.檢查SA的生命期,包括使用時間,已處理的字節(jié)數(shù),處理的IP包數(shù)目。對于已經(jīng)過生命期的SA,要刪除,發(fā)PF_key消息給IKE。(IKE應(yīng)該自己維護SA,更新刪除應(yīng)該能自動進行不需內(nèi)核干涉或提醒,但是要實現(xiàn)對于字節(jié)的限制應(yīng)該只能由內(nèi)核告訴IKE進行更新)6.根據(jù)SA中的協(xié)議設(shè)置AH或ESP頭,然后轉(zhuǎn)到SA鏈的下一個SA,重復(fù)從4開始的處理。7.設(shè)置新的MTU(如果實現(xiàn)了PMTU機制,要做相應(yīng)

33、的處理)8.根據(jù)SA指定的協(xié)議(AH或ESP)設(shè)置頭空間和尾空間,并使用SA規(guī)定的協(xié)議中應(yīng)該使用的加密或驗證算法處理IP包數(shù)據(jù)區(qū)內(nèi)容。9.處理結(jié)束后調(diào)整IP頭重新設(shè)置校驗和。10.更新SA的生命期11.對于SA串將循環(huán)處理SA串上的每一個SA12.對新的IP包重新進行路由。13.返回NF_ACCEPT,將IP包傳送到進入激活HOOK點時指定的處理函數(shù):ip_queue_xmit2、ip_send。進入發(fā)送處理模塊。2.1.11發(fā)送處理2.1.11.1實現(xiàn)思想首先要判斷是否需要進行分片處理。轉(zhuǎn)發(fā)的IP包,或者是本地產(chǎn)生的經(jīng)過IPSec處理過的IP包的長度有可能大于發(fā)送接口的MTU,此時必須進行分

34、片處理。分片結(jié)束后將IP包交給鏈路層處理模塊,然后由網(wǎng)卡發(fā)送該數(shù)據(jù)包。2.1.11.2實現(xiàn)細(xì)節(jié)1、判斷是否需要分片,如果需要,則調(diào)用分片函數(shù)ip_fragment進行分片。2、將IP包交給鏈路層處理模塊:dev_queue_xmit。2.2功能模塊的實現(xiàn)2.2.1策略庫(SPD)的實現(xiàn):2.2.1.1實現(xiàn)思想:我們將安全策略庫的配置設(shè)置在安全網(wǎng)關(guān)上,各個安全網(wǎng)關(guān)獨立配置策略庫。但要保證策略的一致性。安全策略庫(SPD)說明了對IP數(shù)據(jù)報提供何種保護,并以何種方式實施保護。SPD中策略項的建立和維護應(yīng)通過協(xié)商;而且對于進入和外出處理都應(yīng)該有自己的策略庫。對于進入或外出的每一份數(shù)據(jù)報,都可能有三種

35、處理:丟棄、繞過或應(yīng)用IPSec。SPD提供了便于用戶或系統(tǒng)管理員進行維護的管理接口??稍试S主機中的應(yīng)用程序選擇IPSec安全處理。SPD中的策略項記錄對SA(SA束)進行了規(guī)定,其字段包含了IPsec協(xié)議、模式、算法和嵌套等要求。SPD還控制密鑰管理(如ISAKMP)的數(shù)據(jù)包,即對ISAKMP數(shù)據(jù)包的處理明確說明。SPD是利用radix樹型結(jié)構(gòu)來構(gòu)造。每一個結(jié)點就是一個策略項。策略項中包含一個SAID數(shù)據(jù)結(jié)構(gòu),它是SPD與SAD之間的接口??梢杂伤鼇聿檎襍AD,從而指定相關(guān)的SA(或SA串)。這樣使得策略項可以對應(yīng)相關(guān)的一個SA或者多個SA(SA串)。SPD中策略項的查找是通過選擇符來進行的

36、。SA或SA束的粒度決定于選擇符。通過選擇符,可以找到外出或進入IP包應(yīng)該實行的策略項。兩個策略項的選擇符可以相同。我們選用第一匹配項,并保證SPD始終以同樣的順序進行查找,這樣就保證了第一匹配策略項的一致性選擇。2.2.1.2實現(xiàn)細(xì)節(jié)1、策略庫的構(gòu)建方式:采用radix樹型結(jié)構(gòu)。存放在內(nèi)核中。2、選擇符的構(gòu)成。選擇符包含下列參數(shù):目的地IP地址、源IP地址、名字(用戶ID、系統(tǒng)名字)、數(shù)據(jù)保密等級、源端口和目的端口3、策略項的構(gòu)成。策略項包含下列參數(shù):radix樹相關(guān)數(shù)據(jù)結(jié)構(gòu)、SAID結(jié)構(gòu)、地址、掩碼。4、為用戶層提供的接口(PF_key),允許用戶程序可通過接口對庫進行操作:添加、刪除、搜

37、索(匹配)。5、對策略庫的操作時機:用戶通過配置界面對策略庫進行相關(guān)操作;IKE協(xié)商SA完畢后,在更新SAD的同時,也要建立新的SAD與SPD之間的關(guān)聯(lián)。2.2.1.3基本操作用戶配置程序通過PF_key接口調(diào)用內(nèi)核相關(guān)程序程序,實現(xiàn)對安全策略庫的操作。1、添加策略項:ipsec_create_policy根據(jù)用戶傳入的信息構(gòu)造策略項結(jié)構(gòu),然后將該結(jié)構(gòu)加入到radix樹中。2、刪除策略項:ipsec_delete_policy根據(jù)用戶傳入信息,在radix樹中找到該策略項,然后刪除該節(jié)點。3、查找策略項:ipsec_find_policy根據(jù)用戶傳入信息,在radix樹中查找到該策略項。2.2

38、.2安全關(guān)聯(lián)庫(SAD)的實現(xiàn)2.2.2.1實現(xiàn)思想安全關(guān)聯(lián)(SA)是構(gòu)成IPSec的基礎(chǔ)。SA是兩個通信實體經(jīng)過協(xié)商建立起來的一種協(xié)定。他們決定了用來保護數(shù)據(jù)保安全的IPSec協(xié)議、模式、算法及密鑰、生存期、抗重播窗口、計數(shù)器等等。SA是單向的,因此外出和進入處理需要不同的SA。SA還與協(xié)議相關(guān),每一種協(xié)議都有一個SA。安全關(guān)聯(lián)庫(SAD)維護了IPSec協(xié)議用來保障數(shù)據(jù)保安全的SA記錄。每個SA都在SAD中有一條記錄相對應(yīng)。對于外出處理,應(yīng)SPD中查找指向SAD中SA的指針,如SA未建立,則應(yīng)激活I(lǐng)KE建立SA,并同SPD和SAD的記錄關(guān)聯(lián)起來。對于進入處理,SAD的記錄用目的IP地址、I

39、PSec協(xié)議類型和SPI標(biāo)識。SAD是利用HASH表來構(gòu)造的。SAD的查找是通過一個三元組(SAID):協(xié)議、目的地址、SPI來進行的,三元組標(biāo)識了唯一的SA。通過對SAID的散列找到SA頭,然后再進行詳細(xì)匹配找到相應(yīng)的SA。SA的管理可以通過手工進行,也可以通過IKE來進行動態(tài)協(xié)商。為了進行SA的管理,我們利用PF_key實現(xiàn)了一個用戶應(yīng)用與內(nèi)核通訊的接口。2.2.2.2實現(xiàn)細(xì)節(jié)1、安全關(guān)聯(lián)庫(SAD)的構(gòu)建方式:通過hash表(如圖)2、SAD庫的查找通過一個SAID:3、SA記錄的構(gòu)成。每一個SA的基本結(jié)構(gòu)包括:序號計數(shù)器:32比特。序號計數(shù)器溢出標(biāo)志:標(biāo)識序號計數(shù)器是否溢出。如果溢出,

40、則產(chǎn)生一個審計事件,并禁止用SA繼續(xù)發(fā)送數(shù)據(jù)包??怪夭ゴ翱冢?2比特計數(shù)器及位圖,用于決定進入的AH或ESP數(shù)據(jù)包是否為重發(fā)的。AH驗證算法及其密鑰等。ESP加密算法、密鑰、IV模式、IV等。ESP驗證算法、密鑰等。如未選擇驗證服務(wù),該字段為空。安全關(guān)聯(lián)的生存期:一個時間間隔。IPsec協(xié)議模式:隧道、傳輸或通配:主機實施應(yīng)支持所有模式;網(wǎng)關(guān)實施應(yīng)支持隧道模式PMTU:所考察的路徑的MTU及其壽命變量。4、SAD和SPD之間是通過SAID進行關(guān)聯(lián)的。通過查看SPD中的SAID值,可對SAD進行查找,找到該策略項所應(yīng)該實施的SA。5、安全關(guān)聯(lián)庫與用戶程序(IKE)的接口,通過PF_key來實現(xiàn)。

41、無論是手工創(chuàng)建一個SA,還是通過密鑰管理協(xié)議IKE動態(tài)創(chuàng)建SA,都通過該接口對SAD和SPD進行操作。2.2.2.3基本操作1、創(chuàng)建一個SA:ipsec_create_sa根據(jù)用戶提供的SA相關(guān)參數(shù)構(gòu)建SA結(jié)構(gòu),然后提取SAID值,并對SAID進行散列。將SA結(jié)構(gòu)放入散列鏈頭。2、刪除一個SA:ipsec_delete_sa根據(jù)用戶參數(shù),提取SAID。根據(jù)SAID查找SAD,找到后將SA結(jié)構(gòu)從鏈中刪除。3、查找一個SA:ipsec_find_sa根據(jù)用戶參數(shù),提取SAID。對SAID散列后,在SAD散列表中中找到SA鏈頭,再進行詳細(xì)SAID匹配找到為一的SA。2.2.3AH協(xié)議處理模塊實現(xiàn)2.

42、2.3.1AH格式:各字段含義如下:1)下一頭(8比特):標(biāo)識緊跟驗證頭的下一個頭的類型。2)載荷長度(8比特):以32-位字為單位的驗證頭的長度,再減去2。例如,缺省的驗證數(shù)據(jù)字段的長度是96比特(3個32-位字),加上3個字長的固定頭,頭部共6個字長,因此該字段的值為4。3)保留(16比特):保留為將來使用。4)安全參數(shù)索引(32比特):用于標(biāo)識一個安全關(guān)聯(lián)。5)序號(8比特):單增的計數(shù)器值。6)驗證數(shù)據(jù)(可變):該字段的長度可變(但應(yīng)為32-位字的整數(shù)倍),包含的數(shù)據(jù)有數(shù)據(jù)包的ICV(完整性校驗值)或MAC。2.2.3.2實現(xiàn)功能:AH用于為IP提供數(shù)據(jù)完整性、數(shù)據(jù)原始身份驗證和一些可

43、選的、有限的抗重播服務(wù)。2.2.3.3實現(xiàn)模式:在安全網(wǎng)關(guān)上只實現(xiàn)隧道模式:AH:外部IP頭下一個頭載荷長度保留安全參數(shù)索引(SPI)序列號驗證數(shù)據(jù)內(nèi)部IP頭TCP頭數(shù)據(jù)2.2.4ESP協(xié)議處理模塊實現(xiàn)2.2.4.1ESP格式各字段含義如下:1)安全參數(shù)索引(32比特):標(biāo)識一個安全關(guān)聯(lián)。2)序號(32比特):單增的計數(shù)器值。3)載荷數(shù)據(jù)(可變):傳輸層數(shù)據(jù)段(傳輸模式)或IP包(隧道模式),通過加密得到保護。4)填充(0-255字節(jié)):額外的字節(jié)。有的加密算法要求明文長度是8位組的某個整倍數(shù)。5)填充長度(8比特):表示填充的字節(jié)數(shù)。6)下一頭(8比特):通過標(biāo)識載荷中的第一個頭(如IPv6

44、中的擴展頭,或諸如TCP之類的上層協(xié)議頭),確定載荷數(shù)據(jù)字段中數(shù)據(jù)的類型。驗證數(shù)據(jù)(可變):長度可變的字段(應(yīng)為32-位字的整數(shù)倍),用于填入ICV。ICV的計算范圍為ESP包中除去驗證數(shù)據(jù)字段的部分。2.2.4.2實現(xiàn)功能:ESP用于為IP提供機密性、數(shù)據(jù)源驗證、抗重播以及數(shù)據(jù)完整性等安全服務(wù)。2.2.4.3實現(xiàn)模式在安全網(wǎng)關(guān)上只實現(xiàn)隧道模式:ESP:IP頭安全參數(shù)索引(SPI)序列號內(nèi)部IP頭TCP頭數(shù)據(jù)填充項填充項長度下一個頭驗證數(shù)據(jù)2.2.5算法實現(xiàn)2.2.5.1實現(xiàn)思想支持多種認(rèn)證算法和加密算法,并且可以動態(tài)添加。其中現(xiàn)有認(rèn)證算法支持:hmac-md5-96和hmac-sha1-96;加密算法支持:3des-md5-96和3des-sha1-96。密鑰生成分為兩種:一種是預(yù)共享密鑰PSK,一種是公私鑰RSA。如果利用PSK生成密鑰,則通訊雙方的PSK密鑰必須相同。2.2.5.2實現(xiàn)細(xì)節(jié)2.2.6日志、統(tǒng)計、配置與審計實現(xiàn)2.2.6.1日志與審計VPN網(wǎng)關(guān)將記錄對網(wǎng)關(guān)進行的各種操作,包括錯誤信息、安全規(guī)則文件的修改等等。并按照安全等級、事件名稱

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論