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

下载本文档

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

文档简介

1、WORD格式迈普学习总结经过在公司里学习了几个月,把大体的工作总结于下:在参与 1800-20 3G 路由的开发中,我参与了l2tp, gre ,静态路由 , ipsec,日志关键信息提取的编写。并同时参与了ipsec-tools 源码, linux kernel网络协议栈源码,l2tpd 源码分析。并且同时了解了vrrp ,rip 等协议。L2TP 模块:专业资料整理WORD格式L2tp 代码流程:laclaclaclaclaclaclaclaclaclaclaclac其中认证过程分为Pap 认证:laclacChap 认证:laclaclac连接请求连接成功Ppp 连接请求Ppp 允许连接

2、协商Ppp 配置文件Ppp 配置文件Ppp 配置 ACKPpp 配置 ACKPpp认证ncp 网络配置承受 ncp 网络配置ACKpap 和 chap 认证:认证信息通过认证发送加密数据, 使 LAC 认证认证信息通过认证lnslnslnslnslnslnslnslnslnslnslnslnslnslnslnslnslns专业资料整理WORD格式大体过程应该是这样的,中间也许有错,主要是记不大清楚了。Pppd 向内核注册过程如以下图:internet路由器 lns内网 1路由器 lac拓扑图:内网 2做 lac 的路由器通过拨号到lns,通过上面的连接认证后,lns 会给 lac 分配一个私有

3、ip 地址,该 Ip 地址可以和2 通信。通过这个过程后,久可以让内网1 的 pc 访问内网 2 的 pc。Gre 模块:模型:内网 1路由器internet路由器内网 2开场的时候,内网1 和内网 2 是不能相互到达的,因为中间有许多中间网络。当建立好GRE 隧道后,内网1 就可以和内网2 通信了。实现: GRE 脚本主要通过iproute2 这个工具实现。使用的主要脚本命令:Ip route add $name mode gre remote $remoteip local $localip ttl 255Ip route set $name upIp route add net $net

4、/$mask dev $name脚本流程:脚本从lua 保存的配置文件中获取到上面的变量值,然后通过以上指令,将变量值设置到相应的隧道中。责任:主要担任gre 模块的测试与linux 。DDNS 模块:专业资料整理WORD格式原理: DDNS 又叫动态域名解析。实用环境是在用户动态获取变化,相应的域名将不能解析到变换后的IP 地址上。然后DDNSIP 地址的情况下。因为传统的 DNS 只能与固定 IP 地址绑定,一旦 IP 地址发生改变了这一点。它以动态域名绑定的方式来完成这一点。什么叫动态域名呢?就专业资料整理WORD格式是指在用户的IP 地址发生改变时,相应的DDNS需要效劳器将以前绑定域

5、名的IP 换成现在变化后的他人通过域名就能访问的内网的某台计算上的效劳器。责任: DDNS 的测试。客户端会把自己现在的变化后的IP 地址传给DDNS 效劳器, 告诉它自己的IPIP 地址。如果内部在加上端口映射,那么久可以实现路由器内部的主机间接与地址已经发生变化,DNS 绑定, 即其专业资料整理WORD格式静态路由模块 :原理:举个例子,当一个路由器刚接入到一个网络中时,在这个陌生的环境中,它根本不知道去某个地址该怎么走,静态路由就相当于一个指路人,它告诉路由器某个 IP 地址该怎么走。配置的时候,只需要告诉路由器到达某个网络需要从哪X网卡和相应网卡出去的网关地址就可以了。这样但凡到那个网

6、络的IP 数据包,路由器都会将它从相应网卡转发出去ttl-1 。它并不关心数据包能否真正的到达。实现:具体命令:route add net $net mask $netmask gw $gateway dev $device责任:静态路由的脚本的根本框架。Ipsec 模块:专业资料整理WORD格式原理:在内核数据包格式,一种是2.6 版本中已经存在ipsecesp,一种是 ah,另一种是模块,该模块的主要作用是让数据包经过加密esp+ah。他们的报文格式如下:/认证从平安的隧道中到达指定的目标地址。它的有几种专业资料整理WORD格式Ah 是一种用于认证报文,它主要是给数据包提供认证,防重放;E

