linux路由協(xié)議網(wǎng)絡(luò)協(xié)議棧_第1頁(yè)
linux路由協(xié)議網(wǎng)絡(luò)協(xié)議棧_第2頁(yè)
linux路由協(xié)議網(wǎng)絡(luò)協(xié)議棧_第3頁(yè)
linux路由協(xié)議網(wǎng)絡(luò)協(xié)議棧_第4頁(yè)
linux路由協(xié)議網(wǎng)絡(luò)協(xié)議棧_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

邁普學(xué)習(xí)總結(jié)經(jīng)過(guò)在公司里學(xué)習(xí)了幾個(gè)月,把大體的工作總結(jié)于下:在參加1800—203G路由的開(kāi)發(fā)中,我參加了l2tp,gre,靜態(tài)路由,ipsec,日志關(guān)鍵信息提取的編寫(xiě)。并同時(shí)參加了ipsec-tools源碼,linuxkernel網(wǎng)絡(luò)協(xié)議棧源碼,l2tpd源碼分析。并且同時(shí)了解了vrrp,rip等協(xié)議.L2TP模塊:L2tp代碼流程:連接請(qǐng)求連接請(qǐng)求lnslaclnslac連接成功lnslac連接成功lnslacPpp連接請(qǐng)求lnslacPpp連接請(qǐng)求lnslacPPpp允許連接協(xié)商lnslaclnslacPpp配置文件lnslacPpp配置文件lnslacPpp配置文件lnslacPpp配置文件lnslacPpp配置ACKlnslacPpp配置ACKlnslacPpp配置ACKlnslacPpp配置ACKlnslacPpp認(rèn)證lnslacPpp認(rèn)證lnslacncp網(wǎng)絡(luò)配置lnslacncp網(wǎng)絡(luò)配置lnslac接受ncp網(wǎng)絡(luò)配置lnslac接受ncp網(wǎng)絡(luò)配置lnslacACKlaclnsACKlaclns其中認(rèn)證過(guò)程分為pap和chap認(rèn)證:Pap認(rèn)證:認(rèn)證信息lnslac認(rèn)證信息lnslac通過(guò)認(rèn)證lnslac通過(guò)認(rèn)證lnslacChap認(rèn)證:發(fā)送加密數(shù)據(jù),使LAC認(rèn)證lnslac發(fā)送加密數(shù)據(jù),使LAC認(rèn)證lnslac認(rèn)證信息lnslac認(rèn)證信息lnslac通過(guò)認(rèn)證lns通過(guò)認(rèn)證lnslaclac大體過(guò)程應(yīng)該是這樣的,中間也許有錯(cuò),主要是記不大清楚了。Pppd向內(nèi)核注冊(cè)過(guò)程如下圖:internetinternet路由器lns路由器lac路由器lns路由器lac內(nèi)網(wǎng)2內(nèi)網(wǎng)1拓?fù)鋱D:內(nèi)網(wǎng)2內(nèi)網(wǎng)1做lac的路由器通過(guò)撥號(hào)到lns,通過(guò)上面的連接認(rèn)證后,lns會(huì)給lac安排一個(gè)私有ip地址,該Ip地址可以和2通信。通過(guò)這個(gè)過(guò)程后,久可以讓內(nèi)網(wǎng)1的pc訪問(wèn)內(nèi)網(wǎng)2的pc.Gre模塊:internet路由器內(nèi)網(wǎng)2路由器內(nèi)網(wǎng)1模型:internet路由器內(nèi)網(wǎng)2路由器內(nèi)網(wǎng)1開(kāi)頭的時(shí)候,內(nèi)網(wǎng)1和內(nèi)網(wǎng)2是不能相互到達(dá)的,由于中間有很多中間網(wǎng)絡(luò).當(dāng)建立好GRE隧道后,內(nèi)網(wǎng)1就可以和內(nèi)網(wǎng)2通信了。實(shí)現(xiàn):GRE腳本主要通過(guò)iproute2這個(gè)工具實(shí)現(xiàn)。使用的主要腳本命令:?Iprouteadd$namemodegreremote$remoteiplocal$localipttl255?Iprouteset$nameup?Iprouteaddnet$net/$maskdev$name腳本流程:腳本從lua保存的配置文件中獵取到上面的變量值,然后通過(guò)以上指令,將變量值設(shè)置到相應(yīng)的隧道中。責(zé)任:主要擔(dān)當(dāng)gre模塊的測(cè)試(與linux)。DDNS模塊:原理:DDNS又叫動(dòng)態(tài)域名解析。有用環(huán)境是在用戶(hù)動(dòng)態(tài)獵取IP地址的情況下。由于傳統(tǒng)的DNS只能與固定IP地址綁定,一旦IP地址發(fā)生變化,相應(yīng)的域名將不能解析到變換后的IP地址上.然后DDNS轉(zhuǎn)變了這一點(diǎn).它以動(dòng)態(tài)域名綁定的方式來(lái)完成這一點(diǎn)。什么叫動(dòng)態(tài)域名呢?就是指在用戶(hù)的IP地址發(fā)生轉(zhuǎn)變時(shí),相應(yīng)的DDNS客戶(hù)端會(huì)把自己現(xiàn)在的變化后的IP地址傳給DDNS服務(wù)器,告知它自己的IP地址已經(jīng)發(fā)生變化,需要服務(wù)器將以前綁定域名的IP換成現(xiàn)在變化后的IP地址。如果內(nèi)部在加上端口映射,那么久可以實(shí)現(xiàn)路由器內(nèi)部的主機(jī)間接與DNS綁定,即其他人通過(guò)域名就能訪問(wèn)的內(nèi)網(wǎng)的某臺(tái)計(jì)算上的服務(wù)器。責(zé)任:DDNS的測(cè)試。靜態(tài)路由模塊:原理:舉個(gè)例子,當(dāng)一個(gè)路由器剛接入到一個(gè)網(wǎng)絡(luò)中時(shí),在這個(gè)陌生的環(huán)境中,它根本不知道去某個(gè)地址該怎么走,靜態(tài)路由就相當(dāng)于一個(gè)指路人,它告知路由器某個(gè)IP地址該怎么走。配置的時(shí)候,只需要告知路由器到達(dá)某個(gè)網(wǎng)絡(luò)需要從哪張網(wǎng)卡和相應(yīng)網(wǎng)卡出去的網(wǎng)關(guān)地址就可以了.這樣凡是到那個(gè)網(wǎng)絡(luò)的IP數(shù)據(jù)包,路由器都會(huì)將它從相應(yīng)網(wǎng)卡轉(zhuǎn)發(fā)出去(ttl-1)。它并不關(guān)心數(shù)據(jù)包能否真正的到達(dá)。實(shí)現(xiàn):簡(jiǎn)略命令:routeadd–net$netmask$netmaskgw$gatewaydev$device責(zé)任:靜態(tài)路由的腳本的基本框架.Ipsec模塊:原理:在內(nèi)核2.6版本中已經(jīng)存在ipsec模塊,該模塊的主要作用是讓數(shù)據(jù)包經(jīng)過(guò)加密/認(rèn)證從平安的隧道中到達(dá)指定的目標(biāo)地址。它的有幾種數(shù)據(jù)包格式,一種是esp,一種是ah,另一種是esp+ah.他們的報(bào)文格式如下:Ah是一種用于認(rèn)證報(bào)文,它主要是給數(shù)據(jù)包供應(yīng)認(rèn)證,防重放;ESP是一種用于加密報(bào)文,當(dāng)然它也有認(rèn)證的功能,并且也具有抗重放的機(jī)制。它是一種更優(yōu)越于AH的報(bào)文結(jié)構(gòu).另外,esp+ah則是一種集esp和ah于一身的格式,當(dāng)然它的平安性就更不行否認(rèn)了。整個(gè)模塊分為兩大類(lèi):第一類(lèi),kernelipsec的實(shí)現(xiàn),其次類(lèi)上層應(yīng)用程序ike即為ipsec模塊協(xié)商認(rèn)證算法和加密算法的協(xié)議。下面談?wù)刬ke協(xié)議.Ike協(xié)議分為兩個(gè)階段,第一階段協(xié)商對(duì)對(duì)方的身份進(jìn)行認(rèn)證,并且為其次階段的協(xié)商供應(yīng)一條平安牢靠的通道。第一個(gè)階段又分為3種模式,我們常用的有兩種模式,一個(gè)是主模式,一個(gè)是樂(lè)觀模式。其次階段主要對(duì)IPSEC的平安性能進(jìn)行協(xié)商,產(chǎn)生真正可以用來(lái)加密數(shù)據(jù)流的密鑰。主模式(IKESA階段):安全提議,轉(zhuǎn)換載荷,一些詳情接收端安全提議,轉(zhuǎn)換載荷,一些詳情接收端發(fā)起端發(fā)起端安全提議,轉(zhuǎn)換載荷,一些詳情接收端發(fā)起端安全提議,轉(zhuǎn)換載荷,一些詳情接收端發(fā)起端DH算法產(chǎn)生公共密鑰,密鑰交換接收端發(fā)起端DH算法產(chǎn)生公共密鑰,密鑰交換接收端發(fā)起端DH算法產(chǎn)生公共密鑰,密鑰交換接收端發(fā)起端DH算法產(chǎn)生公共密鑰,密鑰交換接收端發(fā)起端加密ID,進(jìn)行身份認(rèn)證接收端發(fā)起端加密ID,進(jìn)行身份認(rèn)證接收端發(fā)起端加密ID,進(jìn)行身份認(rèn)證接收端發(fā)起端加密ID,進(jìn)行身份認(rèn)證接收端發(fā)起端以上過(guò)程中包含驗(yàn)證信息,我就沒(méi)格外指出了.簡(jiǎn)略參見(jiàn)如下:發(fā)送cockie包,用來(lái)標(biāo)識(shí)唯一的一個(gè)IPSEC會(huì)話。IKE階段一(主模式):發(fā)送消息1

