刚开始学习openswan项目代码时,自己尝试了在虚拟机上编译、安装、运行openswan代码,由于当时刚开始学习openswan代码,因此对于其构成并不清楚,在编译、运行过程中有了问题,基本是通过百度来解决的。当时遇到的问题虽然不多,最终花了两天时间成功在两台虚拟机之间可以成功协商ipsec隧道,但是对于编译过程中的部分问题也一直不清楚。(关于在虚拟机中编译安装openswan,搭建ipsec环境,我当时写了一篇博客用来记录当时的问题和解决办法openswan源码ubantu下编译、安装、基本环境搭建)
恍惚间,自己接触和学习openswan代码已经差不多1年过去了(2020年1月份开始),离我上次在虚拟机中搭建ipsec环境也差不多10个来月(2020年3月份),这一年中几乎一直在和openswan打交道,但是对于代码的认知程度依然很低,其次对IKE、ipsec协议的理解也比较浅薄。举几个特别基础的例子:ipsec支持承载组播业务吗? 注意:不同于组播ipsec;openswan支持一条隧道多个保护子网配置吗?openswan源码的基本架构是什么? 对于这几个问题,在工作过程中并没有认真思考和研究过,直到这两天自己重新在两台虚拟机之间搭建ipsec环境时才有所发现。这几个问题有所想法时,才知道工作中是多么的不思进取,简直是闭门造车,坐井观天,哎,简直贻笑大方。
前车之鉴,后事之师。
下面介绍下openswan最基本的框架,这样做有两个目的:
- 方便编译openswan,弄清为何在README中有这么两种编译方式
- 学习ipsec代码时有所帮助
以下均为个人见解,如有错误,敬请原谅,此外欢迎指正、交流讨论。
首先openswan源码中ipsec实现(包括IKE)功能比较全,主要包括四部分:whack命令行、pluto进程、netlink接口、patch。他们之间的关系基本如下图所示:

Whack:
进行配置ipsec信息时的命令行可执行程序,主要功能是讲whack命令行参数转换为特定的结构并将该结构信息发送给pluto进程。所有ipsec操作都是通过whack命令来实现的。
Pluto:
pluto程序可以说的上是openswan的最为重要的部分,主责IKE协商、建立、维护、拆除ipsec隧道。ipsec协议中有SADB和SPDB数据库结构,但是Pluto却不负责该部分的维护工作,维护工作是通过netlink接口发送到Linux内核,由内核维护的数据结构。

netlink:
openswan源码中pluto是通过netLink套接字与Linux内核进行通讯,openswan通过接口封装的方式实现了多个操作类型,其中最核心的是ipsecSA,eroute等的结构的增删改查等操作接口。
patch:
这个部分才是ipsec协议的核心。它在openswan源码中是内核态实现的功能,openswan中通过注册申请虚拟隧道接口(ipsec0 ~ ipsecXXX),在隧道接口上注册多个操作函数,其中hard_xmit接口负责就是ipsec策略匹配和ipsec协议的封装。
如果需要使用openswan的ipsec匹配加密解密流程,则需要将此patch合入到Linux内核源码中,然后重新进行编译工作。这便是在openswan源码中README编译文件中所说的:
| KLIPS/KLIPSNG (Openswan IPsec stack) ------------------------------------
To use the Openswan KLIPS IPsec stack (ipsec0 devices) for Linux Kernels 2.6.23 and higher, the following steps should work. From the Openswan directory:
make programs make KERNELSRC=/lib/modules/`uname -r`/build module sudo make KERNELSRC=/lib/modules/`uname -r`/build install minstall |

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/44677.html