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

下載本文檔

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

文檔簡介

1、邁普學(xué)習(xí)總結(jié)經(jīng)過在公司里學(xué)習(xí)了幾個月,把大體的工作總結(jié)于下:在參與1800-20 3G路由的開發(fā)中,我參與了l2tp, gre,靜態(tài)路由, ipsec,日志關(guān)鍵信息提取的編寫。并同時(shí)參與了ipsec-tools源碼,linux kernel網(wǎng)絡(luò)協(xié)議棧源碼,l2tpd源碼分析。并且同時(shí)了解了vrrp,rip等協(xié)議。L2TP模塊:L2tp代碼流程:連接請求lnslac連接成功lnslacPpp連接請求lnslacPpp允許連接協(xié)商lnslacPpp配置文件lnslacPpp配置文件lnslacPpp配置ACKlnslacPpp配置ACKlnslacPpp 認(rèn)證lnslacncp 網(wǎng)絡(luò)配置lnsla

2、c接受ncp 網(wǎng)絡(luò)配置lnslacACKlaclns其中認(rèn)證過程分為pap和chap認(rèn)證: Pap認(rèn)證:認(rèn)證信息lnslac通過認(rèn)證lnslacChap認(rèn)證:發(fā)送加密數(shù)據(jù),使LAC認(rèn)證lnslac認(rèn)證信息lnslac通過認(rèn)證lnslac大體過程應(yīng)該是這樣的,中間也許有錯,主要是記不大清楚了。Pppd向內(nèi)核注冊過程如下圖:internet路由器lns路由器lac內(nèi)網(wǎng)2內(nèi)網(wǎng)1拓?fù)鋱D:做lac的路由器通過撥號到lns,通過上面的連接認(rèn)證后,lns會給lac分配一個私有ip地址,該Ip地址可以和2通信。通過這個過程后,久可以讓內(nèi)網(wǎng)1的pc訪問內(nèi)網(wǎng)2的pc。Gre模塊:internet路由器內(nèi)網(wǎng)2路由器

3、內(nèi)網(wǎng)1模型:開始的時(shí)候,內(nèi)網(wǎng)1和內(nèi)網(wǎng)2是不能相互到達(dá)的,因?yàn)橹虚g有許多中間網(wǎng)絡(luò)。當(dāng)建立好GRE隧道后,內(nèi)網(wǎng)1就可以和內(nèi)網(wǎng)2通信了。實(shí)現(xiàn):GRE腳本主要通過iproute2這個工具實(shí)現(xiàn)。使用的主要腳本命令:Ip route add $name mode gre remote $remoteip local $localip ttl 255Ip route set $name upIp route add net $net/$mask dev $name腳本流程:腳本從lua保存的配置文件中獲取到上面的變量值,然后通過以上指令,將變量值設(shè)置到相應(yīng)的隧道中。責(zé)任:主要擔(dān)任gre模塊的測試(與linu

4、x)。DDNS模塊:原理:DDNS又叫動態(tài)域名解析。實(shí)用環(huán)境是在用戶動態(tài)獲取IP地址的情況下。因?yàn)閭鹘y(tǒng)的DNS只能與固定IP地址綁定,一旦IP地址發(fā)生變化,相應(yīng)的域名將不能解析到變換后的IP地址上。然后DDNS改變了這一點(diǎn)。它以動態(tài)域名綁定的方式來完成這一點(diǎn)。什么叫動態(tài)域名呢?就是指在用戶的IP地址發(fā)生改變時(shí),相應(yīng)的DDNS客戶端會把自己現(xiàn)在的變化后的IP地址傳給DDNS服務(wù)器,告訴它自己的IP地址已經(jīng)發(fā)生變化,需要服務(wù)器將以前綁定域名的IP換成現(xiàn)在變化后的IP地址。如果內(nèi)部在加上端口映射,那么久可以實(shí)現(xiàn)路由器內(nèi)部的主機(jī)間接與DNS綁定,即其他人通過域名就能訪問的內(nèi)網(wǎng)的某臺計(jì)算上的服務(wù)器。責(zé)任