initiator====〉responsor?

isakmpheader?

sapayload?

proposalpayload?

transformpayload

定義一組策略:?

加密方法:DES?

認(rèn)證身份方法:預(yù)共享密鑰?

認(rèn)證散列:MD5?

存活時(shí)間:86400秒?

Diffie-Hellmangroup:1IKE階段二(主模式):發(fā)送消息2

initiator〈====responsor

同上IKE階段三(主模式):發(fā)送消息3

initiator====>responsor?

通過(guò)DH算法產(chǎn)生共享密鑰?

KE(KeyExchang)Payload?

nonce(臨時(shí))PayloadDH算法:

A:

P(較大的質(zhì)數(shù))

B:P(較大的質(zhì)數(shù))?

G

PriA(隨機(jī)產(chǎn)生)

PriB(隨機(jī)產(chǎn)生)

?

PubA=G^PriAmodP

PubB=G^PriBmodP?

交換PubA和PubB?

Z=PubB^PriAmodP

Z=PubA^PriBmodP

Z就是共享密鑰,兩個(gè)自我產(chǎn)生的Z應(yīng)相同,它是用來(lái)產(chǎn)生3個(gè)SKEYID的素材.IKE階段四(主模式):發(fā)送消息4

initiat(yī)or〈====responsor?

