openswan框架和编译时说明

 

刚开始学习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

 

但是如果不想使用openswan的ipsec协议栈,可以直接使用Linux源码中的ipsec协议栈。不错,在Linux源码中,实现了另一种的ipsec封装代码,完全不同的另一套IPSec实现

 

这是在编译源码中我们只需要编译pluto、netlink代码,安装上相应的运行环境即可,不再需要patch部分功能,因为这部分功能已经由Linux内核实现了。已经由Linux内核实现了。已经由Linux内核实现了。比较有意思的是netlink的通讯方式依然是可用的,使用openswan中的whack, pluto,netlink功能可以控制底层Linux内核中的ipsec功能。此时编译工作便简单了很多:

 

NETKEY (Native linux IPsec stack)

---------------------------------

 

To use Openswan with the linux native (builtin) IPsec stack,  then the

following steps should be all that are needed. Please use at least kernel

version 2.6.9, as prior versions of the kernel have serious bugs in the

native IPsec stack.  From the Openswan directory:

 

    make programs

    sudo make install

 

编译完毕后,通过"ipsec verify"检查安装情况:

root@ubantu:/etc/ipsec.d# ipsec verify

Checking if IPsec got installed and started correctly:

 

Version check and ipsec on-path                           [OK]

Openswan U2.6.51.5/K5.4.0-60-generic (netkey)

See `ipsec --copyright' for copyright information.

Checking for IPsec support in kernel                      [OK]

 NETKEY: Testing XFRM related proc values

         ICMP default/send_redirects                      [OK]

         ICMP default/accept_redirects                    [OK]

         XFRM larval drop                                 [OK]

Hardware random device check                              [N/A]

Checking rp_filter                                        [ENABLED]

 /proc/sys/net/ipv4/conf/all/rp_filter                    [ENABLED]

 /proc/sys/net/ipv4/conf/default/rp_filter                [ENABLED]

Checking that pluto is running                            [OK]

 Pluto listening for IKE on udp 500                       [OK]

 Pluto listening for IKE on tcp 500                       [NOT IMPLEMENTED]

 Pluto listening for IKE/NAT-T on udp 4500                [OK]

 Pluto listening for IKE/NAT-T on tcp 4500                [NOT IMPLEMENTED]

 Pluto listening for IKE on tcp 10000 (cisco)             [NOT IMPLEMENTED]

Checking NAT and MASQUERADEing                            [TEST INCOMPLETE]

Checking 'ip' command                                     [OK]

Checking 'iptables' command                               [OK]

 

ipsec verify: encountered errors

 

这是直接使用Linux内核协议栈的ipsec编译的结果,该方式搭建环境比较简单,且搭建IKE环境没有任何问题。

 

 

 

 

 

 

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叨陪鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值