linux路由协议网络协议栈_第1页
linux路由协议网络协议栈_第2页
linux路由协议网络协议栈_第3页
linux路由协议网络协议栈_第4页
linux路由协议网络协议栈_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

迈普学习总结经过在公司里学习了几个月,把大体的工作总结于下:在参与1800-203G路由的开发中,我参与了l2tp,gre,静态路由,ipsec,日志关键信息提取的编写。并同时参与了ipsec-tools源码,linuxkernel网络协议栈源码,l2tpd源码分析。并且同时了解了vrrp,rip等协议。L2TP模块:L2tp代码流程:大体过程应该是这样的,中间也许有错,主要是记不大清楚了。Pppd向内核注册过程如下图:L用户数据发送过程如下所示=应用程序pppd■2,TFPP协议模块ttyGSM模组2.pppd的控制协议数据发送过程=pppd--Pap/chap/eap(etc)-->/dev/ppp-->PFF协议模块-->tty-->GSM模组拓扑图:拓扑图:做lac的路由器通过拨号到lns,通过上面的连接认证后,lns会给lac分配一个私有ip地址,该Ip地址可以和2通信。通过这个过程后,久可以让内网1的pc访问内网2的pc。Gre模块:模型:模型:开始的时候,内网1和内网2是不能相互到达的,因为中间有许多中间网络。当建立好GRE隧道后,内网1就可以和内网2通信了。实现:GRE脚本主要通过iproute2这个工具实现。使用的主要脚本命令:Iprouteadd$namemodegreremote$remoteiplocal$localipttl255Iprouteset$nameupIprouteaddnet$net/$maskdev$name脚本流程:脚本从lua保存的配置文件中获取到上面的变量值,然后通过以上指令,将变量值设置到相应的隧道中。责任:主要担任gre模块的测试(与linux)。DDNS模块:原理:DDNS又叫动态域名解析。实用环境是在用户动态获取IP地址的情况下。因为传统的DNS只能与固定IP地址绑定,一旦IP地址发生变化,相应的域名将不能解析到变换后的IP地址上。然后DDNS改变了这一点。它以动态域名绑定的方式来完成这一点。什么叫动态域名呢?就是指在用户的IP地址发生改变时,相应的DDNS客户端会把自己现在的变化后的IP地址传给DDNS服务器,告诉它自己的IP地址已经发生变化,需要服务器将以前绑定域名的IP换成现在变化后的IP地址。如果内部在加上端口映射,那么久可以实现路由器内部的主机间接与DNS绑定,即其他人通过域名就能访问的内网的某台计算上的服务器。责任:DDNS的测试。静态路由模块:原理:举个例子,当一个路由器刚接入到一个网络中时,在这个陌生的环境中,它根本不知道去某个地址该怎么走,静态路由就相当于一个指路人,它告诉路由器某个IP地址该怎么走。配置的时候,只需要告诉路由器到达某个网络需要从哪张网卡和相应网卡出去的网关地址就可以了。这样凡是到那个网络的IP数据包,路由器都会将它从相应网卡转发出去(ttl-1)。它并不关心数据包能否真正的到达。实现:具体命令:routeaddnet$netmask$netmaskgw$gatewaydev$device责任:静态路由的脚本的基本框架。Ipsec模块:原理:在内核2.6版本中已经存在ipsec模块,该模块的主要作用是让数据包经过加密/认证从安全的隧道中到达指定的目标地址。它的有几种数据包格式,一种是esp,一种是ah,另一种是esp+ah。他们的报文格式如下:Ah是一种用于认证报文,它主要是给数据包提供认证,防重放;ESP是一种用于加密报文,当然它也有认证的功能,并且也具有抗重放的机制。它是一种更优越于AH的报文结构。另外,esp+ah则是一种集esp和ah于一身的格式,当然它的安全性就更不可否认了。整个模块分为两大类:第一类,kernelipsec的实现,第二类上层应用程序ike即为ipsec模块协商认证算法和加密算法的协议。下面谈谈ike协议。Ike协议分为两个阶段,第一阶段协商对对方的身份进行认证,并且为第二阶段的协商提供一条安全可靠的通道。第一个阶段又分为3种模式,我们常用的有两种模式,一个是主模式,一个是积极模式。第二阶段主要对IPSEC的安全性能进行协商,产生真正可以用来加密数据流的密钥。主模式(IKESA阶段):以上过程中包含验证信息,我就没特别指出了。具体参见如下:发送cockie包,用来标识唯一的一个IPSEC会话。IKE阶段一(主模式):发送消息1initiator====>responsorisakmpheadersapayloadproposalpayloadtransformpayload定义一组策略:加密方法:DES认证身份方法:预共享密钥认证散列:MD5