同上?

主模式第3、4條消息其實(shí)就是DH算法中需要交換的幾個(gè)參數(shù),然后路由器再通過(guò)DH算法計(jì)算出的公共密鑰計(jì)算出以下3個(gè)參數(shù)(這是在發(fā)送第5、6個(gè)消息前完成的):?

SKEYI(mǎi)D_d:留在在其次階段用,用來(lái)計(jì)算后續(xù)的IKE密鑰資源;?

SKEYID_a:散列預(yù)共享密鑰,供應(yīng)IKE數(shù)據(jù)完整性和認(rèn)證;?

SKEYID_e:用來(lái)加密下一階段的message,data,presharedkey,包括其次階段.IKE階段五(主模式):發(fā)送消息5

initiator====〉responsor?

IdentityPayload:用于身份標(biāo)識(shí)?

HashPayload:用來(lái)認(rèn)證?

以上2個(gè)負(fù)載都用SKEYID_e加密IKE階段六(主模式):發(fā)送消息6

initiator<====responsor?

同上?

消息5、6是用來(lái)驗(yàn)證對(duì)等體身份的。至此IKE協(xié)商第一階段完成。主要會(huì)發(fā)送6個(gè)報(bào)文,由于最后一組報(bào)文發(fā)送的是身份,此時(shí)身份已經(jīng)加密,因此,只能采納地址進(jìn)行認(rèn)證,但其平安性高于樂(lè)觀模式。缺點(diǎn)是耗時(shí)比樂(lè)觀模式長(zhǎng)。樂(lè)觀模式:所有轉(zhuǎn)換載荷,加密材料,提議,DH,ID等所有轉(zhuǎn)換載荷,加密材料,提議,DH,ID等接收端發(fā)起端所有轉(zhuǎn)換載荷,加密材料,提議,DH,ID等所有轉(zhuǎn)換載荷,加密材料,提議,DH,ID等接收端發(fā)起端所有轉(zhuǎn)換載荷,加密材料,提議,DH,ID等接收端發(fā)起端所有轉(zhuǎn)換載荷,加密材料,提議,DH,ID等接收端發(fā)起端驗(yàn)證成功接收端發(fā)起端驗(yàn)證成功接收端發(fā)起端主要發(fā)送3個(gè)報(bào)文,平安性沒(méi)有主模式好,由于其ID不加密,因此可用于移動(dòng)客戶(hù)端模式.即不用地址作為ID。優(yōu)點(diǎn):速度快,缺點(diǎn)平安性不高。其次階段快速模式(IPSecSA階段):所有二階段參數(shù),提議,算法等接收端發(fā)起端所有二階段參數(shù),提議,算法等接收端發(fā)起端所有二階段參數(shù),提議,算法等接收端發(fā)起端所有二階段參數(shù),提議,算法等接收端發(fā)起端驗(yàn)證成功接收端發(fā)起端驗(yàn)證成功接收端發(fā)起端以上過(guò)程中包含驗(yàn)證信息(最開(kāi)頭如果支持PFS算法,那么還要協(xié)商DH算法),我就沒(méi)格外指出了.簡(jiǎn)略參見(jiàn)如下:

