您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > linux-ipsec-实现
1.前言在Linux2.6内核中自带了IPSEC的实现,这样就不用象2.4那样打补丁来实现了。该实现包括以下几个部分:PF_KEY类型套接口,用来提供和用户层空间进行PF_KEY通信,代码在net/key目录下,前面已经介绍过;安全联盟SA和安全策略SP管理,是使用xfrm库来实现的,代码在net/xfrm/目录下定义;ESP,AH等协议实现,在net/ipv4(6)下定义;加密认证算法库,在crypto目录下定义,这些算法都是标准代码了。本系列文章主要描述XFRM库的实现以及在IPV4下相关协议的处理部分,IPV6的忽略。本文Linux内核代码版本为2.6.19.2。xfrm是内核中变化比较大的部分,每个版本中都有不小的差异,同时也说明了该模块的不成熟性。在net/xfrm目录下的各文件大致功能说明如下:xfrm_state.c:xfrm状态管理xfrm_policy.c:xfrm策略管理xfrm_algo.c:算法管理xfrm_hash.c:HASH计算函数xfrm_input.c:安全路径(sec_path)处理,用于进入的ipsec包xfrm_user.c:netlink接口的SA和SP管理在net/ipv4目录下的和ipsec相关各文件大致功能说明如下:ah4.c:IPV4的AH协议处理esp4.c:IPV4的ESP协议处理ipcomp.c:IP压缩协议处理xfrm4_input:接收的IPV4的IPSEC包处理xfrm4_output:发出的IPV4的IPSEC包处理xfrm4_state:IPV4的SA处理xfrm4_policy:IPV4的策略处理xfrm4_tunnel:IPV4的通道处理xfrm4_mode_transport:传输模式xfrm4_mode_tunnel:通道模式xfrm4_mode_beet:BEET模式2.数据结构内核SA的定义用xfrm_state结构定义,SP用xfrm_policy结构定义,在include/net/xfrm.h中定义。2.1状态(SA)xfrm_state状态结构用来描述SA在内核中的具体实现:structxfrm_state{/*Note:bydstisre-usedduringgc*///每个状态结构挂接到三个HASH链表中structhlist_nodebydst;//按目的地址HASHstructhlist_nodebysrc;//按源地址HASHstructhlist_nodebyspi;//按SPI值HASHatomic_trefcnt;//所有使用计数spinlock_tlock;//状态锁structxfrm_idid;//ID结构,即目的地址,SPI,协议三元组structxfrm_selectorsel;//状态选择子u32genid;//状态的标志值,防止发生碰撞/*Keymangerbits*/struct{u8state;u8dying;u32seq;}km;//KEY回调管理处理结构参数/*Parametersofthisstate.*/struct{u32reqid;//请求IDu8mode;//模式:传输/通道u8replay_window;//回放窗口u8aalgo,ealgo,calgo;//认证,加密,压缩算法ID值u8flags;//一些标准u16family;//协议族xfrm_address_tsaddr;//源地址intheader_len;//添加的协议头长度inttrailer_len;//}props;//SA相关参数结构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;//通道,实际是另一个SA/*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;//SA定时器/*Lastusedtime*/u64lastused;//上次使用时间/*Referencetodatacommontoalltheinstancesofthis*transformer.*/structxfrm_type*type;//协议,ESP/AH/IPCOMPstructxfrm_mode*mode;//模式,通道或传输/*Securitycontext*/structxfrm_sec_ctx*security;//安全上下文,加密时使用/*Privatedataofthistransformer,formatisopaque,*interpretedbyxfrm_typemethods.*/void*data;//内部数据};2.2安全策略(SP)xfrm_policy结构用于描述SP在内核内部的具体实现:structxfrm_policy{structxfrm_policy*next;//下一个策略structhlist_nodebydst;//按目的地址HASH的链表structhlist_nodebyidx;//按索引号HASH的链表/*Thislockonlyaffectselementsexceptforentry.*/rwlock_tlock;//策略结构锁atomic_trefcnt;//引用次数structtimer_listtimer;//策略定时器u8type;//类型u32priority;//策略优先级u32index;//策略索引号structxfrm_selectorselector;//选择子structxfrm_lifetime_cfglft;//策略生命期structxfrm_lifetime_curcurlft;//当前的生命期数据structdst_entry*bundles;//路由链表__u16family;//协议族__u8action;//策略动作,接受/加密/阻塞...__u8flags;//标志__u8dead;//策略死亡标志__u8xfrm_nr;//使用的xfrm_vec的数量structxfrm_sec_ctx*security;//安全上下文structxfrm_tmplxfrm_vec[XFRM_MAX_DEPTH];//状态模板};xfrm模板结构,用于状态和策略的查询:structxfrm_tmpl{/*idintemplateisinterpretedas:*daddr-destinationoftunnel,maybezerofortransportmode.*spi-zerotoacquirespi.Notzeroifspiisstatic,then*daddrmustbefixedtoo.*proto-AH/ESP/IPCOMP*///SA三元组,目的地址,协议,SOIstructxfrm_idid;/*Sourceaddressoftunnel.Ignored,ifitisnotatunnel.*///源地址xfrm_address_tsaddr;//请求ID__u32reqid;/*Mode:transport,tunneletc.*/__u8mode;/*Sharingmode:unique,thissessiononly,thisuseronlyetc.*/__u8share;/*MayskipthistransfomrationifnoSAisfound*/__u8optional;/*Bitmaskofalgosallowedforacquisition*/__u32aalgos;__u32ealgos;__u32calgos;};2.3协议结构对ESP,AH,IPCOMP等协议的描述是通过xfrm_type结构来描述的,多个协议的封装就是靠多个协议结构形成的链表来实现:structxfrm_type{char*description;//描述字符串structmodule*owner;//协议模块__u8proto;//协议值__u8flags;//标志#defineXFRM_TYPE_NON_FRAGMENT1//初始化状态int(*init_state)(structxfrm_state*x);//析构函数void(*destructor)(structxfrm_state*);//数据输入函数int(*input)(structxfrm_state*,structsk_buff*skb);//数据输出函数int(*output)(structxfrm_state*,structsk_buff*pskb);//拒绝函数int(*reject)(structxfrm_state*,structsk_buff*,structflowi*);//头部偏移int(*hdr_offset)(structxfrm_state*,structsk_buff*,u8**);//本地地址xfrm_address_t*(*local_addr)(structxfrm_state*,xfrm_address_t*);//远程地址xfrm_address_t*(*remote_addr)(structxfrm_state*,xfrm_address_t*);/*Estimatemaximalsizeofresultoftransformationofadgram*///最大数据报长度u32(*get_max_size)(structxfrm_state*,intsize);};具体的协议结构定义如下,通常只定义初始化,析构,输入和输出四个成员函数:AH协议定义/*net/ipv4/ah4.c*/staticstructxfrm_typeah_type={.description=AH4,.owner=THIS_MODULE,.proto=IPPROTO_AH,.init_state=ah_init_state,.destructor=ah_destroy,.input=ah_input,.output=ah_output};ESP协议定义:/*net/ipv4/esp4.c*/stati
本文标题:linux-ipsec-实现
链接地址:https://www.777doc.com/doc-7240480 .html