存活时间:86400秒Diffie-Hellmangroup:存活时间:86400秒Diffie-Hellmangroup:1IKE阶段二(主模式):发送消息2同上IKE阶段三(主模式):发送消息3通过DH算法产生共享密钥KE(KeyExchang)Payloadnonce(暂时)PayloadDH算法:A:P(较大的质数)GPriA(随机产生)PubA=G"PriAmodP交换PubA和PubBZ=PubB"PriAmodPinitiator<====responsorinitiator====>responsorB:P(较大的质数)GPriB(随机产生)PubB=G"PriBmodPZ=PubAPriBmodPZ就是共享密钥,两个自我产生的Z应相同,它是用来产生3个SKEYID的素材。IKE阶段四(主模式):发送消息4initiator<====responsor同上主模式第3、4条消息其实就是DH算法中需要交换的几个参数,然后路由器再通过DH算法计算出的公共密钥计算出以下3个参数(这是在发送第5、6个消息前完成的):SKEYID_d:留在在第二阶段用,用来计算后续的IKE密钥资源;SKEYID_a:散列预共享密钥,提供IKE数据完整性和认证;SKEYID_e:用来加密下一阶段的message,data,presharedkey,包括第二阶段。initiator====>responsorIKE阶段五(主模式):发送消息5IdentityPayload:用于身份标识HashPayload:用来认证以上2个负载都用SKEYID_e加密initiator<====responsorIKE阶段六(主模式):发送消息6同上至此IKEinitiator====>responsorinitiator<====responsor至此IKE协商第一阶段完成。主要会发送6个报文,由于最后一组报文发送的是身份,此时身份已经加密,因此,只能采用地址进行认证,但其安全性高于积极模式。缺点是耗时比积极模式长。积极模式:主要发送3个报文,安全性没有主模式好,由于其ID不加密,因此可用于移动客户端模式。即不用地址作为ID。优点:速度快,缺点安全性不高。第二阶段快速模式(IPSecSA阶段):以上过程中包含验证信息(最开始如果支持PFS算法,那么还要协商DH算法),我就没特别指出了。具体参见如下:首先判断是否启用了PFS(完美转发安全),若启用了则重新进行DH算法产生密钥,若没有启用则是用第一阶段的密钥。IPSec阶段一(快速模式):发送消息1initiator====>responsor同样定义一组策略,继续用SKEYID_e加密:Encapsulation—ESPIntegritychecking—SHA-HMACDHgroup—2Mode—TunnelIPSec阶段二(快速模式):发送消息2initiator<====responsor同上,主要是对消息1策略的一个确认。在发送消息3前,用SKEYID_d,DH共享密钥,SPI等产生真正用来加密数据的密钥。IPSec阶段三(快速模式):发送消息3initiator====>responsor用来核实responsor的liveness。至此,整个IPSec协商的两个过程已经完成,两端可以进行安全的数据传输。实现:ike协议我们主要是通过利用开源软件ipsec-tools来实现的。责任:负责ipsec的代码BUG解决(BUG数量多,就不列出了),ipsec的证书申请脚本编写(研究了openssl)。Ipsec-tools流程:eay_init();//opensll初始化initlcconf();//本地配置文件初始化initrmconf();//远端配置文件初始化oakley_dhinit();//dh算法初始化compute_vendorids();//dpdparse(ac,av);//传进来的参数分析ploginit();//本地日志初始化pfkey_init()//内核接口af_key初始化,主要是向内核注册isakmp_cfg_init(ISAKMP_CFG_INIT_COLD))//isakmp配置初始化cfparse();//配置文件分析,别且赋值给相应结构体session();//主要会话下面是session函数里面的实现:sched_init();//调度初始化init_signal();//信号初始化admin_init()//和setkey,racoonctl的连接口初始化initmyaddr();//初始化本地地址isakmp_init()//isakmp初始化initfds();//初始化select的套接字natt_keepalive_init();//初始化nat协商的相关内容for(i=0;i<=NSIG;i++)//信号的相应保存变量初始化sigreq[i]=0;check_sigreq();//检测是否收到有信号error=select(nfds,&rfds,(fd_set*)0,(fd_set*)0,timeout);//多路监听admin_handler();//监听到setkey和racoonctl的fd触发,调用该函数处理isakmp_handler(p->sock);//监听到ike连接信息和ike协商信息处理函数pfkey_handler();//监听的内核af_key发上来的信息处理函数(包含发起ike协商等)isakmp_handler(p->sock);函数里最重要的函数是isakmp_main()isakmp_handler(p->sock);()这个函数里面除了数据包有效性检查外,ph1_main()第一阶段函数,quick_main()第二阶段处理函数,这两个函数最重要。这两个函数内分别用了一个重要的结构体:如下ph1exchange[][]整个racoon就靠这个结构体来进行协商。(可以说是贯穿整个racoon)staticint(*ph1exchange[][2][PHASE1ST_MAX])