首先推斷是否啟用了PFS(完善轉(zhuǎn)發(fā)平安),若啟用了則重新進(jìn)行DH算法產(chǎn)生密鑰,若沒(méi)有啟用則是用第一階段的密鑰。IPSec階段一(快速模式):發(fā)送消息1

initiator====>responsor

同樣定義一組策略,連續(xù)用SKEYID_e加密:

Encapsulation—ESP

Integritychecking—SHA—HMAC

DHgroup—2

Mode—TunnelIPSec階段二(快速模式):發(fā)送消息2

initiator〈====responsor

同上,主要是對(duì)消息1策略的一個(gè)確認(rèn)。

在發(fā)送消息3前,用SKEYID_d,DH共享密鑰,SPI等產(chǎn)生真正用來(lái)加密數(shù)據(jù)的密鑰。IPSec階段三(快速模式):發(fā)送消息3

initiat(yī)or====〉responsor

用來(lái)核實(shí)responsor的liveness.

至此,整個(gè)IPSec協(xié)商的兩個(gè)過(guò)程已經(jīng)完成,兩端可以進(jìn)行平安的數(shù)據(jù)傳輸。實(shí)現(xiàn):ike協(xié)議我們主要是通過(guò)利用開(kāi)源軟件ipsec—tools來(lái)實(shí)現(xiàn)的.責(zé)任:負(fù)責(zé)ipsec的代碼BUG解決(BUG數(shù)量多,就不列出了),ipsec的證書(shū)申請(qǐng)腳本編寫(xiě)(討論了openssl)。Ipsec-tools流程:eay_init();//opensll初始化initlcconf();//本地配置文件初始化initrmconf();//遠(yuǎn)端配置文件初始化oakley_dhinit();//dh算法初始化compute_vendorids();//dpdparse(ac,av);//傳進(jìn)來(lái)的參數(shù)分析ploginit();//本地日志初始化pfkey_init()//內(nèi)核接口af_key初始化,主要是向內(nèi)核注冊(cè)isakmp_cfg_init(ISAKMP_CFG_INIT_COLD))//isakmp配置初始化cfparse();//配置文件分析,別且賦值給相應(yīng)結(jié)構(gòu)體session();//主要會(huì)話下面是session函數(shù)里面的實(shí)現(xiàn):sched_init();//調(diào)度初始化init_signal();//信號(hào)初始化admin_init()//和setkey,racoonctl的連接口初始化initmyaddr();//初始化本地地址isakmp_init()//isakmp初始化initfds();//初始化select的套接字natt_keepalive_init();//初始化nat(yī)協(xié)商的相關(guān)內(nèi)容for(i=0;i<=NSIG;i++)//信號(hào)的相應(yīng)保存變量初始化??sigreq[i]=0;check_sigreq();//檢測(cè)是否收到有信號(hào)error=select(nfds,&rfds,(fd_set*)0,(fd_set*)0,timeout);//多路監(jiān)聽(tīng)admin_handler();//監(jiān)聽(tīng)到setkey和racoonctl的fd觸發(fā),調(diào)用該函數(shù)處理isakmp_h(yuǎn)andler(p->sock);//監(jiān)聽(tīng)到ike連接信息和ike協(xié)商信息處理函數(shù)pfkey_handler();//監(jiān)聽(tīng)的內(nèi)核af_key發(fā)上來(lái)的信息處理函數(shù)(包含發(fā)起ike協(xié)商等)isakmp_handler(p—〉sock);函數(shù)里最重要的函數(shù)是isakmp_main()isakmp_handler(p—>sock);()這個(gè)函數(shù)里面除了數(shù)據(jù)包有效性檢查外,ph1_main()第一階段函數(shù),quick_main()其次階段處理函數(shù),這兩個(gè)函數(shù)最重要.這兩個(gè)函數(shù)內(nèi)分別用了一個(gè)重要的結(jié)構(gòu)體:如下ph1exchange[][]整個(gè)racoon就靠這個(gè)結(jié)構(gòu)體來(lái)進(jìn)行協(xié)商。(可以說(shuō)是貫穿整個(gè)racoon)stat(yī)icint(*ph1exchange[][2][PHASE1ST_M(jìn)AX])?__(dá)P((structph1handle*,vchar_t*))={/*error*/{{},{},},/*IdentityProtectionexchange*/{{nostate1,ident_i1send,nostate1,ident_i2recv,ident_i2send,ident_i3recv,ident_i3send,ident_i4recv,ident_i4send,nostate1,},{nostate1,ident_r1recv,ident_r1send,ident_r2recv,ident_r2send,ident_r3recv,ident_r3send,nostate1,nostate1,nostate1,},},/*Aggressivee(cuò)xchange*/{{nostate1,agg_i1send,nostate1,agg_i2recv,agg_i2send,nostate1,nostate1,nostate1,nostate1,nostate1,},{nostat(yī)e1,agg_r1recv,agg_r1send,agg_r2recv,agg_r2send,nostate1,nostate1,nostate1,nostate1,nostate1,},},/*Baseexchange*/{{nostate1,base_i1send,nostate1,base_i2recv,base_i2send,base_i3recv,base_i3send,nostat(yī)e1,nostate1,nostate1,},{nostat(yī)e1,base_r1recv,base_r1send,base_r2recv,base_r2send,nostate1,nostate1,nostat(yī)e1,nostate1,nostate1,},},};可以看的到上面有第一階段有三個(gè)模式的發(fā)送和接受函數(shù)(main,Aggressive,base);其中有每一個(gè)模式下的交互消息一個(gè)函數(shù)。同時(shí)也有驗(yàn)證函數(shù)。如果熟識(shí)幾種模式的發(fā)包流程,信任通過(guò)函數(shù)定義的名字就可以輕松知道函數(shù)是干嘛用的了。(注意存在狀態(tài)推斷函數(shù),發(fā)送和接收函數(shù),每個(gè)階段都不同)以上函數(shù)會(huì)在ph1_main()調(diào)用,在pfkey_h(yuǎn)andler()調(diào)用的則是協(xié)商發(fā)起方。staticint(*ph2exchange[][2][PHASE2ST_MAX])?__P((structph2handle*,vchar_t*))={/*error*/{{},{},},/*QuickmodeforIKE*/{{nostate2,nostate2,quick_i1prep,nostate2,quick_i1send,quick_i2recv,quick_i2send,quick_i3recv,nostate2,nostate2,},{nostate2,quick_r1recv,quick_r1prep,nostate2,quick_r2send,quick_r3recv,quick_r3prep,quick_r3send,nostat(yī)e2,nostate2,}},};可以看到上面的其次階段即快速模式下的發(fā)送和接受函數(shù),這些函數(shù)就是ike其次階段協(xié)商使用的。其中有二階段的每個(gè)包的發(fā)送和接受,狀態(tài)函數(shù).簡(jiǎn)略是怎么實(shí)現(xiàn)的請(qǐng)參看相應(yīng)的源代碼。以上的ph2handle會(huì)在,quick_main()中調(diào)用。各個(gè)處理方法和流程參考代碼就可以了。這就是也許流程,其中可能會(huì)涉及到openssl編碼問(wèn)題(第一階段的算法為二階段的傳遞信息編碼)。日志分析:編寫(xiě)選出特定信息的腳本。通過(guò)awk的傳參和讓AWK進(jìn)行處理。Linuxkernel網(wǎng)絡(luò)協(xié)議棧流程:LINKIp_recv()LINKIp_recv()IP包頭有效性檢查IPheadercheckIP包頭有效性檢查IPheadercheck主要改變Mark,tos,ttl主要改變Mark,tos,ttlManagle(PREROUTING)整個(gè)路由抉擇可以過(guò)濾多播或組播通過(guò)找到的策略調(diào)用相關(guān)SA封裝IPSEC數(shù)據(jù)包整個(gè)路由抉擇可以過(guò)濾多播或組播通過(guò)找到的策略調(diào)用相關(guān)SA封裝IPSEC數(shù)據(jù)包NAT(PREROUTEING)NAT(PREROUTEING)DNATDNATDe_fragmentDe_fragmentRoutedecisionOutput_routeIOutput_routeInput_routeOuput_route接受包過(guò)濾M接受包過(guò)濾Managle(INPUT)安全路由檢查,查找路由表(包括查找IPSEC策略)Filter(INPUT)安全路由檢查,查找路由表(包括查找IPSEC策略)Filter(INPUT)Some_checkSome_check包括本機(jī)IPSEC數(shù)據(jù)包處理,或tcp,udp,icmp等Transfer(tcp,udphandle)包括本機(jī)IPSEC數(shù)據(jù)包處理,或tcp,udp,icmp等Transfer(tcp,udphandle)RRecvmsg()(socket)MManagle(FORWARD)ESP,AH(使用netif_rx())等ESP,AH(使用netif_rx())等LocalprocessLocalprocessFilterFilterFORWARDsendmsg()(socket)sendmsg()(socket)轉(zhuǎn)發(fā)包過(guò)濾Transfer(tcp,udphandle)轉(zhuǎn)發(fā)包過(guò)濾Transfer(tcp,udphandle)安全路有檢查,查找路由表(包括查找IPSEC策略)Routedecision安全路有檢查,查找路由表(包括查找IPSEC策略)RoutedecisionIInput_routeOOutput_route通過(guò)找到的策略調(diào)用相關(guān)SA封裝IPSEC數(shù)據(jù)包通過(guò)找到的策略調(diào)用相關(guān)SA封裝IPSEC數(shù)據(jù)包Managle(OUTPUT)Managle(OUTPUT)NNat(OUTPUT)發(fā)送包過(guò)濾發(fā)送包過(guò)濾Filter(OUTPUT)Filter(OUTPUT)主要改變M主要改變Mark,tos,ttlManagle(POSTROUTING)SNATLINKIp_Send_out()NAT(POSTROUTING)SNATLINKIp_Send_out()NAT(POSTROUTING)IP_fragmentIP_fragmentQOSQOS圖1,tcp/ip協(xié)議棧AF_INET運(yùn)行結(jié)構(gòu)圖(包含IPSEC,netfilter,af_key)Netfilter維護(hù)鏈表:netfilter定義了一個(gè)二維的鏈表頭數(shù)組struct