7、SP 是一种用于加密报文,当然它也有认证的功能,并且也具有抗重放的机制。它是一种更优越于AH 的报文构造。另外, esp+ah 那么是一种集 esp 和 ah 于一身的格式,当然它的平安性就更不可否认了。整个模块分为两大类:第一类,kernel ipsec 的实现,第二类上层应用程序ike 即为 ipsec 模块协商认证算法和加密算法的协议。下面谈谈ike 协议。Ike 协议分为两个阶段,第一阶段协商对对方的身份进展认证,并且为第二阶段的协商提供一条平安可靠的通道。第一个阶段又分为3种模式,我们常用的有两种模式,一个是主模式,一个是积极模式。第二阶段主要对IPSEC 的平安性能进展协商,产生真

8、正可以用来加密数据流的密钥。主模式 IKE SA 阶段:发起端平安提议,转换载荷,一些详情接收端发起端平安提议,转换载荷,一些详情接收端发起端DH 算法产生公共密钥,密钥交接收端发起端DH 算法产生公共密钥,密钥交接收端发起端加密 ID ,进展身份认证接收端发起端加密 ID ,进展身份认证接收端以上过程中包含验证信息,我就没特别指出了。具体参见如下:发送 cockie包,用来标识唯一的一个IPSEC会话。IKE 阶段一主模式:发送消息1initiator=responsorisakmp headersa payloadproposal payloadtransform payload定义一组策

