基于openswan klips的IPsec实现分析(六)应用层SADB操作

本文详细介绍了基于openswan klips的IPsec实现中,应用层如何通过SADB操作来增加、删除安全联盟SA。内容包括SA的结构、添加和删除SA的函数调用过程,以及SADB消息的构造和发送给内核的过程。
摘要由CSDN通过智能技术生成

基于openswan klips的IPsec实现分析(六)应用层SADB操作

转载请注明出处:http://blog.csdn.net/rosetta

    这里的操作是指由openswan的密钥管理守护进程pluto对于内核SADB的操作。如下来至rfc2367的密钥关联程序和PF_KEY的关系图。

                   

                     +----------------+

                     |密钥管理守护进程|

                     +----------------+

                       |           |

                       |           |

                       |           |                   应用程序

              ======[PF_KEY]====[PF_INET]==========================

                       |           |                   系统内核

               +------------+   +-----------------+

               |  密钥引擎 |   |     TCP/IP     |

               |    或者   |---|      包括       |

               |    SADB   |   |     IPsec      |

               +------------+   +-----------------+

                                        |

                                   +----------+

                                   | 网络接口 |

                                   +----------+

 

              图1:密钥关联程序和PF_KEY的关系

 

 

 

 

 

 

         pluto第二阶段协商成功收尾时,在发起方的quick_inR1_outI2()函数里调用install_ipsec_sa()增加SA。

        增加SA函数调用过程:

quick_inR1_outI2(), install_ipsec_sa(),setup_half_ipsec_sa(),kernel_ops->add_sa()(kernel_ops的成员赋值在《应用层和内核通信》一节讲,klips的add_sa指向的函数是pfkey_add_sa())。

删除SA函数调用过程:

在删除隧道或者SA过期等情况下调用相关删除函数,delete_ipsec_sa(),del_spi(),kernel_ops->del_sa()。

         如果存在多个SA的情况下,归组SA,即放到SA结构体数组中:

         setup_half_ipsec_sa(),kernel_ops->grp_sa()。

 

传说中的安全联盟SA概貌如斯:

struct kernel_sa {

   const ip_address *src; //源地址

   const ip_address *dst;  //目的地址

   

   const ip_subnet *src_client;//源保护子网

   const ip_subnet *dst_client;//目的保护子网

                 

   ipsec_spi_t spi; //spi

   unsigned proto; //安全协议

   unsigned satype; //安全联盟类型,比如ESP,AH,IPIP,IPCOMP等

   unsigned replay_window;//重放窗口

   unsigned reqid; //请求ID

                    

   unsigned authalg; //认证算法

   unsigned authkeylen; //认证算法密钥长度

   char *authkey;   //认证密钥

             

   unsigned encalg; //加密算法

   unsigned enckeylen; //加密算法密钥长度

   char *enckey; //加密密钥

 

   int encapsulation;//封装

   const char *text_said;

};

 

应用层构造SADB发送给内核,构造过程看似复杂,其实它只利用了一个指针数组做为中间buf,然后把此buf中的数据拷到pfkey_msg中,最后把pfkey_msg通过write pfkeyfd套接字把消息传给内核,最后释放指针和空间。

static bool pfkey_add_sa(const structkernel_sa *sa, bool replace)

{

   struct sadb_ext *extensions[SADB_EXT_MAX + 1]; //构造SADB临时使用的指针数组。

    boolsuccess = FALSE;

<
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值