5、:DDNS的測試。靜態(tài)路由模塊:原理:舉個例子,當(dāng)一個路由器剛接入到一個網(wǎng)絡(luò)中時(shí),在這個陌生的環(huán)境中,它根本不知道去某個地址該怎么走,靜態(tài)路由就相當(dāng)于一個指路人,它告訴路由器某個IP地址該怎么走。配置的時(shí)候,只需要告訴路由器到達(dá)某個網(wǎng)絡(luò)需要從哪張網(wǎng)卡和相應(yīng)網(wǎng)卡出去的網(wǎng)關(guān)地址就可以了。這樣凡是到那個網(wǎng)絡(luò)的IP數(shù)據(jù)包,路由器都會將它從相應(yīng)網(wǎng)卡轉(zhuǎn)發(fā)出去(ttl-1)。它并不關(guān)心數(shù)據(jù)包能否真正的到達(dá)。實(shí)現(xiàn):具體命令:route add net $net mask $netmask gw $gateway dev $device責(zé)任:靜態(tài)路由的腳本的基本框架。Ipsec模塊:原理:在內(nèi)核2.6版本中已經(jīng)

6、存在ipsec模塊,該模塊的主要作用是讓數(shù)據(jù)包經(jīng)過加密/認(rèn)證從安全的隧道中到達(dá)指定的目標(biāo)地址。它的有幾種數(shù)據(jù)包格式,一種是esp,一種是ah,另一種是esp+ah。他們的報(bào)文格式如下:Ah是一種用于認(rèn)證報(bào)文,它主要是給數(shù)據(jù)包提供認(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)了。整個模塊分為兩大類:第一類,kernel ipsec的實(shí)現(xiàn),第二類上層應(yīng)用程序ike即為ipsec模塊協(xié)商認(rèn)證算法和加密算法的協(xié)議。下面談?wù)刬ke協(xié)議。Ike協(xié)議分為兩個

7、階段,第一階段協(xié)商對對方的身份進(jìn)行認(rèn)證,并且為第二階段的協(xié)商提供一條安全可靠的通道。第一個階段又分為3種模式,我們常用的有兩種模式,一個是主模式,一個是積極模式。第二階段主要對IPSEC的安全性能進(jìn)行協(xié)商,產(chǎn)生真正可以用來加密數(shù)據(jù)流的密鑰。主模式(IKE SA 階段):安全提議,轉(zhuǎn)換載荷,一些詳情接收端發(fā)起端安全提議,轉(zhuǎn)換載荷,一些詳情接收端發(fā)起端DH算法產(chǎn)生公共密鑰,密鑰交換接收端發(fā)起端DH算法產(chǎn)生公共密鑰,密鑰交換接收端發(fā)起端加密ID,進(jìn)行身份認(rèn)證接收端發(fā)起端加密ID,進(jìn)行身份認(rèn)證接收端發(fā)起端以上過程中包含驗(yàn)證信息,我就沒特別指出了。具體參見如下:發(fā)送cockie包,用來標(biāo)識唯一的一個IP

8、SEC會話。IKE階段一(主模式):發(fā)送消息1 initiator=responsor isakmp header sa payload proposal payload transform payload 定義一組策略: 加密方法:DES 認(rèn)證身份方法:預(yù)共享密鑰 認(rèn)證散列:MD5 存活時(shí)間:86400秒 Diffie-Hellman group:1IKE階段二(主模式):發(fā)送消息2 initiatorresponsor 通過DH算法產(chǎn)生共享密鑰 KE(Key Exchang) Payload nonce(暫時(shí)) PayloadDH算法: A: P(較大的質(zhì)數(shù)) B: P(較大的質(zhì)數(shù)) G

9、G PriA(隨機(jī)產(chǎn)生) PriB(隨機(jī)產(chǎn)生) PubA=GPriA mod P PubB=GPriB mod P 交換PubA和PubB Z=PubBPriA mod P Z=PubAPriB mod P Z就是共享密鑰,兩個自我產(chǎn)生的Z應(yīng)相同,它是用來產(chǎn)生3個SKEYID的素材。IKE階段四(主模式):發(fā)送消息4 initiatorresponsor Identity Payload:用于身份標(biāo)識 Hash Payload:用來認(rèn)證 以上2個負(fù)載都用SKEYID_e加密IKE階段六(主模式):發(fā)送消息6 initiatorresponsor 同樣定義一組策略,繼續(xù)用SKEYID_e加密:

10、Encapsulation ESP Integrity checking SHA-HMAC DH group 2 Mode TunnelIPSec階段二(快速模式):發(fā)送消息2 initiatorresponsor 用來核實(shí)responsor的liveness。 至此,整個IPSec協(xié)商的兩個過程已經(jīng)完成,兩端可以進(jìn)行安全的數(shù)據(jù)傳輸。實(shí)現(xiàn):ike協(xié)議我們主要是通過利用開源軟件ipsec-tools來實(shí)現(xiàn)的。責(zé)任:負(fù)責(zé)ipsec的代碼BUG解決(BUG數(shù)量多,就不列出了),ipsec的證書申請腳本編寫(研究了openssl)。Ipsec-tools流程:eay_init();/opensll初始

11、化initlcconf();/本地配置文件初始化initrmconf();/遠(yuǎn)端配置文件初始化oakley_dhinit();/dh算法初始化compute_vendorids();/dpdparse(ac, av);/傳進(jìn)來的參數(shù)分析ploginit();/本地日志初始化pfkey_init()/內(nèi)核接口af_key初始化,主要是向內(nèi)核注冊isakmp_cfg_init(ISAKMP_CFG_INIT_COLD)/isakmp配置初始化cfparse();/配置文件分析,別且賦值給相應(yīng)結(jié)構(gòu)體session();/主要會話下面是session函數(shù)里面的實(shí)現(xiàn):sched_init();/調(diào)度初始

12、化init_signal();/信號初始化admin_init()/和setkey, racoonctl的連接口初始化initmyaddr();/初始化本地地址isakmp_init()/isakmp初始化initfds();/初始化select的套接字natt_keepalive_init ();/初始化nat協(xié)商的相關(guān)內(nèi)容for (i = 0; i sock);/監(jiān)聽到ike連接信息和ike協(xié)商信息處理函數(shù)pfkey_handler();/監(jiān)聽的內(nèi)核af_key發(fā)上來的信息處理函數(shù)(包含發(fā)起ike協(xié)商等)isakmp_handler(p-sock);函數(shù)里最重要的函數(shù)是isakmp_mai

13、n()isakmp_handler(p-sock);()這個函數(shù)里面除了數(shù)據(jù)包有效性檢查外,ph1_main()第一階段函數(shù),quick_main()第二階段處理函數(shù),這兩個函數(shù)最重要。這兩個函數(shù)內(nèi)分別用了一個重要的結(jié)構(gòu)體:如下ph1exchange 整個racoon就靠這個結(jié)構(gòu)體來進(jìn)行協(xié)商。(可以說是貫穿整個racoon)static int (*ph1exchange2PHASE1ST_MAX)_P(struct ph1handle *, vchar_t *) = /* error */ , , , /* Identity Protection exchange */ nostate1,

14、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, , , /* Aggressive exchange */ nostate1, agg_i1send, nost

15、ate1, agg_i2recv, agg_i2send, nostate1, nostate1, nostate1, nostate1, nostate1, , nostate1, agg_r1recv, agg_r1send, agg_r2recv, agg_r2send, nostate1, nostate1, nostate1, nostate1, nostate1, , , /* Base exchange */ nostate1, base_i1send, nostate1, base_i2recv, base_i2send, base_i3recv, base_i3send, n

16、ostate1, nostate1, nostate1, , nostate1, base_r1recv, base_r1send, base_r2recv, base_r2send, nostate1, nostate1, nostate1, nostate1, nostate1, , ,;可以看的到上面有第一階段有三個模式的發(fā)送和接受函數(shù)(main , Aggressive, base);其中有每一個模式下的交互消息 一個函數(shù)。同時(shí)也有驗(yàn)證函數(shù)。如果熟悉幾種模式的發(fā)包流程,相信通過函數(shù)定義的名字 就可以輕松知道 函數(shù)是干嘛用的了。(注意存在狀態(tài)判斷函數(shù),發(fā)送和接收函數(shù),每個階段都不同)以上

17、函數(shù)會在ph1_main()調(diào)用,在pfkey_handler()調(diào)用的則是協(xié)商發(fā)起方。static int (*ph2exchange2PHASE2ST_MAX)_P(struct ph2handle *, vchar_t *) = /* error */ , , , /* Quick mode for IKE */ nostate2, nostate2, quick_i1prep, nostate2, quick_i1send, quick_i2recv, quick_i2send, quick_i3recv, nostate2, nostate2, , nostate2, quick_r

