![詳細(xì)設(shè)計說明書示例_第1頁](http://file4.renrendoc.com/view/bce02862c6150b5bd75073d3c73b804a/bce02862c6150b5bd75073d3c73b804a1.gif)
![詳細(xì)設(shè)計說明書示例_第2頁](http://file4.renrendoc.com/view/bce02862c6150b5bd75073d3c73b804a/bce02862c6150b5bd75073d3c73b804a2.gif)
![詳細(xì)設(shè)計說明書示例_第3頁](http://file4.renrendoc.com/view/bce02862c6150b5bd75073d3c73b804a/bce02862c6150b5bd75073d3c73b804a3.gif)
![詳細(xì)設(shè)計說明書示例_第4頁](http://file4.renrendoc.com/view/bce02862c6150b5bd75073d3c73b804a/bce02862c6150b5bd75073d3c73b804a4.gif)
![詳細(xì)設(shè)計說明書示例_第5頁](http://file4.renrendoc.com/view/bce02862c6150b5bd75073d3c73b804a/bce02862c6150b5bd75073d3c73b804a5.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
詳盡設(shè)計說明書示例詳盡設(shè)計說明書示例67/67詳盡設(shè)計說明書示例1.前言編寫目的本說明書供給了freeswan各個模塊零件的說明,以供編碼人員詳細(xì)實現(xiàn)及此后的保護工作。2.整體設(shè)計設(shè)計原那么在確立目標(biāo)系統(tǒng)的過程中,主要依照了以下幾個原那么:目標(biāo)系統(tǒng)根本上完好地實現(xiàn)IPSec協(xié)議族,完好支持VPN的要求;目標(biāo)系統(tǒng)的效力器端必定要成立在擁有自主版權(quán)的內(nèi)核操作系統(tǒng)之上;目標(biāo)系統(tǒng)的客戶端使用方便、界面友善、配置和管理簡單靈巧。軟件結(jié)構(gòu)該軟件由以下幾個模塊構(gòu)成:KLIPS模塊――
實現(xiàn)對進入或出門
IP
包的安全辦理,如:加密、認(rèn)證等〔運轉(zhuǎn)在內(nèi)核空間〕Pluto模塊――PF_KEY模塊――
實現(xiàn)IKE協(xié)議,達(dá)成安全結(jié)盟的磋商〔運轉(zhuǎn)在用戶空間〕實現(xiàn)pfkey2協(xié)議,達(dá)成上述兩個模塊間對于SA的通訊3.程序描繪源代碼文件構(gòu)成本程序由兩大模塊構(gòu)成,一局部是klips,它運轉(zhuǎn)在操作系統(tǒng)內(nèi)核空間,主要負(fù)責(zé)安全結(jié)盟和密鑰的管理工作,以及對數(shù)據(jù)報的加密、解密的辦理工作;一局部是pluto,它是一個運轉(zhuǎn)在用戶空間的守衛(wèi)進度,主要負(fù)責(zé)安全結(jié)盟的磋商工作。下邊分別是它們的文件構(gòu)成:源文件目錄|―――freeswan|――klips|――libdes|――pluto|――utilsKLIPS〔內(nèi)核IPsec〕詳盡設(shè)計--―――klipsipsec的核心實現(xiàn)模塊|――net|――ipsec|――登記模塊,并初始化|――ipsec_tunnel.數(shù)據(jù)包的辦理并發(fā)送模塊|――數(shù)據(jù)包接收并辦理模塊|――管理SA的模塊|――sha1實現(xiàn)模塊,由改編|――實現(xiàn)模塊|――|――路由表的radix數(shù)的實現(xiàn)模塊|――對上個文件的改編|――實現(xiàn)PF_KEY2協(xié)議的模塊|――對上個文件的改編|――|――utils|――用戶操作eroute表的模塊|――用戶操作SA庫的模塊|――同上|――用戶操作虛接口的模塊|――登記及初始化模塊綱要說明功能向內(nèi)核系統(tǒng)登記幾個proc文件,以便于向內(nèi)核空間中查問安全結(jié)盟和eoute表,以及虛接口的狀況;初始化SA數(shù)據(jù)庫〔tdb鏈〕;初始化SPDB數(shù)據(jù)庫〔eroute表〕;初始化pf_key〔PF_KEY套接口〕;模塊所波及的文件:intipsec_init(void):intipsec_tdbinit(void):intipsec_radijinit(void):intpfkey_init(void)變量說明proc文件結(jié)構(gòu)將以下結(jié)構(gòu)登記到內(nèi)核系統(tǒng)中,那么內(nèi)核就能夠經(jīng)過proc文件系統(tǒng)向應(yīng)用程序供給一個安全的界面來存取如SA、eroute表等資料。structproc_dir_entryipsec_eroute;structproc_dir_entryipsec_spi;structproc_dir_entryipsec_spigrp;structproc_dir_entryipsec_tncfg;structproc_dir_entryipsec_spinew;structproc_dir_entryipsec_klipsdebug;notifier_block結(jié)構(gòu)structnotifier_block結(jié)構(gòu)是在include/linux/里面的:structnotifier_block{int(*notifier_call)(structnotifier_block*self,unsignedlong,void*);structnotifier_block*next;intpriority;};而register_netdevice_notifier函數(shù)在net/core/里面,是這樣的:intregister_netdevice_notifier(structnotifier_block*nb){returnnotifier_chain_register(&netdev_chain,nb);}而notifier_chain_register函數(shù)在include/linux/里面,是這樣的:extern__inline__intnotifier_chain_register(structnotifier_blocklist,structnotifier_block*n){while(*list){if(n->priority>(*list)->priority)break;list=&((*list)->next);}n->next=*list;*list=n;return0;}明顯就是依據(jù)每個block的優(yōu)先級把這個block擺列在一個block的鏈表里面,在notifier_chain_register函數(shù)里面我們能夠發(fā)現(xiàn)這個鏈表是netdev_chain。實質(zhì)上這個鏈表的作用就是在每個interface打開,封閉狀態(tài)改變或許外界調(diào)用相應(yīng)的ioctl的時候通知這個鏈表上邊的所有有關(guān)的設(shè)施,而每一個協(xié)議都調(diào)用register_netdevice_notifier注冊了一個netdev_notifier的結(jié)構(gòu)體,這樣就能夠在interface改變的時候獲取通知了(經(jīng)過調(diào)用每個notifier_call函數(shù))。inet_protocol結(jié)構(gòu)structinet_protocolah_protocol={ipsec_rcv,/*AHhandler,定義此協(xié)議辦理函數(shù)*/NULL,/*TUNNELerrorcontrol,錯誤辦理函數(shù)*/0,/*next*/IPPROTO_AH,/*protocolID*/0,/*copy*/NULL,/*data*/"AH"/*name*/};ipsec_rcv函數(shù)是用來接收數(shù)據(jù)的callback函數(shù),第二個是錯誤辦理函數(shù),其余的copy是用來協(xié)議共享的,這個此后再說,data自然就是這個結(jié)構(gòu)體的私有數(shù)據(jù)了。structinet_protocolesp_protocol同上;inet_add_protocol函數(shù)在net/ipv4/里實現(xiàn):voidinet_add_protocol(structinet_protocol*prot){unsignedcharhash;structinet_protocol*p2;hash=prot->protocol&(MAX_INET_PROTOS-1);prot->next=inet_protos[hash];inet_protos[hash]=prot;prot->copy=0;p2=(structinet_protocol*)prot->next;while(p2!=NULL){if(p2->protocol==prot->protocol){prot->copy=1;break;}p2=(structinet_protocol*)p2->next;}}這個函數(shù)是生成了一個
hash
表,而后每個
hash
表項都是一個鏈表頭,而后經(jīng)過這個
hash表加鏈表的方式接見每個協(xié)議結(jié)構(gòu)體。函數(shù)說明登記及初始化模塊包含以下一些函數(shù):init_modules(),ipsec_init(),cleanup_module(),ipsec_cleanup(),ipsec_eroute_get_info(),ipsec_spi_get_info(),ipsec_spigrp_get_info(),ipsec_tncfg_get_info(),ipsec_version_get_info(),ipsec_spi_get_new()intinit_module(void)目的:
裝載
ipsec時進行登記及初始化工作。參數(shù):
無返回值:算法描繪:
0調(diào)用
――初始化成功,非ipsec_init()。
0值――初始化未成功intcleanup_module(void)目的:卸載ipsec進行去除工作。參數(shù):無返回值:0――初始化成功,非0值――初始化未成功算法描繪:調(diào)用ipsec_cleanup()。intipsec_int(void)目的:
裝載
ipsec時進行登記及初始化工作。。參數(shù):
無返回值:
0――初始化成功,非
0值――初始化未成功算法描繪:1.將定義好的幾個proc_dir_entry結(jié)構(gòu)注冊到系統(tǒng)中,如:proc_register(proc_net,&ipsec_eroute);/*PROC_FS_21*/或proc_register_dynamic(&proc_net,&ipsec_eroute);或proc_net_create(“ipsec_erouteproc_register為系統(tǒng)調(diào)用,在fs/proc/
〞,0,ipsec_eroute_;get_info)中實現(xiàn),主要就是在proc_net
對應(yīng)的目錄下邊生成每個協(xié)議的子目錄。用戶能夠經(jīng)過接見
/proc/net
目錄下邊的相應(yīng)目錄獲取有關(guān)的資料。2.調(diào)用ipsec_tdbinit()函數(shù)初始化SA數(shù)據(jù)庫,此函數(shù)在文件中實現(xiàn);3.調(diào)用ipsec_radijinit()函數(shù)初始化SPD數(shù)據(jù)庫,此函數(shù)在文件中實現(xiàn);4.調(diào)用pfkey_init()函數(shù)初始化PFKEY,此函數(shù)在文件中實現(xiàn);5.調(diào)用register_netdevice_notifier(&ipsec_dev_notifier)函數(shù)向系統(tǒng)中注冊已定義的ipsec_dev_notifier結(jié)構(gòu),register_netdevice_ntifier()為系統(tǒng)調(diào)用;6.調(diào)用inet_add_protocol(&esp_protocol)和inet_add_protocol(&ah_protocol)函數(shù)向系統(tǒng)中注冊ESP協(xié)講和AH協(xié)議,inet_add_protocol()為系統(tǒng)調(diào)用;7.調(diào)用
ipsec_tunnel_init_devices()
函數(shù),登記并初始化
ipsec虛接口,此函數(shù)定義在文件中。intipsec_cleanup(void)目的:
卸載
ipsec進行去除工作。參數(shù):
無返回值:
0――去除成功,非
0值――去除未成功算法描繪:1.調(diào)用
ipsec_tunnel_cleanup_device(void)
函數(shù),去除向系統(tǒng)登記的
ipsec虛接口,此函數(shù)在中實現(xiàn);2.調(diào)用inet_del_protocol(&ah_protocol)和inet_del_protocol(&esp_protocol)去除去在系統(tǒng)中注冊的ESP協(xié)講和AH協(xié)議;3.調(diào)用系統(tǒng)調(diào)用unregister_netdevice_notifier(&ipsec_dev_notifier)去除去系統(tǒng)中注冊的ipsec_dev_notifier;4.調(diào)用ipsec_tdbcleanup(0)去除系統(tǒng)中的SA數(shù)據(jù)庫,此函數(shù)在中文件實現(xiàn);5.調(diào)用ipsec_radijcleanup()去除系統(tǒng)中的SPD數(shù)據(jù)庫,此函數(shù)在文件中實現(xiàn);6.調(diào)用pfkey_cleanup()做pfkey去除工作;7.調(diào)用系統(tǒng)調(diào)用proc_net_unregister()去除freeswan在系統(tǒng)中登記的各個proc文件。虛接口模塊綱要說明功能為了在不改變現(xiàn)有的操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧的狀況下,更好地將IPsec嵌入,本程序采用了虛接口的觀點。實現(xiàn)中,將創(chuàng)辦4個ipsec虛接口,能夠?qū)⑻摻涌诮壎ㄔ谖锢斫涌谏?。對于從tcp/udp協(xié)議層傳下來的數(shù)據(jù),將第一查問eroute表,依據(jù)eroute表項決定將數(shù)據(jù)包發(fā)往哪一個接口,物理接口與虛接口將被視為一致的。此時,假如數(shù)據(jù)包發(fā)往虛接口,那么調(diào)用函數(shù)進行辦理。〔該程序近似于網(wǎng)卡驅(qū)動程序的編寫〕構(gòu)成文件變量說明device結(jié)構(gòu)虛接口定義為structdevice結(jié)構(gòu),如:staticstructdevicedev_ipsec0={"ipsec0\0",/*name*/0,/*recvmemoryend*/0,/*recvmemorystart*/0,/*memoryend*/0,/*memorystart*/0x0,/*baseI/Oaddress*/0,/*IRQ*/0,0,0,/*flags*/NULL,/*nextdevice*/ipsec_tunnel_probe/*setup*/};ipsecpriv結(jié)構(gòu)structipsecpriv{structsk_buff_headsendq;structdevice*dev;structwait_queue*wait_queue;charlocked;int(*hard_start_xmit)(structsk_buff*skb,structdevice*dev);int(*hard_header)(structsk_buff*skb,structdevice*dev,unsignedshorttype,void*daddr,void*saddr,unsignedlen);#ifdefNET_21int(*rebuild_header)(structsk_buff*skb);#else/*NET_21*/int(*rebuild_header)(void*buff,structdevice*dev,unsignedlongraddr,structsk_buff*skb);#endif/*NET_21*/int(*set_mac_address)(structdevice*dev,void*addr);#ifndefNET_21void(*header_cache_bind)(structhh_cachehhp,structdevice*dev,unsignedshorthtype,__u32daddr);#endif/*!NET_21*/void(*header_cache_update)(structhh_cache*hh,structdevice*dev,unsignedchar*structenet_statistics*(*get_stats)(structdevice*dev);
haddr);structenet_statisticsmystats;intmtu;/*WhatisthedesiredMTU*/};函數(shù)說明intipsec_tunnel_init_devices(void)目的:
登記
ipsec虛接口。參數(shù):
無返回值:
0――登記成功,非
0值――登記未成功算法描繪:調(diào)用系統(tǒng)調(diào)用
register_netdev(&dev_ipsec0~3)
,向系統(tǒng)登記
4個ipsec虛接口。intipsec_tunnel_init(structdevice*dev)目的:
初始化
ipsec虛接口,達(dá)成
device
中變量的初始化和系統(tǒng)資源的申請。參數(shù):返回值:
0――
去除成功,非
0值――去除未成功算法描繪:1.填補
device結(jié)構(gòu)中的幾個函數(shù),如:a)dev->open=ipsec_tunnel_open;b)dev->stop=ipsec_tunnel_stop;c)dev->hard_start_xmit=ipsec_tunnel_start_xmit;d)dev->get_stats=ipsec_tunnel_get_stats;2.給dev配空間,dev->priv=kmalloc(sizeof(structipsecpriv),GFP_KERNEL);3.初始化dev結(jié)構(gòu):skb_queue_head_init(&dev->buffs[i]);4.填補
dev
結(jié)構(gòu)的其余值,如:
dev->set_mac_address=NULL等等。intipsec_tunnel_attach(structdevice*tndev,structipsecpriv*prv,structdevice*dev)目的:將某個虛接口綁定到指定的物理接口上。參數(shù):返回值:0――綁定成功,非0值――綁定未成功算法描繪:intipsec_open(structdevice*dev)目的:參數(shù):
要
open
的
device返回值:
0――
open
成功,非
0值――open
未成功算法描繪:此方法在網(wǎng)絡(luò)設(shè)施驅(qū)動程序里是網(wǎng)絡(luò)設(shè)施被激活的時候被調(diào)用〔即設(shè)施狀態(tài)由down->up〕。驅(qū)動程序作為一個模塊被裝入:假如虛接口還沒有綁定到物理接口,返回錯誤信息;否那么調(diào)用MOD_INC_USE_COUNT宏,以防備模塊卸載是設(shè)施處于打開狀態(tài)。intipsec_tunnel_start_xmit(structsk_buff*skb,structdevice*dev)目的:
假定此函數(shù)由
dev_queue_xmit()
函數(shù)調(diào)用,主要負(fù)責(zé)發(fā)送從
tcp/udp
協(xié)議層傳來的數(shù)據(jù)包參數(shù):返回值:
由dev_queue_xmit()函數(shù)填補好的skb,及要發(fā)往的網(wǎng)絡(luò)接口0――open成功,非0值――open未成功算法描繪:1.skb,dev有效嗎有效持續(xù),無效返回;prv=dev->priv獲取ipsec接口私有數(shù)據(jù);假定prv為空,返回;獲取系列參數(shù):物理接口參數(shù)physdev,physmtu,stats;2.假如需要,拷貝skb:IfdefNET_21,thenskb_cloned(skb);3.獲取Ip頭iph,判斷該包是不是IPV4,假定不是那么拋棄;4.計算硬件頭長度〔hard_header_len〕;5.將ip包的ttl減小,并計算校驗和。6.填補查找鍵鍵值,依據(jù)鍵值查找eroute表,獲取eroute,假定找到,拿出SA,即outgonging_said;7.判斷此IP包是不是IKE磋商包〔UDPport500〕,假定是,那么跳出;8.進入封裝辦理大循環(huán)〔幾乎全部辦理都由outgoing_said決定,一個said對應(yīng)一個或多個tdb〔通道描繪塊〕,依據(jù)每個tdb對其進行辦理〕:checkforDROPormissingeroutecheckforREJECTeroutecheckforPASSeroutecheckforHOLDeroutecheckforTRAPeroute,signalPF_KEY,swaptoHOLDerouteacquirelockforwalkingtdbchaincalculateheadroomrequiredforchaincheckifSAisinlarval,dropcheckifSAisdead,dropcheckifreplayoverflowed,expireSAcheckiflifetimecountershaveoverflowed,expireSAswitchonprotocoltype,tocalculateheadroomsize.ifESPswitchonprotocoltypetocalculatetailroomsize.alculatemtudiff,sendICMPfragmentneeded.Mark``note2''ackMSSifdesiredcopyupper(layer2)headertosafetyifitwaspresentcheckifdatafitsinexistingskb,elseexpand.applygroupedtransformsapplydisasterof#ifdefs.switchbyprotocoltype,calculateheadroomforthisstageifESP,thenswitchbyciphergetheadroomifESP,thenswitchbyhashtogettailroomdoublecheck(notinNDEBUG)ifthereisenoughheadroompushthedataaheaddoublecheck(notinNDEBUG)ifthereisenoughtailroomextendthedatabehindseeifpackethasbecometoolong(biggerthan64K)finallymovetheplaintextasappropriateswitchonprotocoltypecase:ESPswitchonciphertype,prepareIVprepareself-describingpaddingswitchonciphertype,doencryptionIV.switchonciphertype,updateIVswitchonhashtype,doauthentication11)case:AHprepreplayinfo,headroomswitchonhashtype,doauthentication12)case:IPIP,applyencap13)case:IPCOMPcallskb_compressdosomedebugging14)recalculateheaderchecksumlookuperoutebynewouterheader,ifwefoundsomethingandthesrc/dsthavechanged9.endICMPifpackethasbecometoobig10.re-applylinklayerheaderiftherewasone.11.a(chǎn)ttempttore-routethepacket12.droppacketifnewrouteleadstousagain.13.doconnectiontracking14.donetfilterlocaloutoutputcall15.callip_sendorIP_SENDdependingonkernelversion⑴.獲得一些初始值,如dst,src,iphlen,pyldsz,⑵.接下來是一系列合法性和安全性檢查,對不合理局部有兩種辦理方法:1〕不進行安全辦理,直接從物理接口上發(fā)送并返回;2〕拋棄數(shù)據(jù)包,返回。⑶.有eroute嗎沒有,那么從physdev發(fā)送數(shù)據(jù)包并返回,有那么持續(xù);⑷.假定指定地道模式,卻找不到spi,不做辦理,按1)發(fā)送,返回;⑸.依據(jù)said獲得tdbp鏈,和sa_len,假定tdbp鏈為空,報錯返回;⑹.進入tdb辦理循環(huán),求出ipsec辦理所需的headroom和tailroom;對tdbp鏈中每一個tdb進行以下辦理:①大批的合法性判斷,包含tdb狀態(tài)能否對,SA能否過時,PFKEYv2辦理等;②依據(jù)tdbp->計算headroom和tailroom。方法是,依據(jù)不一樣而算法不一樣:.tdbp->tdb_encalg〔加密算法〕ESP_DES:headroom+=sizeof(structesp);ESP_3DES:headroom+=sizeof(structesp);ESP_NULL:headroom+=offsetof(structesp,esp_iv);default:拋棄包。.tdbp->tdb_autoalg〔認(rèn)證算法〕AH_MD5:tailroom+=AHHMAC_HASHLEN;AH_SHA:tailroom+=AHHMAC_HASHLEN;AH_NONE:NOP〔不辦理〕;default:不對,拋棄包。Ⅲ.計算:〔數(shù)據(jù)包假如16〔〕字節(jié)的倍數(shù),否則加空補齊。tailroom+=((8-((pyldsz+2*sizeof(unsignedchar))%8))%8)+2;IPPROTO_IPIP:headroom+=sizeof(structiphdr);default:最后,對鏈表中每一個
tdb
求出的
headroom
、
tailroom
乞降得出
max_headroom
、max_tailroom,pyldsz也相應(yīng)改變〔加上headroom,tailroom〕?!睱n1016〕⑺.求出tot_headroom,tot_tailroom,mtu_diff;假定mtu_diff>0,說明
prv->mtu
計算不適合,從頭計算;⑻.
調(diào)整
mss;⑼.
hard_header_stripped
辦理;〔Ln1077〕⑽.⑾.
!。原skb空間夠用嗎不夠就從頭分派一個skb并進行進入tdb鏈循環(huán),進行真實的ipsec安全辦理。
extend_copy;①定義變量并賦初值;②依據(jù)③辦理
tdbp->確立headroom,tailroom;與(6)的辦理近似。skb,挪動數(shù)據(jù)指針(skb_push,skb_put函數(shù));ip頭前移;⑤依據(jù)不一樣的協(xié)議種類進行不一樣的辦理:switch(tdbp->IPPROTO_ESP:填寫espp〔spi,rpl,...〕;求出iv[0],iv[1](初始化向量);求出idat,ilen(內(nèi)部數(shù)據(jù)地區(qū))要加密的數(shù)據(jù)地點及長度;求出pad,padlen.〔為了認(rèn)證〕;〔pad前面兩個字節(jié)分別寄存
pad
長度和前
iph->protocol.由tdbp->tdb_encalg決定調(diào)用加密算法:des_cbc_encrypt(idat,idat,ilen,(caddr_t)tdbp->tdb_key_e,(caddr_t)iv,1);ESP_3DES:des_ede3_cbc_encrypt(idat,idat,ilen,(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[0]),(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[1]),(caddr_t)(&((structdes_eks*)(tdbp->tdb_key_e))[2]),(caddr_t)iv,1);由tdbp->tdb_encalg決定怎樣進行認(rèn)證:AH_MD5:AH_SHA:IPPROTO_AH:填寫ahp;...由tdbp->tdb_encalg決定怎樣進行認(rèn)證:AH_MD5:AH_SHA:IPPROTO_IPIP:結(jié)構(gòu)IP頭;⑥計算
IP頭校驗,調(diào)整
skb內(nèi)部參數(shù),
tdb
循環(huán)辦理;⑿.
拿出源、目的地點,再次求
er;⒀.
還要持續(xù)循環(huán)嗎⒁.
while(/*((orgdst!=newdst)||(orgsrc!=newsrc))*/(orgedst!=
&&&&er);⒂.
硬件頭辦理;⒃.
求物理接口,尋路由;⒄.
發(fā)送。ip_send(skb)intipsec_tunnel_detach(structdevice*dev,structipsecpriv*prv)目的:將某個綁定了的虛接口排除綁定。參數(shù):返回值:算法描繪:
0將
――成功,非0值――未成功prv的各個值清空intipsec_tunnel_clear(void)目的:去除所有的綁定虛接口。參數(shù):
無返回值:算法描繪:
0將
――成功,非0值――未成功prv的各個值清空intipsec_tunnel_cleanup_devices(void)目的:去除4個注冊的ipsec虛接口。參數(shù):無返回值:0――去除成功,非0值――去除未成功算法描繪:1.調(diào)用系統(tǒng)調(diào)用unregister_netdev(&dev_ipsec0~3)去除虛構(gòu)接口;2.調(diào)用系統(tǒng)調(diào)用kfree_s(dev_ipsec0~,sizeof(structipsecpriv))開釋為虛接口分派的空間。接收辦理模塊綱要說明功能主要負(fù)責(zé)辦理接收到的ipsec數(shù)據(jù)包。構(gòu)成文件文件流程如圖3-1所示。傳輸層辦理正常包辦理包辦理重組出門包查找SA庫加認(rèn)證加密進入策略辦理檢查SA狀態(tài)、生計期依據(jù)SA進行辦理IPSec辦理解密認(rèn)證分片重組辦理當(dāng)?shù)匕亟M進入包IP路由鏈路層接收包
轉(zhuǎn)發(fā)到本網(wǎng)關(guān)內(nèi)的包
依據(jù)SA進行辦理IPSec辦理IP路由檢查SA狀態(tài)、重播窗口、生計期查找SA庫繞過應(yīng)用拋棄IP分片辦理策略辦理鏈路層發(fā)送包正常包辦理包辦理策略庫查找虛接口驅(qū)動物理接口驅(qū)動物理接口驅(qū)動虛接口驅(qū)動鏈路層圖3.1傳統(tǒng)IPSec網(wǎng)關(guān)接收和轉(zhuǎn)發(fā)包表示圖函數(shù)說明intipsec_rcv(structsk_buff*skb,unsighedshortxlen)目的:接收并辦理ipsec數(shù)據(jù)包。參數(shù):skb-接收到的數(shù)據(jù)包,xlen-返回值:0――登記成功,非0值――登記未成功算法描繪:1.SKB正確性判斷〔有無數(shù)據(jù),頭長度等〕;2.假如包被克隆過,對包進行一個留頭辦理,為后邊做準(zhǔn)備;3.是AH或ESP格式嗎〔只支持這兩種格式〕不是那么拋棄包;4.進入解報循環(huán);⑴是ESP包但長度不是4字節(jié)的倍數(shù),拋棄?!惨駿SP包會有補齊考證,見組報〕;⑵計算ESP或AH頭,求出said〔spi,proto,等〕;⑶假定為AH頭,計算頭長度和下一個頭;⑷為tdb鏈加鎖;⑸拿出tdbp〔TDB頭〕,假定為空,拋棄包;tdb的狀態(tài)對嗎larval,dead以及超時〔有多種狀況〕均將拋棄包;⑺依據(jù)認(rèn)證標(biāo)記tdbp->tdb_authalg對數(shù)據(jù)包進行考證;⑻對ESP包進行解密;⑼計算新的IP數(shù)據(jù)包頭;⑽解鎖;〔中間拋棄包時也先解鎖〕⑾假如新的數(shù)據(jù)包仍是IPSec包,循環(huán)辦理;5.對tdb鏈進行辦理;6.把解開的包送入IP接收行列。netifrx(skb)。安全結(jié)盟的管理模塊綱要說明功能實現(xiàn)了對SA數(shù)據(jù)庫的初始化,增添、刪除或更新SA。構(gòu)成文件,變量說明tdb結(jié)構(gòu)structtdb{
/*tunneldescriptorblock*/structtdb*tdb_hnext;/*nextinhashchain*/structtdb*tdb_onext;/*nextinoutput*/structtdb*tdb_inext;/*nextininput(prev!)*/structifnet*tdb_rcvif;/*relatedrcvencapinterface*/structsa_idtdb_said;/*SAID*/__u32tdb_seq;/*seqnumofmsgthatsetthisSA*/__u32
tdb_pid;
/*PIDofprocessthatsetthisSA*/#if1structxformswcaddr_t
*tdb_xform;/*transformationtouse(hostorder)*/tdb_xdata;/*transformationdata(opaque)*/#endif__u8__u8
tdb_authalg;tdb_encalg;
/*authalgorithmforthisSA*//*encalgorithmforthisSA*/__u32tdb_alg_errs;/*numberofalgorithmerrors*/__u32tdb_auth_errs;/*numberofauthenticationerrors*/__u32tdb_encsize_errs;/*numberofencryptionsizeerrors*/__u32tdb_encpad_errs;/*numberofencryptionsizeerrors*/__u32tdb_replaywin_errs;/*numberofpktsequenceerrors*/__u8tdb_replaywin;/*replaywindowsize*/__u8tdb_state;/*stateofSA*/__u32tdb_replaywin_lastseq;/*lastpktsequencenum*/__u64tdb_replaywin_bitmap;/*bitmapofreceivedpkts*/__u32tdb_replaywin_maxdiff;/*maximumpktsequencedifference*/__u32tdb_flags;/*genericxformflags*/__u32tdb_lifetime_allocations_c;/*seerfc2367*/__u32tdb_lifetime_allocations_s;__u32tdb_lifetime_allocations_h;__u64tdb_lifetime_bytes_c;__u64tdb_lifetime_bytes_s;__u64tdb_lifetime_bytes_h;__u64tdb_lifetime_addtime_c;__u64tdb_lifetime_addtime_s;__u64tdb_lifetime_addtime_h;__u64tdb_lifetime_usetime_c;__u64tdb_lifetime_usetime_s;__u64tdb_lifetime_usetime_h;__u64tdb_lifetime_packets_c;__u64tdb_lifetime_packets_s;__u64tdb_lifetime_packets_h;__u64tdb_lifetime_usetime_l;/*lasttimetransformwasused*/structsockaddr*tdb_addr_s;/*srcsockaddr*/structsockaddr*tdb_addr_d;/*dstsockaddr*/structsockaddr*tdb_addr_p;/*proxysockaddr*/__u16tdb_addr_s_size;__u16tdb_addr_d_size;__u16tdb_addr_p_size;__u16tdb_key_bits_a;/*sizeofauthkeyinbits*/__u16tdb_auth_bits;/*sizeofauthenticatorinbits*/__u16tdb_key_bits_e;/*sizeofenckeyinbits*/__u16tdb_iv_bits;/*sizeofIVinbits*/__u8tdb_iv_size;__u16tdb_key_a_size;__u16tdb_key_e_size;caddr_ttdb_key_a;/*authenticationkey*/caddr_ttdb_key_e;/*encryptionkey*/caddr_ttdb_iv;/*InitialisationVector*/__u16tdb_ident_type_s;/*srcidentitytype*/__u16tdb_ident_type_d;/*dstidentitytype*/__u64tdb_ident_id_s;/*srcidentityid*/__u64tdb_ident_id_d;/*dstidentityid*/__u8tdb_ident_len_s;/*srcidentitytype*/__u8tdb_ident_len_d;/*dstidentitytype*/caddr_ttdb_ident_data_s;/*srcidentitydata*/caddr_ttdb_ident_data_d;/*dstidentitydata*/#if0sens#endif};函數(shù)說明intipsec_tdbinit(void)目的:初始化tdb鏈。參數(shù):
無返回值:算法描繪:
0將
――成功,非tdb鏈清空。
0值――失敗inttdb_init(structtdb*tdbp,structencap_msghdr*em)目的:參數(shù):返回值:0――成功,非0值――失敗算法描繪:intputtdb(structtdb*tdbp)目的:將一個新的tdb塊-tdbp參加在tdbh鏈中參數(shù):tdbp――要增添的tdb塊返回值:0――成功,非0值――失敗算法描繪:判斷傳入的tdbp能否為空,假定為空,返回失敗信息;計算依據(jù)tdbp->tdb_spi、tdbp->和tdbp->tdb_proto計算出hashval;將tdb鏈加鎖,免得同時有其余存取tdb鏈的行為;將tdbp插入tdb鏈中:tdbp->tdb_hnext=tdbh[hashval];tdbh[hashval]=tdbp;將tdb鏈解鎖。structtdb*gettdb(structsa_id*said)目的:
依據(jù)給出的
said值查找相應(yīng)的
tdb
塊。參數(shù):
said
――與要查找的
tdb
塊相應(yīng)的
said值返回值:
structtdb
――找到的
tdb
塊,NULL
――失敗算法描繪:判斷
said值能否有效,假定為空,返回
NULL;依據(jù)
said
計算
hashval;依據(jù)hashval值找到所要的tdb塊,失敗那么返回NULL。intdeltdb(structtdb*tdbp)目的:刪除某個指定的tdb塊。參數(shù):tdbp――要刪除的tdb塊返回值:0――成功,非0值――失敗算法描繪:判斷tdbp的有效性,假定無效,那么返回失敗信息;計算hashval值;依據(jù)hashval找到tdbp,并刪除它,假定失敗,返回錯誤。intdeltdbchain(structtdb*tdbp)目的:刪除整個tdbp鏈。參數(shù):tdbp――要刪除的tdb鏈返回值:0――成功,非0值――失敗算法描繪:判斷tdbp能否有效,假定無效,返回錯誤信息;將tdbp移至最后的tdbp->tdb_onext;刪除所有的tdb塊。intipsec_tdbwipe(structtdb*tdbp)目的:將指定tdb塊中的所有值清空。參數(shù):tdbp――要清空的tdb塊返回值:0――成功,非0值――失敗算法描繪:將所有值置為NULL。安全策略數(shù)據(jù)庫的管理模塊綱要說明功能實現(xiàn)了對SPD數(shù)據(jù)庫的初始化,增添、刪除eroute。構(gòu)成文件,變量說明eroutestructeroute{structrjtentryer_rjt;structsa_ider_said;structsockaddr_encaper_eaddr;structsockaddr_encaper_emask;};函數(shù)說明intipsec_radijinit(void)目的:初始化radij樹參數(shù):無返回值:0――成功,非0值――失敗算法描繪:調(diào)用rj_init()函數(shù)初始化。intipsec_makeroute(structsockaddr_encap*eaddr,structsockaddr_encap*emask,structsa_idsaid)目的:依據(jù)said值,生成新的eroute項。參數(shù):eaddr――封裝的有效目的地點,emask――封裝的目的地點掩碼,said――傳入的said值返回值:0――成功,非0值――失敗算法描繪:分派
eroute
空間――
retrt,并先清
0;給
retrt
賦值:retrt->er_eaddr
=*eaddr;
retrt->er_emask
=*emask;retrt->er_said=said;給eroute表加鎖;調(diào)用函數(shù)rj_addroute(&(retrt->er_eaddr),&(retrt->er_emask),rnh,retrt->,向eroute表中參加重生成的該項;解鎖,返回。intipsec_breakroute(structsockaddr_encap*eaddr,structsockaddr_encap*emask)目的:刪除指定的route。參數(shù):eaddr――有效目的地點,emask返回值:0――成功,非0值――失敗算法描繪:
-目的地點的掩碼鎖住eroute表;調(diào)用函數(shù)rj_delete(eaddr,emask,rnh,&rn)
刪除這個指定route;解鎖,將該route項清0,調(diào)用系統(tǒng)調(diào)用kfree開釋該空間。structeroute*ipsec_findroute(structsockaddr_encap*eaddr)目的:
接收并辦理
ipsec數(shù)據(jù)包。參數(shù):
eaddr
――要查找的
route
所擁有的
eaddr
值返回值:
structeroute
――找到的
eroute
值,NULL
――
未找到算法描繪:調(diào)用函數(shù)rj_match((caddr_t)eaddr,rnh),依據(jù)eaddr查找相應(yīng)的eroute項;返回找到的eroute項。intipsec_cleareroutes(void)目的:清空eroute表。參數(shù):無返回值:0――成功,非0值――失敗算法描繪:第一,鎖住eroute表;調(diào)用函數(shù)radijcleartree()函數(shù);解鎖,返回。intipsec_radijcleanup(void)目的:參數(shù):無返回值:0――成功,非0值――失敗算法描繪:第一,鎖住eroute表;調(diào)用函數(shù)radijcleanup()函數(shù);解鎖,返回。密鑰磋商及管理模塊綱要說明功能前面所描繪的KLIPS模塊,根本達(dá)成了對輸入、輸出數(shù)據(jù)包的加密、認(rèn)證工作,但其前提是辦理數(shù)據(jù)包的SA已經(jīng)磋商完成,而這個SA的磋商工作正是由IKE所負(fù)責(zé)的。在本程序中,Pluto模塊是IKE的一個實現(xiàn),它能夠自動達(dá)成兩個主機或網(wǎng)關(guān)間的安全結(jié)盟的磋商工作。源代碼構(gòu)成――――Pluto
源文件目錄||――|――
監(jiān)聽
啟動后臺進度plutoIKE信息、whack信息和
的主程序pfkey信息,調(diào)用相應(yīng)辦理過程||――|――|――
由server調(diào)用,辦理IKE信息辦理IKE信息的頭文件,主要定義信息的結(jié)構(gòu)描繪成立ISAKMPSA和IPSECSA的過程|――
state頭文件,主要定義
state結(jié)構(gòu)|――
描繪對
state的各樣操作,為成立
SA效力|――
connection頭文件,定義
connection
結(jié)構(gòu)|――
描繪對
connection的各樣操作,為成立
SA效力|――
結(jié)構(gòu)和分析
SA載荷,為成立
SA效力|――
定義了各樣
ISAKMP包的信息頭格式,以及結(jié)構(gòu)信息頭的算法和分析信息頭的算法|――與成立SA有關(guān)的各樣定義|――描繪對cookies值的各樣操作|――調(diào)用加密算法的接口模塊|――ID的表示及操作|――辦理時間事件|――隨機數(shù)函數(shù)模塊|――SHA-1散列函數(shù)模塊|――MD5散列函數(shù)模塊|――DSA署名模塊|――共享密鑰的辦理模塊|――其余一些函數(shù)的定義|――|――|――|――||――由server調(diào)用,辦理whack信息|――接收ipsecwhack命令,結(jié)構(gòu)相應(yīng)的whack信息,發(fā)送到whackfd,由監(jiān)聽,發(fā)到辦理||――由server調(diào)用,辦理pfkey信息,操作內(nèi)核中的SADB庫||――日記辦理模塊|――啟動模塊綱要說明功能啟動Pluto后臺進度。源代碼構(gòu)成函數(shù)說明intmain(intargc,charargv)目的:剖析使用程序的參數(shù),做pluto進度的初始化工作參數(shù):argcargv返回值:0――成功,非0值――失敗算法:剖析使用pluto的命令行參數(shù),并做相應(yīng)的操作;調(diào)用函數(shù)init_log(),初始化日記;調(diào)用函數(shù)init_rnd_pool(),初始化隨機數(shù)池;調(diào)用函數(shù)init_secret(),生成密鑰值;調(diào)用函數(shù)init_states(),初始化狀態(tài)表〔statetable〕;3.調(diào)用函數(shù)init_crypto(),做好加密準(zhǔn)備;4.調(diào)用函數(shù)init_demux(),填補state_microcode_table;5.調(diào)用函數(shù)call_server(),啟動效力器,監(jiān)聽到來的ISAKMP包和Whcak信息。intcreate_lock(void)目的:生成一個lockfile文件,以保證同時只有一個pluto進度運轉(zhuǎn)參數(shù):無返回值:0――成功,非0值――失敗算法:略intdelete_lock(void)目的:刪除lockfile文件參數(shù):無返回值:0――成功,非0值――失敗算法:略voidexit_pluto(intstatus)目的:以status的狀態(tài)走開pluto進度。參數(shù):status――0ok1generaldiscomfor10lockfileexists返回值:無算法:略監(jiān)聽模塊綱要說明功能該模塊主要用于監(jiān)聽SA磋商信息――IKE信息、whack信息和pfkey信息,收到上述幾種信息后,再調(diào)用相應(yīng)辦理模塊。源代碼構(gòu)成文件函數(shù)說明voidcall_server(void)目的:監(jiān)聽SA磋商信息――IKE信息、whack信息和pfkey信息,收到上述幾種信息后,再調(diào)用相應(yīng)辦理模塊。參數(shù):無返回值:無算法:調(diào)用函數(shù)init_pfkeyed(),創(chuàng)辦PF_KEY種類的套接口;調(diào)用函數(shù)init_whackfd(),創(chuàng)辦AF_UNIX型套接口,用于通訊;進入循環(huán)等候,接收到來的信息:假如收到
IKE磋商信息,調(diào)用函數(shù)
comm_handle()
辦理;假如收到
whack
信息,調(diào)用函數(shù)
whack_handle()辦理;假如收到
pfkey
信息,調(diào)用函數(shù)
pfkey_handle()辦理。voidfind_ifaces(void)目的:參數(shù):無返回值:無算法:staticintinit_pfkeyfd(void)目的:創(chuàng)辦PF_KEY型的套接口參數(shù):無返回值:-1――失敗,其余――成功算法:調(diào)用系統(tǒng)調(diào)用socket()創(chuàng)辦socket,返回之。staticintinit_whackfd(void)目的:創(chuàng)辦AF_UNIX型的套接口。參數(shù):無返回值:-1――失敗,其余――成功算法:調(diào)用系統(tǒng)調(diào)用socket()創(chuàng)辦套接口,并用bind()綁定到ctl_addr上,調(diào)用系統(tǒng)調(diào)用listen()監(jiān)聽。磋商安全結(jié)盟的模塊綱要說明功能磋商ISAKMPSA和IPSECSA。源代碼構(gòu)成詳盡說明ISAKMPSA的成立過程(主模式)信息1:倡始方的Cookie值CKY-、I倡始方提出的一個或多個對ISAKMP信息的保護方案staticstf_statusmain_outI1(intwhack_sock,structconnection*c,boolpending_quick,lset_tpolicy,unsignedlongtry)目的:倡始連結(jié)c的SA的磋商,在這個初始磋商信息中,將發(fā)送倡始方的
cookie
值,和對ISAKMP信息的保護方案。參數(shù):whack_sock――whack套接口c――這個初始磋商信息是為c這個連結(jié)發(fā)出的pending_quick――表記在生成ISAKMPSA后,能否需要立刻磋商policy――安全策略try――倡始方最多能夠重試的磋商次數(shù)
IPSECSA返回值:STF_NO_REPLY――成功;其余――有錯誤算法:調(diào)用函數(shù)
new_state(),為這個
connection-c結(jié)構(gòu)一個新的
state;給這個
state
結(jié)構(gòu)
st
的成員變量賦值,此中局部值以下:st->st_connection=c;
st->st_try=try;
nterface
等于
NULL,返回
TRUE;與內(nèi)核SADB引擎的交互模塊綱要說明功能將磋商好的SA安裝到內(nèi)核中的SADB庫中,或依照要求從SADB中刪除作廢的SA,等等。原理是,結(jié)構(gòu)pfkey信息,發(fā)送到pfkey套接口,內(nèi)核的SADB引擎收到后,分析信息,達(dá)成相應(yīng)操作?!瞤fkey的詳情拜見PF_KEY模塊〕源代碼構(gòu)成文件函數(shù)說明voidpfkey_handle(void)目的:從讀取pfkeyfd套接口讀取pfkey信息,并剖析此信息參數(shù):無返回值:無算法:調(diào)用系統(tǒng)調(diào)用read(),從pfkeyfd套接口讀取pfkey信息;調(diào)用函數(shù)pfkey_msg_parse()剖析收到的信息;ipsec_spi_tget_ipsec_spi(ipsec_spi_tavoid)目的:生成獨一的SPI值參數(shù):avoid返回值:ipsec_spi_t算法:略booldo_command(structconnection*c,constchar*verb)目的:啟動_updown腳本,履行此中的防火墻命令規(guī)那么參數(shù):返回值:算法:boolpfkey_build(interror,constchar*description,constchar*text_said,sturctsadb_ext*extensions[SADB_EXT_MAX+1])目的:調(diào)用其余結(jié)構(gòu)函數(shù),假如結(jié)構(gòu)成功,返回TRUE,失敗,在開釋extensions的空間返回FALSE。參數(shù):返回值:TRUE――,F(xiàn)ALSE――算法:略boolfinish_pfkey_msg(structsadb_ext*extensions[SADB_EXT_MAX+1],constchar*description,constchar*text_said)目的:結(jié)束pfkey信息的結(jié)構(gòu)。參數(shù):extensions[]――description――text_said――返回值:FALSE――失敗,TURE――成功算法:調(diào)用函數(shù)pfkey_msg_build(&pfkey_msg,extensions,EXT_BITS_IN),結(jié)構(gòu)pfkey信息,假定結(jié)構(gòu)失敗,返回FALSE;調(diào)用系統(tǒng)調(diào)用write(pfkeyfd,pfkey_msg,len),將pfkey信息發(fā)送出去如發(fā)送失敗,那么返回FALSE;調(diào)用函數(shù)pfkey_extensions_free(extensions)和pfkey_msg_free(&pfkey_msg)開釋空間。booldo_eroute(structstate*st,unsignedop,constchar*opnameUNUSED)目的:依據(jù)要成立的一個SA,結(jié)構(gòu)一個eroute表項〔結(jié)構(gòu)和發(fā)送的都是地點信息〕。參數(shù):st――描繪一個SA的狀態(tài)op――UNUSED――返回值:TRUE――成功,F(xiàn)ALSE――失敗算法:依據(jù)st獲取SPI值和protocol;調(diào)用函數(shù)set_text_said(),將計算所得的said放入text_said中;將六個地點轉(zhuǎn)變?yōu)榻Y(jié)構(gòu)的變量:、、、、、;調(diào)用函數(shù)pfkey_extensions_init(extensions),初始化extensions;調(diào)用信息結(jié)構(gòu)函數(shù)pfkey_build結(jié)構(gòu)信息,并調(diào)用finish_pfkey_build()發(fā)送出去。
達(dá)成結(jié)構(gòu),把信息booldel_spi(ipsec_spi_tspi,intproto,structin_addrsrc,structin_addrdest)目的:刪除一個SA。參數(shù):spi――SPI值proto――協(xié)議src――源地點dst――目的地點返回值:TRUE――成功,F(xiàn)ALSE――失敗算法:調(diào)用函數(shù)pfkey_extensions_init(extensions),進行結(jié)構(gòu)信息以前的初始化;調(diào)用函數(shù)set_text_said(),設(shè)置text_said值;調(diào)用函數(shù)pfkey_build(),結(jié)構(gòu)刪除一個SA的pfkey信息,調(diào)用函數(shù)finish_pfkey_build()結(jié)束結(jié)構(gòu),并發(fā)送。boolsetup_half_ipsec_sa(structstate*st,boolinbound)目的:成立半個SA〔即,兩個網(wǎng)關(guān)或主機之間,對于此中某一個來說,數(shù)據(jù)包進入或出去的所用SA〕參數(shù):st――描繪一個SA的狀態(tài)INBOUND――表示此SA是進入的仍是出門的返回值:TRUE――成功,F(xiàn)ALSE――失敗算法:依據(jù)st,調(diào)用函數(shù)pfkey_build()結(jié)構(gòu)適合的pfkey信息,再調(diào)用函數(shù)finish_pfkey_build()發(fā)送;假定此過程中有錯誤發(fā)生,那么返回FALSE,否那么,返回TRUE。boolteardown_half_ipsec_sa(structstate*st,boolinbound)目的:刪除半個SA〔即,兩個網(wǎng)關(guān)或主機之間,對于此中某一個來說,數(shù)據(jù)包進入或出去的所用SA〕參數(shù):st――描繪一個SA的狀態(tài)INBOUND――表示此SA是進入的仍是出門的返回值:TRUE――成功,F(xiàn)ALSE――失敗算法:依據(jù)st,拿出該SA中設(shè)置的spi、proto,調(diào)用函數(shù)del_spi刪除它。boolcould_eroute(structconnection*c,structconnection*ero)目的:參數(shù):c――描繪一個connectionero――返回值:TRUE――成功,F(xiàn)ALSE――失敗算法:boolinstall_inbound_ipsec_sa(structstate*st)目的:
安裝
SA,僅被被響應(yīng)方使用,響應(yīng)方接著會用
install_ipsec_sa
來安裝
outbound
的SA;而倡始方使用
install_ipsec_sa
來安裝
inbound
和
outbound
的SA。參數(shù):st――描繪一個SA的狀態(tài)返回值:TRUE――成功,F(xiàn)ALSE――失敗算法:假如對方的client有固定的IP地點,檢查我們能否有一條抵達(dá)那邊的路由,此刻的相矛盾〔不知道這樣說對不對〕;假如有,那么刪除之;
這條路由與用函數(shù)could_eroute(c,route_owner(c,TRUE)),我能否有eroute表,假如沒有,返回FALSE;用函數(shù)route_connection(c,FALSE),我能否能夠?qū)⒊鲩T的數(shù)據(jù)包路由到某個ipsec虛接口。事上,只了我的peer不在他的子網(wǎng)中,或許假如他在,我使用UDP500端口的IKE信息,使得它不被理;用函數(shù)setup_half_ipsec_sa(st),成立入的SA。boolinstall_ipsec_sa(structstate*st,boolinbound_alse)目的:安裝SA。參數(shù):st――描繪一個SA的狀inbound_also――個SA是inbound,或outbound返回:TRUE――成功,F(xiàn)ALSE――失算法:用函數(shù)route_owner(c,TRUE),找是有個
eroute;用函數(shù)could_eroute(c,ero),;用函數(shù)route_connection(c,TRUE),我能否能夠?qū)⒊鲩T的數(shù)據(jù)包路由到某個ipsec虛接口;用函數(shù)
setup_half_ipsec_sa(),依據(jù)
inbound_also,成立入的或出門的
SA;假如成立成功,假如c->eroute_ownerSOS_NOBODY,用函數(shù)do_eroute(?,〞add〞)增添eroute表,再用函數(shù)do_command()啟腳本;假如不是SOS_NOBODY,用do_eroute(?,〞replace更新〞)eroute表。booldelete_ipsec_sa(structstate*st,boolinbound_only)目的:安裝SA。參數(shù):st――描繪一個SA的狀inbound_only――能否只inbound的SA返回:TRUE――成功,F(xiàn)ALSE――失算法:假如inbound_onlyTRUE,用函數(shù)teardown_half_ipsec_sa()除半個SA;假如inbound_onlyFALSE,判斷能否c->eroute_owner==st->st_serialno,假如相等,用函數(shù)do_command(?,〞down〞)啟腳本關(guān),及用do_eroute(?,〞delete〞)除eroute;假如上述步驟成功,再調(diào)用teardown_half_ipsec_sa()刪除SA。PF_KEY模塊綱要說明PF_KEY是一種新式的協(xié)議族,由
PF_ROUTE衍生而來。在協(xié)議族中,
PF_KEY被定義為15。目前,實現(xiàn)所依照的時
PF_KEY的第二個版本。密鑰管理進度能夠使用它與操作系統(tǒng)中的“keyengine〞或安全結(jié)盟數(shù)據(jù)庫〔SADB〕通訊,并使用PF_INET經(jīng)過網(wǎng)絡(luò)與遠(yuǎn)程密鑰管理進度進行通訊。密鑰管理進度與PF_KEY的關(guān)系以下列圖:++|KeyMgmtDaemon|++||||Applications=====[PF_KEY]====[PF_INET]==========================||OSKernel++++|KeyEngine||TCP/IP,||orSADB||includingIPsec|++||++|++|Network||Interface|++Figure1:RelationshipofKeyMgmttoPF_KEY該模塊大概由四局部構(gòu)成:PF_KEYv2KeymanagementAPIdomainsocketI/FPF_KEYv2KeymanagementAPImessageparser供給了一個可用于IPsec密鑰管理函數(shù)庫〔keymanagementAPI〕。PF_KEYv2KeymanagementAPImessageparser實現(xiàn)用戶層與核心之間對于密鑰磋商的交互辦理功能實現(xiàn)pfkey_v2協(xié)議族,用于密鑰磋商進度pluto與內(nèi)核的管理SADB的進度間通訊。構(gòu)成文件,,,,,PF_KEY的信息體制PF_KEY有一套獨到的信息行為,不像其余大部分BSDsocket采納的bind()、connect()、accept()、listen()等操作來實現(xiàn)通訊。正常狀況下,正確格式的信息發(fā)給內(nèi)核,內(nèi)核將應(yīng)答信息返回到PF_KEYsocket中。假如內(nèi)核檢測到錯誤,錯誤表記會隨應(yīng)答信息一同被發(fā)送出去。PF_KEY有以下幾種信息行為:SADB_REGISTER信息:進度向內(nèi)核注冊一個socket以便能夠從內(nèi)核獲取新的SA。信息格式為:<base>,即只包含信息根本頭。內(nèi)核將發(fā)送SADB_REGISTER信息進行應(yīng)答,格式為:<base,supported>,supported擴展說明內(nèi)核所支持的考證算法和密鑰算法。SADB_ACQUIRE信息:這個信息是由內(nèi)核發(fā)出的,能夠用于兩種狀況:⑴.內(nèi)核向密鑰管理進度申請創(chuàng)辦一個SA。信息格式為:<base,address,proposal>,此中,proposal擴展給出了SA的幾種提案,即采納什么協(xié)議〔AH或ESP〕、采納什么考證方法和加密方法等;擴展數(shù)據(jù)中還可包含的選項有:Identity擴展,Sensitivity擴展。但,密鑰管理進度其實不向內(nèi)核發(fā)送SADB_ACQUIRE應(yīng)答信息。⑵.當(dāng)密鑰磋商過程失敗后,內(nèi)核經(jīng)過發(fā)送SADB_ACQUIRE信息來通知密鑰管理進度。信息格式為:<base>,即只包含一個信息根本頭,此中,信息錯誤號代表了錯誤的原由。密鑰管理進度不向內(nèi)核發(fā)送SADB_ACQUIRE應(yīng)答信息。3.SADB_GETSPI信息:密鑰管理進度向內(nèi)核申請一個SPI。信息格式為:<base,address,SPIrange>,SPIrange擴展指出了所申請的SPI的范圍。內(nèi)核發(fā)送SADB_GETSPI應(yīng)答信息,格式為:<base,SA(*),address>,此中,SA(*)表示SA擴展的各個字段,除了擴展長度、擴展種類和SPI外,其余字段應(yīng)設(shè)為0被忽視掉。4.SADB_UPDATE信息:密鑰管理進度懇求內(nèi)核更新〔或〕增添一條SA記錄,該信息隨SADB_GETSPI信息一同使用。信息格式為:<base,SA,address,key>,擴展數(shù)據(jù)中還可包含的選項有:lifetime擴展、identity擴展、sensitivity擴展。內(nèi)核發(fā)送SADB_UPDATE應(yīng)答信息,格式為:<base,SA,address>,或許還包含與懇求信息相應(yīng)的擴展數(shù)據(jù)。5.SADB_ADD信息:在手工配置密鑰或知道SPI的狀況下,不必先使用GETSPI信息而直接申請內(nèi)核更新〔或增添〕一條SA記錄。信息格式與SADB_UPDATE信息同樣。內(nèi)核發(fā)送的SADB_ADD應(yīng)答信息與SADB_UPDATE應(yīng)答信息同樣。6.SADB_DELETE信息:密鑰管理進度懇求內(nèi)核刪除一條SA記錄。信息格式為:<base,SA(*),address>,即依據(jù)SA種類、SPI、地點三因素刪除相應(yīng)的SA。內(nèi)核發(fā)送SADB_DELETE應(yīng)答信息為:<base,SA(*),address>。7.SADB_GET信息:密鑰管理進度懇求從內(nèi)核檢索一條SA記錄。信息格式為:<base,SA(*),address>。內(nèi)核發(fā)送SADB_GET應(yīng)答信息為:<base,SA,address,key>,擴展數(shù)據(jù)中還可包含的選項有:lifetime擴展、identity擴展、sensitivity擴展,即應(yīng)答信息給出SA的詳盡信息。8.SADB_EXPIRE信息:內(nèi)核向密鑰管理進度發(fā)送SA過期信息。信息格式為:<base,SA,lifetime,address>,lifetime擴展給出了SA的目前時間和過期時間〔軟過期和硬過期〕。密鑰管理進度不向內(nèi)核發(fā)送SADB_EXPIRE應(yīng)答信息。9.SADB_FLUSH信息:密鑰管理進度懇求內(nèi)核將某種種類的SA從信息根本頭中SA種類字段給出了所要刪除的
SADB中所有刪除。信息格式為:<base>,SA種類的值。內(nèi)核發(fā)送SADB_REGISTER應(yīng)答信息,格式為:
<base>。10.SADB_DUMP信息:一般用于PF_KEY實現(xiàn)的調(diào)試。工作原理下邊介紹使用PF_KEY的根來源理:REGISGTER:當(dāng)密鑰管理進度〔pluto〕開始運轉(zhuǎn)時,它需要通知PF_KEY它要接收兩種IPsec的信息——AH和ESP〔ItmusttellPF_KEYthatitiswillingtoacceptmessageforthetwoIPsecservices,AHandESP.〕:Pluto-?Kernel:SADB_REGISTERforESPKernel-?Registered:SADB_REGISTERforESP,SupporetedAlgorithmsPluto-?Kernel:SADB_REGISTERforAHKernel-?Registered:SADB_REGISTERforAH,SupporetedAlgorithms每一個REGISTER信息都會致使對所有PF_SOCKET套接口的回應(yīng)〔包含懇求者〕。SADB_ACQUIRE:當(dāng)KernelIPsec需要數(shù)據(jù)經(jīng)AH辦理時,它需要有能夠使用的SA,那么進行以下操作:1).Kernel-?Registered:SADB_ACQUIREforAH,addrs,ID,sens,proposals;2).Pluto讀取到這個ACQUIRE信息〔特別注意sadb_msg_seq〕后,它就會開始磋商SA:①第一,它向內(nèi)核發(fā)送一個SADB_GETSPI信息,此中的sadb_msg_seq值與剛才收到的信息中該值相等;即:Pluto-?Kernel:SADB_GETSPIforAH,addr,SPIrange②內(nèi)核把GETSPI的結(jié)果返回給所有的listeningsockets;即:Kernel-?All:SADB_GETSPIforAH,assoc,addrs③假如需要雙向的SPI值的話,pluto還會再次進行GETSPI操作;④此時,Pluto已經(jīng)有了能夠使用的SPI值,他能夠進行磋商了;⑤在Pluto獲取密鑰資料,磋商好其余參數(shù)以后,它將發(fā)送一個或多個SADB_UPDATE信息,此中的sadb_msg_seq的值與以前的同樣。假如在磋商時期發(fā)生錯誤,那么:Pluto-?Kernel:SADB_ACQUIREforAH,assoc〔withanerror〕Kernel-?All:SADB_ACQUIREforAH,assoc〔sameerror〕假如磋商成功,那么:Pluto-?Kernel:SADB_UPDATEforAH,assoc,addrs,keys,etc.Kernel-?All:SADB_UPDATEforAH,assoc,addrs,etc.即,Kernel會把UPDATE的結(jié)果〔除了密鑰〕返回給所有的監(jiān)聽端口。SADB_ADD:假如只在當(dāng)?shù)卮_立了一個SPI值,那么另一方一定用SADB_ADD信息增添SA:Pluto-?Kernel:SADB_ADDforAH,assoc,addrs,keys,etc.Kernel-?All:SADB_ADDforAH,assoc,addrs,etc.SADB_EXPIRE:數(shù)據(jù)結(jié)構(gòu)PF_KEY信息是由根本信息頭及后邊跟從的SA有關(guān)數(shù)據(jù)構(gòu)成的。根本的信息頭格式structsadb_msg{uint8_tsadb_msg_version;/*PF_KEY信息的版本號,應(yīng)當(dāng)為PF_KEY_V2,否那么視為錯誤*/uint8_tsadb_msg_type;/*描繪了該信息的種類,詳見下一節(jié)*/uint8_tsadb_msg_errno;/*發(fā)送方應(yīng)當(dāng)將該變量置為0,而響應(yīng)方那么應(yīng)在此填寫錯誤代碼〔假如有錯〕*/uint8_tsadb_msg_satype;uint16_tsadb_msg_len;/*為單位*/
/*描繪了SA的種類*/整個信息〔包含根本信息頭和鄰近數(shù)據(jù)〕
的長度,以
64-bituint16_tsadb_msg_reserved;
/*保留值。發(fā)送方一定置
0。*/uint32_tsadb_msg_seq;/*這個信息的序列號。這個序列號和
sadb_msg_pid
一同,能夠用于獨一地表示一個對一個進度地懇求。發(fā)送方負(fù)責(zé)填寫這個字段
*/uint32_tsadb_msg_pid;/*
產(chǎn)生這個信息進度的進度號,比方,假定一個進度號為2112
的進度向內(nèi)核發(fā)送一個
SADB_UPDATE的信息,那么一定在此信息中將此地點為2112,而內(nèi)核的回應(yīng)信息中,也要
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 施工項目合同糾紛處理制度
- 施工日志填寫樣本建筑物消防設(shè)施工程
- 教師招聘語文面試唐詩三首教學(xué)設(shè)計
- 兩位好友合作經(jīng)營店鋪合同模板
- 個人與個人借款合同范本
- 中外合資企業(yè)采購合同中英文對照
- 中外合資經(jīng)營企業(yè)合同(適用于零售連鎖業(yè)務(wù))
- 個人二手房交易合同擔(dān)保協(xié)議書
- 專利交易合同協(xié)議
- 個人向企業(yè)借款合同樣板
- 小學(xué)生作文方格紙A4紙直接打印版
- 老人心理特征和溝通技巧
- 幼兒阿拉伯?dāng)?shù)字描紅(0-100)打印版
- 標(biāo)桿地產(chǎn)集團 研發(fā)設(shè)計 工程管理 品質(zhì)地庫標(biāo)準(zhǔn)研發(fā)成果V1.0
- TMS開發(fā)業(yè)務(wù)需求文檔
- 2023年1月浙江高考英語聽力試題及答案(含MP3+錄音原文)
- HI-IPDV10芯片產(chǎn)品開發(fā)流程V10宣課件
- 房產(chǎn)抵押注銷申請表
- 【課件】第三課 蒙娜麗莎 課件高中美術(shù)湘美版美術(shù)鑒賞
- 象數(shù)療法好療效
- A320系列飛行訓(xùn)練課程:電子飛行儀表系統(tǒng)概況
評論
0/150
提交評論