list_h(yuǎn)ead

nf_hooks[NPROTO][NF_MAX_HOOKS]來(lái)表示全部協(xié)議族的各個(gè)掛接點(diǎn),NPROTO值為32,可表示linux所支持全部32個(gè)協(xié)議族(include/linux/socket。h文件中定義),也就是使用socket(2)函數(shù)的第一個(gè)參數(shù)的值,如互聯(lián)網(wǎng)的TCP/IP協(xié)議族PF_INET(2).每個(gè)協(xié)議族有NF_MAX_HOOKS(8)個(gè)掛接點(diǎn),但實(shí)際只用了如上所述的5個(gè),數(shù)組中每個(gè)元素表示一個(gè)協(xié)議族在一個(gè)掛接點(diǎn)的處理鏈表頭。AF_IPXAF_AX25AF_LOCALAF_INETAF_IPXAF_AX25AF_LOCALAF_INET…………PREROUTINGFORWARDINPUTOUTPUTPOSTROUTING…………PREROUTINGFORWARDINPUTOUTPUTPOSTROUTING…….………….…….…….………….…….…….…………managlemanaglemanaglemanaglemanaglemanaglemanaglemanaglemanaglemanaglenatnatfilterfilternatnatnatfilterfilternatfilter……。…….filter……?!?……。圖2,netfilter維護(hù)的鏈表結(jié)構(gòu)圖例如:在IPv4(PF_INET協(xié)議族)下,各掛接點(diǎn)定義在:NF_IP_PRE_ROUTING中,在IP棧成功接收sk_buff包后處理,掛接點(diǎn)在在net/ipv4/ip_input。c的函數(shù)