9、略:加密方法: DES认证身份方法:预共享密钥认证散列: MD5专业资料整理WORD格式存活时间: 86400 秒Diffie-Hellman group: 1IKE 阶段二主模式:发送消息2initiatorresponsor通过 DH算法产生共享密钥KEKey Exchang) Payloadnonce(暂时 PayloadDH算法:A:P(较大的质数B: P(较大的质数GGPriA随机产生PriB随机产生PubA=GPriA mod PPubB=GPriB mod P交换 PubA和 PubBZ=PubBPriA mod PZ=PubAPriB mod PZ就是共享密钥,两个自我产生的Z

10、 应一样,它是用来产生3 个 SKEYID的素材。IKE 阶段四主模式:发送消息4initiatorresponsorIdentity Payload:用于身份标识Hash Payload:用来认证以上 2 个负载都用SKEYID_e加密IKE 阶段六主模式:发送消息6initiatorresponsor同样定义一组策略,继续用SKEYID_e加密:Encapsulation ESP专业资料整理WORD格式Integrity checkingSHA-HMAC专业资料整理WORD格式DH group2专业资料整理WORD格式ModeTunnel专业资料整理WORD格式IPSec 阶段二快速模式:

11、发送消息2initiatorresponsor用来核实responsor的 liveness。专业资料整理WORD格式至此,整个IPSec 协商的两个过程已经完成,两端可以进展平安的数据传输。专业资料整理WORD格式实现: ike责任:负责协议我们主要是通过利用开源软件ipsec 的代码 BUG 解决 BUGipsec-tools 来实现的。数量多,就不列出了 , ipsec 的证书申请脚本编写研究了openssl。专业资料整理WORD格式Ipsec-tools流程:eay_init();/opensll 初始化initlcconf();/ 本地配置文件初始化initrmconf();/ 远端

12、配置文件初始化oakley_dhinit();/dh算法初始化compute_vendorids();/dpdparse(ac, av);/传进来的参数分析ploginit();/ 本地日志初始化pfkey_init()/ 内核接口af_key 初始化,主要是向内核注册isakmp_cfg_init(ISAKMP_CFG_INIT_COLD)/isakmp配置初始化cfparse();/ 配置文件分析,别且赋值给相应构造体session();/主要会话下面是 session 函数里面的实现:专业资料整理WORD格式sched_init();/ 调度初始化init_signal();/ 信号初始

13、化admin_init()/ 和 setkey, racoonctl 的连接口初始化initmyaddr();/ 初始化本地地址isakmp_init()/isakmp初始化initfds();/ 初始化 select 的套接字natt_keepalive_init ();/ 初始化 nat 协商的相关内容for (i = 0; i sock);/ 监听到 ike 连接信息和ike 协商信息处理函数pfkey_handler();/ 监听的内核af_key 发上来的信息处理函数包含发起ike 协商等专业资料整理WORD格式isakmp_handler(p-sock); 函数里最重要的函数是is

14、akmp_main isakmp_handler(p-sock); 这个函数里面除了数据包有效性检查外,ph1_main第一阶段函数,quick_main 第二阶段处理函数,这两个函数专业资料整理WORD格式最重要。这两个函数内分别用了一个重要的构造体:如下专业资料整理WORD格式ph1exchange整个 racoon 就靠这个构造体来进展协商。可以说是贯穿整个racoonstatic int (*ph1exchange2PHASE1ST_MAX)专业资料整理WORD格式_P(struct ph1handle *, vchar_t *) = /* error */ , , ,/* Ident

15、ity Protection exchange */ 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, ,/* Aggressive excha

16、nge */ nostate1, agg_i1send, nostate1, 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_i2sen

17、d, base_i3recv, base_i3send, nostate1, nostate1, nostate1, , nostate1, base_r1recv, base_r1send, base_r2recv, base_r2send, nostate1, nostate1, nostate1, nostate1, nostate1, ,;可以看的到上面有第一阶段有三个模式的发送和承受函数main , Aggressive, base ;其中有每一个模式下的交互消息一个函数。同时也有验证函数。如果熟悉几种模式的发包流程,相信通过函数定义的名字就可以轻松知道函数是干嘛用的了。 注意存在状

18、态判断函数,发送和接收函数,每个阶段都不同以上函数会在ph1_main调用,在pfkey_handler() 调用的那么是协商发起方。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

19、, , nostate2, quick_r1recv, quick_r1prep, nostate2, quick_r2send,quick_r3recv, quick_r3prep, quick_r3send, nostate2, nostate2, ,;可以看到上面的第二阶段即快速模式下的发送和承受函数,这些函数就是ike 第二阶段协商使用的。其中有二阶段的每个包的发送和承受,状态函数。具体是怎么实现的请参看相应的源代码。以上的ph2handle 会在, quick_main 中调用。各个处理方法和流程参考代码就可以了。这就是大概流程,其中可能会涉及到openssl 编码问题第一阶段的算法

20、为二阶段的传递信息编码。专业资料整理WORD格式日志分析:编写选出特定信息的脚本。通过awk 的传参和让AWK 进展处理。专业资料整理WORD格式Linux kernel 网络协议栈流程:Ip_recv()LINKIP header checkIP *有效性检查Managle(PREROUTING)主 要 改变整个路由抉择可Mark,tos,ttl通过找到的策略调用以过滤多播或组播NAT(PREROUTEING)相关 SA 封装 IPSEC 数DNA T据包De_fragmentRoute decisionOuput_routeInput_routeOutput_routeManagle(IN

21、PUT)承受包过滤专业资料整理WORD格式Filter(INPUT)Transfer(tcp, udp handle)Recvmsg() (socket)Local process平安路由检查,查找路由表(包括查找IPSEC 策略 )Some_check包括本机IPSEC 数据包处理,或 tcp,udp,icmp 等Managle (FORWARD)ESP,AH 使用 netif_rx() 等专业资料整理WORD格式sendmsg() (socket)Transfer(tcp, udp handle)Route decisionInput_routeOutput_routeManagle (O

22、UTPUT)Nat (OUTPUT)Filter(OUTPUT)转发包过滤平安路有检查, 查找路由表 (包括查找 IPSEC 策略 )通过找到的策略调用相关 SA 封装 IPSEC 数据包发送包过滤Managle(POSTROUTING)FilterFORWARD主要改变Mark,tos,ttl专业资料整理WORD格式IP_fragmentNAT(POSTROUTING)SNATIp_Send_out()LINK专业资料整理WORD格式QOS专业资料整理WORD格式图 1, tcp/ip 协议栈 AF_INET 运行构造图包含IPSEC, netfilter,af_key 专业资料整理WORD

23、格式Netfilter 维护链表:专业资料整理WORD格式netfilter 定义了一个二维的链表头数组struct list_head nf_hooksNPROTONF_MAX_HOOKS来表示所有协议族的各个挂接点,NPROTO32,可表示 linux 所支持所有32 个协议族 (include/linux/socket.h文件中定义 ),也就是使用socket(2)函数的第一个参数的值,如互联网的TCP/IP族 PF_INET(2) 。每个协议族有NF_MAX_HOOKS8个挂接点,但实际只用了如上所述的5 个,数组中每个元素表示一个协议族在一个挂接点的处理链表头。值为协议专业资料整理W

24、ORD格式AF_LOCALAF_INETAF_AX25AF_IPXPREROUTINGFORWARDINPUTOUTPUTPOSTROUTING . . . .managlemanaglemanaglemanaglemanaglenatfilterfilternatnat . . .filter .图 2, netfilter 维护的链表构造图例如:在 IPv4 PF_INET 协议族下,各挂接点定义在: NF_IP_PRE_ROUTING 中,在 IP 栈成功接收 sk_buff 包后处理,挂接点在在 net/ipv4/ip_input.c 的函数int ip_rcv(struct sk_b

25、uff *skb, struct net_device *dev, struct packet_type *pt)中使用:return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,ip_rcv_finish);挂接点的操作由构造struct nf_hook_ops 定义:include/linux/netfilter.hstruct nf_hook_opsstruct list_head list;/链表头,用于将此构造接入操作链表/* User fills in from here down. */nf_hookfn *hook;/

26、钩子函数int pf;/协议族int hooknum;/ 挂接点如: PREROUTING/* Hooks are ordered in ascending priority. */int priority;/ 优先级;专业资料整理WORD格式优先级列表:NF_IP_PRI_FIRST = INT_MIN,NF_IP_PRI_CONNTRACK = -200,NF_IP_PRI_MANGLE = -150,NF_IP_PRI_NA T_DST = -100,NF_IP_PRI_FILTER = 0,NF_IP_PRI_NA T_SRC = 100,NF_IP_PRI_LAST = INT_MA

27、Xaf_inet 模块挂接详细运转关系,由于时间原因,就不在表达:inet_init()注册套接字操作函数,STREAM ,即使用 socket 套接字建立之后, 调用函数如: ioctl, send, recv, setsockopt,close,connect 等的注册 (传输层到网络层 )。添加到构造体 proto_list 中。RAW, DGRAM注册 socket 调用函数用户空间使用 socket 选择 PF_INET 后,把内核调用的函数inet_create 添加到构造体 net_familiesPF_INET 中。主要分配构造体 sock INET_sock 注册传输层处理函

28、数(包括 IGMP)当通过 ip_rcv 之后的路由抉择以后的传输层处理函数,如tcp handle,添加到构造体 inet_protosprotocol 中。初始化 ARP,IP,TCP,UDP,ICMP 相关参数,添加相关信息。初始化相关信息 namespace,如路由表初始化专业资料整理WORD格式注册模块处理类型IPV4添加构造体ip_packet_type ,下层软件通过调用的模块。ip_packet_type类型来判断需要专业资料整理WORD格式af_key模块挂接详细运转关系,由于时间原因,就不在表达:内核中 PF_KEY 实现要完成的功能是实现维护内核的平安联盟(SA) 和平安

29、策略 (SP)数据库 , 以及和用户空间的接口。Ipsec_afkey_init()即 使 用socket 套 接 字建 立 之 后 的 端 口 操 作。这 里 只 注 册 了 结 构 体注册套接字操作函数专业资料整理WORD格式pfkey_sock大小。挂接到链表proto_list 中专业资料整理WORD格式注册socket 调用函数用户空间使用socket 选择 PF_KEY 后,把内核调用函数afkey_create 添加到构造体net_familiesPF_INET 中。主要分配构造体sock,设置操作函数构造体 pfkey_ops ,包含 sendmsg(), recvmsg()函

30、数专业资料整理WORD格式登记通知 (notify) 处理 pfkeyv2_mgr登记通知 (notify) 处理 pfkeyv2_mgr , 挂接到链表xfrm_km_list 中。详细过程略xfrm_state表:xfrm 状态用来描述SA 在内核中的具体实现struct xfrm_state专业资料整理WORD格式/* Note: bydst is re-used during gc */ 每个状态构造挂接到三个 HASH 链表中struct hlist_node bydst; / 按目的地址HASHstruct hlist_node bysrc; / 按源地址HASHstruct hl

31、ist_node byspi; / 按 SPI 值 HASHatomic_t refcnt; / 所有使用计数spinlock_t lock;/ 状态锁struct xfrm_id id; / IDstruct xfrm_selector sel; / 状态选择子u32genid;/* 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 fl

32、ags;u16 family;xfrm_address_t saddr;int header_len;int trailer_len; props;struct xfrm_lifetime_cfg lft;/ 生存时间/* Data for transformer */struct xfrm_algo *aalg;/ hash 算法struct xfrm_algo *ealg;/ 加密算法struct xfrm_algo *calg;/ 压缩算法/* Data for encapsulator */struct xfrm_encap_tmpl *encap;/ NAT-T 封装信息/* Dat

33、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 tim

34、e we sent the last notification */struct xfrm_replay_state preplay;/* internal flag that only holds state for delayed aevent at the* moment*/u32 xflags;/* Replay detection notification settings */u32replay_maxage;u32replay_maxdiff;/* Replay detection notification timer */struct timer_list rtimer;/* Statistics */专业资料整理WORD格式struct xfrm_stats stats;struct xfrm_lifetime_cur curlft;struct timer_list timer;/* Last used time */u64lastused;/* Reference to data common to all the

温馨提示

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

评论

0/150

提交评论