18、1recv, quick_r1prep, nostate2, quick_r2send, quick_r3recv, quick_r3prep, quick_r3send, nostate2, nostate2, ,;可以看到上面的第二階段即快速模式下的發(fā)送和接受函數(shù),這些函數(shù)就是ike第二階段協(xié)商使用的。其中有二階段的每個包的發(fā)送和接受,狀態(tài)函數(shù)。具體是怎么實(shí)現(xiàn)的 請參看相應(yīng)的源代碼。以上的ph2handle會在,quick_main()中調(diào)用。各個處理方法和流程參考代碼就可以了。這就是大概流程,其中可能會涉及到openssl編碼問題(第一階段的算法為二階段的傳遞信息編碼)。日志分析:編寫選

19、出特定信息的腳本。通過awk的傳參和讓AWK進(jìn)行處理。Linux kernel網(wǎng)絡(luò)協(xié)議棧流程:LINKIp_recv()IP包頭有效性檢查IP header check主要改變Mark,tos,ttlManagle(PREROUTING)整個路由抉擇可以過濾多播或組播通過找到的策略調(diào)用相關(guān)SA封裝IPSEC數(shù)據(jù)包NAT (PREROUTEING)DNATDe_fragment Route decisionOutput_routeInput_routeOuput_route接受包過濾Managle(INPUT)安全路由檢查,查找路由表 (包括查找IPSEC策略)Filter(INPUT)Some

20、_check包括本機(jī)IPSEC數(shù)據(jù)包處理,或tcp,udp,icmp等Transfer(tcp, udp handle)Recvmsg() (socket)Managle (FORWARD)ESP,AH (使用netif_rx())等Local processFilterFORWARDsendmsg() (socket)轉(zhuǎn)發(fā)包過濾Transfer(tcp, udp handle)安全路有檢查,查找路由表(包括查找IPSEC策略)Route decisionInput_routeOutput_route通過找到的策略調(diào)用相關(guān)SA封裝IPSEC數(shù)據(jù)包Managle (OUTPUT)Nat (OUT

21、PUT)發(fā)送包過濾Filter(OUTPUT)主要改變Mark,tos,ttlManagle(POSTROUTING)SNATLINKIp_Send_out()NAT (POSTROUTING)IP_fragmentQOS圖1,tcp/ip 協(xié)議棧AF_INET運(yùn)行結(jié)構(gòu)圖(包含IPSEC, netfilter,af_key)Netfilter維護(hù)鏈表:netfilter定義了一個二維的鏈表頭數(shù)組structlist_headnf_hooksNPROTONF_MAX_HOOKS來表示所有協(xié)議族的各個掛接點(diǎn),NPROTO值為32,可表示linux所支持所有32個協(xié)議族(include/linux/

22、socket.h文件中定義),也就是使用socket(2)函數(shù)的第一個參數(shù)的值,如互聯(lián)網(wǎng)的TCP/IP協(xié)議族PF_INET(2)。每個協(xié)議族有NF_MAX_HOOKS(8)個掛接點(diǎn),但實(shí)際只用了如上所述的5個,數(shù)組中每個元素表示一個協(xié)議族在一個掛接點(diǎn)的處理鏈表頭。AF_IPXAF_AX25AF_LOCALAF_INETPREROUTING FORWARD INPUT OUTPUT POSTROUTING.managlemanaglemanaglemanaglemanaglenatnatfilterfilternatfilter.圖2,netfilter 維護(hù)的鏈表結(jié)構(gòu)圖例如:在IPv4(PF_

23、INET協(xié)議族)下,各掛接點(diǎn)定義在:NF_IP_PRE_ROUTING中,在IP棧成功接收sk_buff包后處理,掛接點(diǎn)在在net/ipv4/ip_input.c的函數(shù)intip_rcv(structsk_buff*skb,structnet_device*dev,structpacket_type*pt)中使用:returnNF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish);掛接點(diǎn)的操作由結(jié)構(gòu)structnf_hook_ops定義:include/linux/netfilter.hstructnf_hook_opsstr

