刚开始学习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. Mybatis学习笔记-第一个Mybatis程序

    思路 搭建环境 搭建数据库(略) CREATE DDATABASE CREATE TABLE INSERT VALUES 新建项目 普通Maven项目 删除src文件夹 --> 建立父工程 导入 ...

  2. Mybatis学习笔记-配置解析

    核心配置文件 mybatis-config.xml properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFa ...

  3. nfs配置项在/etc/exports中的说明

    rw 可读写的权限 ro 只读的权限no_root_squash 登入NFS主机,使用该共享目录时相当于该目录的拥有者,如果是root的话,那么对于这个共享的目录来说,他就具有root的权       ...

  4. dubbo学习实践(2)之Dubbo入门Demo

    开篇之前,先来了解下dubbo服务治理与技术架构,直接看图 dubbo技术架构图: 1. 新建dubbo项目,目录结构如下 代码说明: 1.代码分为Provider(服务提供方)与consumer(服 ...

  5. 《Python Cookbook v3.0.0》Chapter1 数据结构和算法

    感谢: https://github.com/yidao620c/python3-cookbook 如有侵权,请联系我整改. 本文章节会严格按照原书(以便和原书对照,章节标题可能会略有修改),内容会有 ...

  6. Mantis安装过程笔记

    安装平台:Windows Server 2003 R2 Enterprise x64 Edition 软件: EasyPHP-5.3.6.1 mantisbt-1.2.6 安装过程: 首先安装Easy ...

  7. git只提交部分修改的文件(提交指定文件)

    在我们的项目中,经常会在本地编译一些代码,还未写完,测试那边来告诉你要改改某个文件的bug,非常着急,此时改完了,提交的时候,自己还在编译的代码并不想提交,此时,你可以利用git这些指令帮助你! 1/ ...

  8. DHCP服务-中继代理

    DHCP中继代理(即DHCP Relay Agent)用于转发来自于另一个没有DHCP服务器子网段中客户端的DHCP请求,即当一台DHCP客户端发起请求后,此时DHCP中继代理就会将已经预先定义好的D ...

  9. protocol buffer的高效编码方式

    目录 简介 定义一个简单的message Base 128 Varints 消息体的结构 符号整数 字符串 嵌套的消息 总结 简介 protocol buffer这种优秀的编码方式,究竟底层是怎么工作 ...

  10. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...