int

ip_rcv(struct

sk_buff

*skb,

struct

net_device

*dev,

struct

packet_type

*pt)?中使用:

return

NF_HOOK(PF_INET,

NF_IP_PRE_(tái)ROUTING,

skb,

dev,

NULL,

ip_rcv_finish);掛接點(diǎn)的操作由結(jié)構(gòu)struct

nf_h(yuǎn)ook_ops定義:?include/linux/netfilter.h?

struct

nf_hook_ops?{?

struct

list_head

list;//鏈表頭,用于將此結(jié)構(gòu)接入操作鏈表?

/*

User

fills

in

from

here

down.

*/?

nf_hookfn

*hook;//鉤子函數(shù)?

int

pf;//協(xié)議族?

int

hooknum;//掛接點(diǎn)如:PREROUTING

/*

Hooks

are

ordered

in

ascending

priority。

*/?

int

priority;//優(yōu)先級(jí)

};優(yōu)先級(jí)列表:

NF_IP_PRI_FIRST

=

INT_MIN,?

NF_IP_PRI_CONNTRACK

-200,

NF_IP_PRI_M(jìn)ANGLE

-150,

NF_IP_PRI_NAT_DST

=

-100,

NF_IP_PRI_FILTER

0,?

NF_IP_PRI_NAT_SRC

