openswan在嵌入式平台的集成手记

2020-12-18

关键字:ipsec、l2tp


 

1、openswan是什么?

 

openswan是Linux平台开源的ipsec与l2tp协议的实现方案。

 

ipsec与l2tp都是网络通信加密的协议,openswan的作用就是对建立在互联网上的通信进行加密。

 

关于这三者的关系,可以简单理解成ipsec与l2tp是网络通信安全的理论基础,而openswan则是落地的具体方案。

 

2、如何获取openswan?

 

openswan是开源的,可以直接在Github上找到它的代码仓库。这里贴出它的各版本源码下载地址:

  https://github.com/xelerance/Openswan/tags

 

这里以 2.6.38 版本为例演示openswan在嵌入式平台的集成过程。

 

将下载下来的源码压缩包 Openswan-2.6.38.tar.gz 在合适的地方解压,解压后的目录结构如下图所示:

 

 

在集成过程中我们可能会关注到的源码目录有以下两个:

  1、lib/libopenswan

  2、programs

 

当然,这里说的“可能会关注到”不是说库代码有问题需要改动,这种版本号很高且很流行的开源库对于我们这种初次集成的情况来说可以认为是没有Bug的。这里所说的“关注”是因为可能会因具体的编译平台而异要修改部分Makefile语句或配置信息。

 

programs目录下是ipsec协议与xl2tp协议的实现代码,里面会有好几个默认的文件路径,如果我们对这些路径有要求,就需要去具体的源码里修改,这点在后文会有提到。

 

其它目录我们基本不用关心了,毕竟本文的目的是“集成”而不是“剖析”。

 

另外,openswan的编译产物会统一放到一个名为 "OBJ.**.**" 的目录中去。不同平台会有不一样的中后缀,这个在Makefile中有配置。

 

3、如何集成?

 

openswan源码已经有完善的Makefile的了,无须通过configure生成。

 

在其根目录下有个很重要的文件:Makefile.inc

 

这个文件是用于记载通用配置信息的,如编译选项、库等。openswan每一个关键的Makefile都会都会引入这个文件,因此,如果我们要自定义编译方式修改Makefile.inc即可。

 

事实上,openswan建议的是不要动Makefile.inc,如果要定制编译内容,应该去修改Makefile.vendor。但,我们不接受官方的建议。

 

打开Makefile.inc,在第58行~第132行是配置文件等外部存储的路径定义。因为openswan的编译产物有很多个可执行程序和脚本,且相互之间存在调用依赖的关系,为了这些调用能顺利完成,程序只能去这些预定的目录尝试调用。说白了就是这些目录定义了不同类型的编译产物的存放位置。默认情况下是以PC端linux环境来配置的,可能会不适用于嵌入式平台,解决的办法要么修改Makefile.inc中的配置路径,要么修改系统文件系统,使其满足openswan的运行需求。

 

Makefile.inc内容再往下就是定义系统内核代码目录的。这个目录的目的是因为openswan中携带了有不同版本linux系统的内核补丁,库在编译过程中可以将补丁打进内核源码中去。一般不用理会。

 

再往下拉到第519行,这里是对编译产物目录名称的定义。

 

然后拉到文档末尾,在合适的位置添加上编译链的定义。当然我们完全可以在敲击make命令时动态传入,但是考虑到编译链工具几乎不会变更,为了方便编译,直接在这里写死更好。添加的内容如下:

 

这里必须强调的是,不同平台编译链名称不一样,不可直接照搬笔者的内容。并且你要确保你的编译链工具能被shell认出来才能直接写工具名称,否则最好写绝对路径。

 

另外,openswan依赖libgmp库,因此还要在这里添加上libgmp库的依赖路径,同样,不同平台libgmp的环境不一样,需要根据自己的实际情况来填写路径信息,笔者这里只是给出一个模式参考而已:

 

 

可能有些同学的平台里没有集成libgmp开源库,那就必须先集成好它才能来编译openswan。libgmp的集成过程不在本文讨论范围,有需要的同学可自行寻找集成办法。

 

接下来打开 programs/pluto 目录下的 Makefile 与 Makefile.options 两个文件,在Makefile中按如下图所示添加libgmp的依赖路径,这里再次提醒,要以各自系统中libgmp具体的路径为准,不能照抄笔者的内容。

 

在Makefile.options中按下图所示删除 -lgmp 字样:

 

 

接着再打开 programs/rsakey/Makefile,按下图所示删掉 -lgmp 参数:

 

如此,便完成了所有的配置修改,此时再到 openswan 源码根目录下开始编译即可,openswan的编译命令不是直接make,需要加一个 programs 参数:

make programs

 

此时稍等片刻,不出意外便能正常退出编译过程,表示编译完成。编译产物如下图所示:

 

 

我们可以直接以 make install 来将产物转移到合适的位置,当然,前提是你已经正确配置了install输出目录。

 

不过,嵌入式平台通常各种资源都比较紧张,不太可能完整打包编译产物,更合适的做法是只将你需要的产物转移到合适位置即可。这块具体的做法就不赘述了。

 

 

4、尾记

 

本文记述的步骤是以笔者的嵌入式平台环境在集成过程中遇到的问题点,不保证绝对适用于任何嵌入式平台环境。如果很不幸在你的环境下按照本文步骤仍然无法正常编译,就需要自行费心排错了。总而言之,openswan的代码是没问题的,能出问题的只可能是某些依赖库没有正确配置路径。

 

另外,openswan的运行需要用到众多busybox中的工具,如果某些需要的工具没有打开,那么openswan的运行会直接结束并很可能没有任何错误信息反馈。笔者这边没有详细的busybox依赖列表,只能贴出能正常运行的平台上busybox已经打开的功能,希望能给有需要的同学一些参考作用,如下图所示:

 

 

最后,因为openswan的代码肯定是改动非常少的模块,因此,不太建议每次编译系统镜像时都编译openswan的代码。一种更节省编译时间的方式是手动编译成功后将要用到的产物文件额外打包出来,每次编译系统镜像时直接拷贝已准备好的产物即可。

 


 

posted @ 2020-12-18 21:30  大窟窿  阅读(1043)  评论(0编辑  收藏  举报