版權(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
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
+
1
*/
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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同攪拌站租賃合同
- 制造業(yè)生產(chǎn)過(guò)程優(yōu)化系統(tǒng)開(kāi)發(fā)合同
- 公司廠房裝修合同
- 企業(yè)級(jí)員工關(guān)懷服務(wù)合同
- 100個(gè)名句學(xué)會(huì)高考英語(yǔ)語(yǔ)法
- 廣西貴港市港北區(qū)第二初級(jí)中學(xué)2024-2025學(xué)年八年級(jí)上學(xué)期10月月考地理試題
- 無(wú)菌包裝用包裝材料行業(yè)相關(guān)投資計(jì)劃提議范本
- 關(guān)于父母感恩演講稿范文集錦6篇
- 臨床護(hù)理教學(xué)方法
- 關(guān)于悲慘世界的讀后感
- 四年級(jí)語(yǔ)文上冊(cè)習(xí)作:我的家人【交互版】課件
- 電力綠色轉(zhuǎn)型:綠色電力市場(chǎng)的實(shí)踐與思考
- 阜陽(yáng)職業(yè)技術(shù)學(xué)院2024年教師招聘招聘歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 5.1 走近老師 課件- 2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)上冊(cè)-1
- 送電線路工(初級(jí))技能鑒定理論考試題庫(kù)(濃縮300題)
- 圍欄噴漆翻新施工方案
- 2024年文化和旅游部直屬事業(yè)單位招聘歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 四川宜賓五糧液股份有限公司招聘考試試卷及答案
- 醫(yī)療行業(yè)智能化醫(yī)療設(shè)備維修與保養(yǎng)方案
- 2024年黑龍江省哈爾濱市道里區(qū)執(zhí)法局招聘52人歷年高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 《人工智能與大數(shù)據(jù)技術(shù)》高職全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論