刚开始学习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. java中 字符串的构造方法和直接创建

    java.long.String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现.(程序当中所有的双引号字符串,都是String类的对象[没 ...

  2. 小白学习vue第五天-第二弹(全局局部、父子、注册语法糖,script/template抽离模板)

    全局组件: 就是注册的位置在实例对象的外面 并且可以多个实例对象使用 而局部: 就是在实例对象的内部注册 父组件和子组件的关系 子组件就是在另一个组件里面注册的组件 组件注册语法糖: 就不用Vue.e ...

  3. Mol Cell | 张令强/贺福初/魏文毅/刘翠华揭示线性泛素化调控血管生成新机制

    景杰学术 | 报道 泛素化修饰作为主要的蛋白质翻译后修饰之一,与细胞周期.应激反应.信号传导和DNA损伤修复等几乎所有的生命活动密切相关[1].泛素分子通常含有7个赖氨酸残基,通过这些残基可以和其他泛 ...

  4. Bugku-login1(SKCTF)(SQL约束攻击)

    原因 sql语句中insert和select对长度和空格的处理方式差异造成漏洞. select对参数后面的空格的处理方式是删除,insert只是取规定的最大长度的字符串. 逻辑 1.用 select ...

  5. Android开发失业50天,面了10家公司,唯二的offer也主动拒了

    最近在论坛看到这样一个帖子: 坐标深圳. 4 月上旬公司解散.(现在想想好像是假解散,真裁员) 这一个半月以来,从朋友内推,到拉勾.Boss 直聘,再到猎聘.智联招聘. 从开始的精准投递,到后来的海投 ...

  6. 大学同学做Java开发比我多5K,八年老Android只会crud该转Java吗?

    最近在网上看到这样一个帖子: 做了八年Android开发,感觉这块做着也挺没意思,日常工作就是做一些架构优化,质量数据监控,改一改构建脚本,最主要的是业务负责人没有一个是做客户端的,都是后端的人. 最 ...

  7. Windows常用命令汇总以及基础知识

    命令部分: dir dir指定要列出的驱动器.目录和/或文件 ,/?显示所有命令 例:dir /b /s /o:n /a:a 表示显示当前路径下的所有文件的绝对路径,包含子文件夹的内容 /b表示去除摘 ...

  8. 008 PCI设备BAR空间的初始化

    一.PCI设备BAR空间的初始化 在PCI Agent设备进行数据传送之前,系统软件需要初始化PCI Agent设备的BAR0~5寄存器和PCI桥的Base.Limit寄存器.系统软件使用DFS算法对 ...

  9. NOIP 模拟 $27\; \rm 牛半仙的妹子Tree$

    题解 \(by\;zj\varphi\) 很妙的虚树题. 考虑若没有操作 \(2\),那么直接记录一下扩散到它的最短时间和询问时间相比即可,可以当作一个树上最短路. 有 \(2\) 操作怎么办,将操作 ...

  10. 题解 Merchant

    传送门 可以发现如果我们最终选择的物品集合已经确定,就很好求了 \(\sum k*t+\sum b \geqslant s\) ,二分即可 但现在我们无法确定该选哪些物品 因此我们只需要check一下 ...