__P((structphlhandle*,vchar_t*))=(/*error*/({},{},},/*IdentityProtectionexchange*/{{nostatel,ident_i1send,nostatel,ident_i2recv,ident_i2send,ident_i3recv,ident_i3send,ident_i4recv,ident_i4send,nostatel,},{nostatel,ident_r1recv,ident_r1send,ident_r2recv,ident_r2send,ident_r3recv,ident_r3send,nostatel,nostatel,nostatel,},},/*Aggressiveexchange*/{{nostatel,agg_ilsend,nostatel,agg_i2recv,agg_i2send,nostatel,nostatel,nostatel,nostatel,nostatel,},{nostatel,agg_rlrecv,agg_rlsend,agg_r2recv,agg_r2send,nostatel,nostatel,nostatel,nostatel,nostatel,},},/*Baseexchange*/{{nostatel,base_ilsend,nostatel,base_i2recv,base_i2send,base_i3recv,base_i3send,nostatel,nostatel,nostatel,},{nostatel,base_rlrecv,base_rlsend,base_r2recv,base_r2send,nostatel,nostatel,nostatel,nostatel,nostatel,},},};可以看的到上面有第一阶段有三个模式的发送和接受函数(main,Aggressive,base);其中有每一个模式下的交互消息一个函数。同时也有验证函数。如果熟悉几种模式的发包流程,相信通过函数定义的名字就可以轻松知道函数是干嘛用的了。(注意存在状态判断函数,发送和接收函数,每个阶段都不同)以上函数会在phl_main()调用,在pfkey_handler()调用的则是协商发起方。staticint(*ph2exchange[][2][PHASE2ST_MAX])__P((structph2handle*,vchar_t*))={/*error*/{{},{},},/*QuickmodeforIKE*/{{nostate2,nostate2,quick_ilprep,nostate2,quick_ilsend,quick_i2recv,quick_i2send,quick_i3recv,nostate2,nostate2,},{nostate2,quick_rlrecv,quick_rlprep,nostate2,quick_r2send,quick_r3recv,quick_r3prep,quick_r3send,nostate2,nostate2,}},};可以看到上面的第二阶段即快速模式下的发送和接受函数,这些函数就是ike第二阶段协商使用的。其中有二阶段的每个包的发送和接受,状态函数。具体是怎么实现的请参看相应的源代码。以上的ph2handle会在,quick_main()中调用。日志分析各个处理方法和流程参考代码就可以了。这就是大概流程,其中可能会涉及到openssl编码问题(第一阶段的算法为二阶段的传递信息编码)。日志分析:编写选出特定信息的脚本。通过awk的传参和让AWK进行处理。Linuxkernel网络协议栈流程:图1,tcp/ip协议栈AF_INET运行结构图(包含IPSEC,netfilter,af_key)Ne#?//。,维护链表:netfilter定义了一个二维的链表头数组structlist_headnf_hooks[NPROTO][NF_MAX_HOOKS]来表示所有协议族的各个挂接点,NPROTO值为32,可表示linux所支持所有32个协议族(include/linux/socket.h文件中定义),也就是使用socket(2)函数的第一个参数的值,如互联网的TCP/IP协议族PF_INET(2)。每个协议族有NF_MAX_HOOKS(8)个挂接点,但实际只用了如上所述的5个,数组中每个元素表示一个协议族在一个挂接点的处理链表头。图2,netfilter维护的链表结构图例如:在IPv4(PF_INET协议族)下,各挂接点定义在:NF_IP_PRE_ROUTING中,在IP栈成功接收sk_buff包后处理,挂接点在在net/ipv4/ip_input.c的函数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);挂接点的操作由结构structnf_hook_ops定义:include/linux/netfilter.hstructnf_hook_ops{structlist_headlist;//链表头,用于将此结构接入操作链表/*Userfillsinfromheredown.*/nf_hookfn*hook;//钩子函数intpf;//协议族inthooknum;//挂接点如:PREROUTING/*Hooksareorderedinascendingpriority.*/intpriority;//优先级};优先级列表: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_IP_PRI_NAT_SRC=100,NF_IP_PRI_LAST=INT_MAXfnet模块挂接(详细运转关系,由于时间原因,就不在叙述)af^ey模块挂接(详细运转关系,由于时间原因,就不在叙述)内核中PF_KEY实现要完成的功能是实现维护内核的安全联盟(SA)和安全策略(SP)数据库,以及和用户空间的接口。详细过程略xfrm_state表:xfrm状态用来描述SA在内核中的具体实现structxfrm_state{/*Note:bydstisre-usedduringgc*///每个状态结构挂接到三个HASH链表中structhlist_nodebydst;//按目的地址HASHstructhlist_nodebysrc;//按源地址HASHstructhlist_nodebyspi;//按SPI值HASHatomic_trefcnt;//所有使用计数spinlock_tlock;//状态锁structxfrm_idid;//IDstructxfrm_selectorsel;//状态选择子u32genid;/*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;//生存时间/*Datafortransformer*/structxfrm_algo*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_ttunnel_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;/*Referencetodatacommontoalltheinstancesofthistransformer.*/structxfrm_type*type;structxfrm_mode*mode;/*Securit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论