100,?

NF_IP_PRI_LAST

=

INT_MAXaf_inet模塊掛接(簡(jiǎn)略運(yùn)轉(zhuǎn)關(guān)系,由于時(shí)間緣由,就不在敘述):inet_init()inet_init()即使用socket套接字建立之后,調(diào)用函數(shù)如:ioctl,send,recv,setsockopt,close,connect等的注冊(cè)(傳輸層到網(wǎng)絡(luò)層).添加到結(jié)構(gòu)體proto_list即使用socket套接字建立之后,調(diào)用函數(shù)如:ioctl,send,recv,setsockopt,close,connect等的注冊(cè)(傳輸層到網(wǎng)絡(luò)層).添加到結(jié)構(gòu)體proto_list中。注冊(cè)套接字操作函數(shù),STREAM,RAW,DGRAM用戶(hù)空間使用socket選擇PF_INET后,把內(nèi)核調(diào)用的函數(shù)用戶(hù)空間使用socket選擇PF_INET后,把內(nèi)核調(diào)用的函數(shù)inet_create添加到結(jié)構(gòu)體net_families[PF_INET]中.主要分配結(jié)構(gòu)體sock(INET_sock)注冊(cè)socket調(diào)用函數(shù)注冊(cè)socket調(diào)用函數(shù)當(dāng)通過(guò)ip_rcv之后的路由抉擇以后的傳輸層處理函數(shù),如tcphandle,添加到結(jié)構(gòu)體inet_protos當(dāng)通過(guò)ip_rcv之后的路由抉擇以后的傳輸層處理函數(shù),如tcphandle,添加到結(jié)構(gòu)體inet_protos[protocol]中。注冊(cè)傳輸層處理函數(shù)(包括IGMP)初始化ARP,IP,TCP,UDP,ICMP相關(guān)參數(shù),添加相關(guān)信息.初始化ARP,IP,TCP,UDP,ICMP相關(guān)參數(shù),添加相關(guān)信息.初始化相關(guān)信息(namespace),如路由表初始化初始化相關(guān)信息(namespace),如路由表初始化添加結(jié)構(gòu)體ip_packet_type添加結(jié)構(gòu)體ip_packet_type,下層軟件通過(guò)ip_packet_type類(lèi)型來(lái)判斷需要調(diào)用的模塊.注冊(cè)模塊處理類(lèi)型IPV4af_key模塊掛接(簡(jiǎn)略運(yùn)轉(zhuǎn)關(guān)系,由于時(shí)間緣由,就不在敘述):內(nèi)核中PF_KEY實(shí)現(xiàn)要完成的功能是實(shí)現(xiàn)維護(hù)內(nèi)核的平安聯(lián)盟(SA)和平安策略(SP)數(shù)據(jù)庫(kù),

