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

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

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

转载请注明出处:http://blog.youkuaiyun.com/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;

        

         //构造消息头结构体structsadb_msg信息。

   success = pfkey_msg_start(replace ? SADB_UPDATE : SADB_ADD,sa->satype

                                  , "pfkey_msg_hdr Add SA"

                                  , sa->text_said, extensions);

 

   if(!success) return FALSE;

 

//构造结构体struct sadb_sa信息,包换SPI,回放窗口,认证算法,加密算法等。

// pfkey_sa_build()函数返回0表示成功,pfkey_build()用于处理pfkey_sa_build()返回失败的情况下打印详细的错误信息;如果成功直接返回0。

   success = pfkey_build(pfkey_sa_build(&extensions[SADB_EXT_SA]

                                                , SADB_EXT_SA

                                                , sa->spi /*in network order */

                                                , sa->replay_window, SADB_SASTATE_MATURE

                                                , sa->authalg, sa->encalg, 0)

<
### Openswan IPsec 配置与故障排除 #### 安装 Openswan 对于基于 Debian 的系统,可以使用如下命令来安装 Openswan: ```bash sudo apt-get update && sudo apt-get install openswan ``` 对于 Red Hat 或 CentOS 系统,则应执行以下操作以获取并安装软件包[^1]: ```bash sudo yum install epel-release sudo yum install openswan ``` #### 基本配置文件结构 主要的配置位于 `/etc/ipsec.conf` 文件内。此文件定义了安全关联(SAs),即两个端点之间的加密通信协议。一个典型的设置可能看起来像这样: ```plaintext config setup plutodebug=all protostack=netkey conn myconnection authby=secret auto=start type=tunnel left=<local_IP> leftsubnet=<local_subnet> right=<remote_IP> rightsubnet=<remote_subnet> ``` 上述片段中的 `left` 和 `right` 参数分别指代本地和远程网关地址;而 `leftsubnet` 及 `rightsubnet` 则表示要保护的数据流所涉及的具体子网络范围。 为了使这些更改生效,在编辑完成后需重启服务: ```bash sudo systemctl restart ipsec.service ``` 或者在较旧版本上可能是这样的命令: ```bash sudo service ipsec restart ``` #### 故障排查技巧 当遇到连接失败的情况时,查看日志是一个很好的起点。通常可以在 `/var/log/syslog` (Debian/Ubuntu) 或者 `/var/log/messages` (RedHat/CentOS) 中找到相关信息。特别关注带有 "pluto" 字样的条目,因为这是负责建立 SA 的守护进程的名字。 如果发现密钥协商存在问题,尝试调整 debug 设置以便获得更详细的输出: ```plaintext plutodebug="all" ``` 这会增加调试信息量,有助于识别潜在问题所在之处[^2]。 另外值得注意的是防火墙规则也可能阻碍正常工作。确保允许 UDP 500 (ISAKMP/IKE)以及 ESP 协议通过,并且如果有 NAT 情况下还需要开放 UDP 4500 端口用于NAT-T功能支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值