24、uctlist_headlist;/ 鏈表頭,用于將此結(jié)構(gòu)接入操作鏈表/*Userfillsinfromheredown.*/nf_hookfn*hook;/鉤子函數(shù)intpf; /協(xié)議族inthooknum;/掛接點(diǎn)如:PREROUTING/*Hooksareorderedinascendingpriority.*/intpriority;/優(yōu)先級;優(yōu)先級列表:NF_IP_PRI_FIRST=INT_MIN,NF_IP_PRI_CONNTRACK=-200,NF_IP_PRI_MANGLE=-150,NF_IP_PRI_NAT_DST=-100,NF_IP_PRI_FILTER=0,NF_I

25、P_PRI_NAT_SRC=100,NF_IP_PRI_LAST=INT_MAXaf_inet模塊掛接(詳細(xì)運(yùn)轉(zhuǎn)關(guān)系,由于時(shí)間原因,就不在敘述):inet_init()即使用socket套接字建立之后,調(diào)用函數(shù)如:ioctl, send, recv, setsockopt,close, connect等的注冊(傳輸層到網(wǎng)絡(luò)層)。添加到結(jié)構(gòu)體proto_list中。注冊套接字操作函數(shù),STREAM,RAW, DGRAM用戶空間使用socket選擇PF_INET后,把內(nèi)核調(diào)用的函數(shù)inet_create添加到結(jié)構(gòu)體net_familiesPF_INET中。主要分配結(jié)構(gòu)體sock(INET_sock

26、)注冊socket調(diào)用函數(shù)當(dāng)通過ip_rcv之后的路由抉擇以后的傳輸層處理函數(shù),如tcp handle,添加到結(jié)構(gòu)體inet_protosprotocol中。注冊傳輸層處理函數(shù)(包括IGMP)初始化ARP,IP,TCP,UDP,ICMP相關(guān)參數(shù),添加相關(guān)信息。初始化相關(guān)信息(namespace),如路由表初始化添加結(jié)構(gòu)體ip_packet_type,下層軟件通過ip_packet_type類型來判斷需要調(diào)用的模塊。注冊模塊處理類型IPV4af_key模塊掛接(詳細(xì)運(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ù)庫,以

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

28、t中。詳細(xì)過程略xfrm_state表:xfrm狀態(tài)用來描述SA在內(nèi)核中的具體實(shí)現(xiàn)structxfrm_state /*Note:bydstisre-usedduringgc*/每個狀態(tài)結(jié)構(gòu)掛接到三個HASH鏈表中 structhlist_nodebydst;/按目的地址HASH structhlist_nodebysrc;/按源地址HASH structhlist_nodebyspi;/按SPI值HASH atomic_trefcnt;/所有使用計(jì)數(shù) spinlock_tlock;/狀態(tài)鎖 structxfrm_idid;/ID structxfrm_selectorsel;/狀態(tài)選擇子 u

29、32genid; /*Keymangerbits*/struct u8state; u8dying; u32seq; km; /*Parametersofthisstate.*/struct u32reqid; u8mode; u8replay_window; u8aalgo,ealgo,calgo; u8flags; u16family; xfrm_address_tsaddr; intheader_len; inttrailer_len; props; structxfrm_lifetime_cfglft;/生存時(shí)間 /*Datafortransformer*/structxfrm_alg

30、o*aalg;/hash算法 structxfrm_algo*ealg;/加密算法 structxfrm_algo*calg;/壓縮算法 /*Dataforencapsulator*/structxfrm_encap_tmpl*encap;/NAT-T封裝信息 /*Dataforcare-ofaddress*/xfrm_address_t*coaddr; /*IPCompneedsanIPIPtunnelforhandlinguncompressedpackets*/structxfrm_state*tunnel; /*Ifatunnel,numberofusers+1*/atomic_ttu

31、nnel_users; /*Stateforreplaydetection*/structxfrm_replay_statereplay; /*Replaydetectionstateatthetimewesentthelastnotification*/structxfrm_replay_statepreplay; /*internalflagthatonlyholdsstatefordelayedaeventatthe *moment */u32xflags; /*Replaydetectionnotificationsettings*/u32replay_maxage; u32replay_maxdiff; /*Replaydetectionnotificationtimer*/structtimer_listrtimer; /*Statistics*/structxfrm_statsstats; structxfrm_lifetime_curcurlft; structtimer_listtimer; /*Lastusedtime*/u64lastused; /*Referencetodatacommontoalltheinstancesof

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論