以及和用戶(hù)空間的接口。Ipsec_afkeyIpsec_afkey_init()即使用socket套接字建立之后的端口操作。這里只注冊(cè)了結(jié)構(gòu)體pfkey_sock大小。掛接到鏈表proto_list即使用socket套接字建立之后的端口操作。這里只注冊(cè)了結(jié)構(gòu)體pfkey_sock大小。掛接到鏈表proto_list中注冊(cè)套接字操作函數(shù)用戶(hù)空間使用socket選擇PF_KEY后,把內(nèi)核調(diào)用函數(shù)afkey用戶(hù)空間使用socket選擇PF_KEY后,把內(nèi)核調(diào)用函數(shù)afkey_creat(yī)e添加到結(jié)構(gòu)體net_families[PF_INET]中。主要分配結(jié)構(gòu)體sock,設(shè)置操作函數(shù)結(jié)構(gòu)體pfkey_ops,包含sendmsg(),recvmsg()函數(shù)注冊(cè)socket調(diào)用函數(shù)注冊(cè)socket調(diào)用函數(shù)登記通知(notify)處理pfkeyv2_mgr登記通知(notify)處理pfkeyv2_mgr登記通知(notify)處理pfkeyv2_mgr,掛接到鏈表登記通知(notify)處理pfkeyv2_mgr,掛接到鏈表xfrm_km_list

中。簡(jiǎn)略過(guò)程略xfrm_state表:xfrm狀態(tài)用來(lái)描述SA在內(nèi)核中的簡(jiǎn)略實(shí)現(xiàn)struct

xfrm_state

{

/*

Note:

bydst

is

re-used

during

gc

*/

//

每個(gè)狀態(tài)結(jié)構(gòu)掛接到三個(gè)HASH鏈表中

struct

hlist_node

bydst;

//

按目的地址HASH

struct

hlist_node

bysrc;

//

按源地址HASH

struct

hlist_node

byspi;

//

按SPI值HASH

atomic_t

refcnt;

//

全部使用計(jì)數(shù)

spinlock_t

lock;

//

狀態(tài)鎖

struct

xfrm_id

id;

//

ID

struct

xfrm_selector

sel;

//

狀態(tài)選擇子

u32

genid;

/*

Key

manger

bits

*/

struct

u8

state;

u8

dying;

u32

seq;

}

km;

/*

Parameters

of

this

state.

*/

struct

u32

reqid;

u8

mode;

u8

replay_window;

u8

aalgo,

ealgo,

calgo;

u8

flags;

u16

family;

xfrm_address_t

saddr;

int

header_len;

int

trailer_len;

props;

struct

xfrm_lifetime_cfg

lft;

//

生存時(shí)間

/*

Data

for

transformer

*/

struct

xfrm_algo

*aalg;

//

hash算法

struct

xfrm_algo

*ealg;

//

加密算法

struct

xfrm_algo

*calg;

//

壓縮算法

/*

Data

for

encapsulat(yī)or

*/

struct

xfrm_encap_tmpl

*encap;

//

NAT-T封裝信息

/*

Dat(yī)a

for

care-of

address

*/

xfrm_address_t

*coaddr;

/*

IPComp

needs

an

IPIP

tunnel

for

handling

uncompressed

packets

*/

struct

xfrm_state

*tunnel;

/*

If

a

tunnel,

number

of

users

*/

atomic_t

tunnel_users;

/*

State

for

replay

detection

*/

struct

xfrm_replay_state

replay;

/*

Replay

detection

state

at

the

time

we

sent

the

last

notificat(yī)ion

*/

struct

xfrm_replay_stat(yī)e

preplay;

/*

internal

flag

that

only

holds

state

for

delayed

aevent

at

the

moment

*/

u32

xflags;

/*

Replay

detection

notification

settings

*/

u32

replay_maxage;

u32

replay_maxdiff;

/*

Replay

detection

notification

timer

*/

struct

timer_li

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論