当前位置:文档之家› linux路由协议网络协议栈

linux路由协议网络协议栈

迈普学习总结经过在公司里学习了几个月,把大体的工作总结于下:在参与1800-20 3G 路由的开发中,我参与了l2tp, gre ,静态路由, ipsec ,日志关键信息提取的编写。

并同时参与了ipsec-tools 源码,linux kernel 网络协议栈源码,l2tpd 源码分析。

并且同时了解了vrrp ,rip 等协议。

L2TP 模块:L2tp 代码流程:其中认证过程分为pap 和chap 认证: Pap 认证:认证信息Chap 认证:大体过程应该是这样的,中间也许有错,主要是记不大清楚了。

Pppd 向内核注册过程如下图:做lac 的路由器通过拨号到lns ,通过上面的连接认证后,lns 会给lac 分配一个私有ip 地址,该Ip 地址可以和2通信。

通过这个过程后,久可以让内网1的pc 访问内网2的pc 。

内路由器路由器内laclnslaclnslaclnslaclns通过认证发送加密数据,使LAC认证信息通过认证inteGre 模块:模型:开始的时候,内网1和内网2是不能相互到达的,因为中间有许多中间网络。

当建立好GRE 隧道后,内网1就可以和内网2通信了。

实现:GRE 脚本主要通过iproute2这个工具实现。

使用的主要脚本命令: I p route add $name mode gre remote $remoteip local $localip ttl 255 I p route set $name upI p route add net $net/$mask dev $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)。

它并不关心数据包能否真正的到达。

实现:具体命令:route add –net $net mask $netmask gw $gateway dev $device 责任:静态路由的脚本的基本框架。

Ipsec 模块:原理:在内核2.6版本中已经存在ipsec 模块,该模块的主要作用是让数据包经过加密/认证从安全的隧道中到达指定的目标地址。

它的有几种数据包格式,一种是esp,一种是ah,另一种是esp+ah 。

他们的报文格式如下:Ah 是一种用于认证报文,它主要是给数据包提供认证,防重放;ESP 是一种用于加密报文,当然它也有认证的功能,并且也具有抗重放的机制。

它是一种更优越于AH 的报文结构。

另外,esp+ah 则是一种集esp 和ah 于一身的格式,当然它的安全性就更不可否认了。

整个模块分为两大类:第一类,kernel ipsec 的实现,第二类上层应用程序ike 即为ipsec 模块协商认证算法和加密算法的协议。

下面谈谈ike 协议。

Ike协议分为两个阶段,第一阶段协商对对方的身份进行认证,并且为第二阶段的协商提供一条安全可靠的通道。

第一个阶段又分为3种模式,我们常用的有两种模式,一个是主模式,一个是积极模式。

第二阶段主要对IPSEC的安全性能进行协商,产生真正可以用来加密数据流的密钥。

主模式(IKE SA 阶段):以上过程中包含验证信息,我就没特别指出了。

具体参见如下:发送cockie包,用来标识唯一的一个IPSEC会话。

IKE阶段一(主模式):发送消息1 initiator====>responsorisakmp headersa payloadproposal payloadtransform payload定义一组策略:加密方法:DES认证身份方法:预共享密钥认证散列:MD5存活时间:86400秒Diffie-Hellman group:1IKE阶段二(主模式):发送消息2 initiator<====responsor同上IKE阶段三(主模式):发送消息3 initiator====>responsor通过DH算法产生共享密钥KE(Key Exchang) Payloadnonce(暂时)PayloadDH 算法:A: P(较大的质数) B: P(较大的质数) G GPriA (随机产生) PriB (随机产生) PubA=G^PriA mod P PubB=G^PriB mod P 交换PubA 和PubBZ=PubB^PriA mod P Z=PubA^PriB mod PZ 就是共享密钥,两个自我产生的Z 应相同,它是用来产生3个SKEYID 的素材。

IKE 阶段四(主模式):发送消息4 initiator<====responsor 同上主模式第3、4条消息其实就是DH 算法中需要交换的几个参数,然后路由器再通过DH 算法计算出的公共密钥计算出以下3个参数(这是在发送第5、6个消息前完成的):SKEYID_d:留在在第二阶段用,用来计算后续的IKE 密钥资源; SKEYID_a:散列预共享密钥,提供IKE 数据完整性和认证;SKEYID_e:用来加密下一阶段的message ,data, preshared key ,包括第二阶段。

IKE 阶段五(主模式):发送消息5 initiator====>responsor Identity Payload :用于身份标识 Hash Payload :用来认证以上2个负载都用SKEYID_e 加密IKE 阶段六(主模式):发送消息6 initiator<====responsor 同上消息5、6是用来验证对等体身份的。

至此IKE 协商第一阶段完成。

主要会发送6个报文,由于最后一组报文发送的是身份,此时身份已经加密,因此,只能采用地址进行认证,但其安全性高于积极模式。

缺点是耗时比积极模式长。

积极模式:主要发送3个报文,安全性没有主模式好,由于其ID 不加密,因此可用于移动客户端模式。

即不用地址作为ID 。

优点:速度快,缺点安全性不高。

第二阶段快速模式(IPSec SA 阶段):所有二阶段参数,提议,算法以上过程中包含验证信息(最开始如果支持PFS算法,那么还要协商DH算法),我就没特别指出了。

具体参见如下:首先判断是否启用了PFS(完美转发安全),若启用了则重新进行DH算法产生密钥,若没有启用则是用第一阶段的密钥。

IPSec阶段一(快速模式):发送消息1 initiator====>responsor同样定义一组策略,继续用SKEYID_e加密:Encapsulation— ESPIntegrity checking— SHA-HMACDH group— 2Mode— TunnelIPSec阶段二(快速模式):发送消息2 initiator<====responsor同上,主要是对消息1策略的一个确认。

在发送消息3前,用SKEYID_d,DH共享密钥,SPI等产生真正用来加密数据的密钥。

IPSec阶段三(快速模式):发送消息3 initiator====>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()第二阶段处理函数,这两个函数最重要。

相关主题