刚开始学习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环境没有任何问题。

openswan框架和编译时说明的更多相关文章

  1. java 编译时注解框架 lombok-ex

    lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...

  2. Android 编译时注解解析框架

    2.注解 说道注解,竟然还有各种分类,得,这记不住,我们从注解的作用来反推其分类,帮助大家记忆,然后举例强化大家的记忆,话说注解的作用: 1.标记一些信息,这么说可能太抽象,那么我说,你见过@Over ...

  3. Android 打造编译时注解解析框架 这只是一个开始

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43452969 ,本文出自:[张鸿洋的博客] 1.概述 记得很久以前,写过几篇博客 ...

  4. 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题

    理想的代码优化方式 团队日常协作中,自然而然的会出现很多重复代码,根据这些代码的种类,之前可能会以以下方式处理 方式 描述 应用时可能产生的问题 硬编码 多数新手,或逐渐腐坏的项目会这么干,会直接复制 ...

  5. Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架

    Metalama是一个基于微软编译器Roslyn的元编程的库,可以解决我在开发中遇到的重复代码的问题.但是其实Metalama不止可以提供编译时的代码转换,更可以提供自定义代码分析.与IDE结合的自定 ...

  6. apt 根据注解,编译时生成代码

    apt: @Retention后面的值,设置的为CLASS,说明就是编译时动态处理的.一般这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~ ...

  7. cocos2d-html5的jsb模式下如何在编译时自动将js编译为jsc

    cocos2d-html5是一个用JS来开发游戏的框架,通过javascript Binding的方式可以将游戏编译到手机上.这对前端开发人员来说非常方便,开发效率也比使用c++开发要快的多. jsb ...

  8. .net postsharp编译时生成的代码?

    使用PostSharp进行AOP框架设计:一个简单的原型   AOP已经不是一个什么新名词了,在博客园使用关键字搜索可以查出n多条关于AOP的介绍,这里就不再赘述了. 在Bruce Zhang's B ...

  9. Android APT(编译时代码生成)最佳实践

    越来越多第三方库使用apt技术,如DBflow.Dagger2.ButterKnife.ActivityRouter.AptPreferences.在编译时根据Annotation生成了相关的代码,非 ...

随机推荐

  1. Linux下的Vim文本编辑器(入门)

    引言 vim filename:打开名为filename的文件,如果不存在就会创建一个filename文件 Vim的三种使用模式 1. 命令模式 启动Vim时,就进入了命令模式 在该模式下: i:切换 ...

  2. SQL语句(三)分组函数和分组查询

    目录 一.分组函数 特点 1. 各函数的简单使用 2. 搭配distinct的使用 3. COUNT 统计行数 4. 和分组函数一同查询的字段要求是group by后的字段 二.分组查询 1. 简单应 ...

  3. vue 源码详解(二): 组件生命周期初始化、事件系统初始化

    vue 源码详解(二): 组件生命周期初始化.事件系统初始化 上一篇文章 生成 Vue 实例前的准备工作 讲解了实例化前的准备工作, 接下来我们继续看, 我们调用 new Vue() 的时候, 其内部 ...

  4. 我所学的c语言

    c语言结构 #include <stdio.h> int main(){    /* 我的第一个 C 程序 */    printf("Hello, World! \n" ...

  5. (纯js)如何不刷新网页就能链接新的js文件

    如何不刷新网页就能链接新的js文件,其实在HTML语言中已经有相关的函数了,就是再添加一个<script src=.....></script>. 函数叫document.bo ...

  6. MongoDB-02-复制集

    复制集(ReplicationSet) 基本原理 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种)) 如果发生主库宕机,复制集内 ...

  7. CSS Transform完全指南 #flight.Archives007

    Title/ CSS Transform完全指南 #flight.Archives007 序: 第7天了! 终身学习, 坚持创作, 为生活埋下微小的信仰. 我是忘我思考,共同进步! 简介: 一篇最简约 ...

  8. Java之Cookie与Session

    Cookie.Session Cookie:服务端生成Cookie发给客户端用于认证 Session:服务端进行进行登记,每人有不同的Session session与cookie的区别 Cookie: ...

  9. VLAN-5 利用三层交换机实现vlan间的路由

    一.实验拓扑图 二.实验编址 三.实验步骤 1.给对应的PC设置对应的IP和掩码还有接口,以及根据需要划分不同的vlan区域,再用文本标记出不同部门. 2.启动设备(全选) 3.首先用ping命令检查 ...

  10. Linux搭建Ldap服务器

    一,服务器安装 yum install -y openldap openldap-clients openldap-servers migrationtools 二,配置ldap服务器 2.1配置ld ...