[strongswan] strongswan是如何实现与xfrm之间的trap机制的
strongswan与xfrm之间的trap机制
0.
你必须同时知道,strongswan,xfrm,strongswan connect trap三个概念。
才有继续读下去的意义。
入门请转到:【TODO...】
1. 前言
strongswan的vici配置文件中,child_conn配置项下,有一个配置start_action。里边有三个可选的值。
分别为start,none,trap。none为默认。
其中start代表在load好配置之后就up该条conn。
然后,有关none与trap将做为本文的两个重点讨论场景,通过一下篇幅进行考察。
欢迎收看,@_@~~
2. 描述
基于前文。我们现在来解释一下none与trap的含义。
2.1 none
none,代表只加载配置,而不对连接进行任何操作。等于控制程序进行触发conn的up操作。
2.2 trap
trap,翻译成中文是陷阱,捕获的意思。就是说一旦它捕获了一个包,就要触发conn的up。
而捕获这个操作,是通过policy进行的。我们知道,在strongswan的配置信息一旦进行了加载之后,
它就会下发policy给xfrm,这个捕获动作正是通过这个预下发的policy来完成的。
3. 实验与过程
我们分别用none与trap配置做了两个实验。
3.1 trap实验
- 首先通过swanctl --load-all命令,将设置为trap的配置信息下发给strongswan。
- 这个时候,storngswan已经预先加载了policy给xfrm,为trap做准备。
通过命令,我们在内核里可以查看到,类似如下的信息。
[root@T9 sbin]# ip xfrm po
src 10.9.0.0/16 dst 10.129.0.0/16
dir out priority 383615 ptype main
tmpl src 192.168.7.9 dst 192.168.7.129
proto esp spi 0xcbbb1290 reqid 1 mode tunnel
src 10.129.0.0/16 dst 10.9.0.0/16
dir fwd priority 383615 ptype main
tmpl src 192.168.7.129 dst 192.168.7.9
proto esp reqid 1 mode tunnel
src 10.129.0.0/16 dst 10.9.0.0/16
dir in priority 383615 ptype main
tmpl src 192.168.7.129 dst 192.168.7.9
proto esp reqid 1 mode tunnel
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
这个时候,作者在trap strongswan网关后面的子网里发了一个ping包给对方网络。
可以观察到网络通了,是可以ping通的。然后通过ip xfrm命令也能查看到sa已经在kernel
里边建立里起来。用GBD启动charon进行,并重复上边的实验。
我们能观察到,在发送第一个ping包之后,有如下现象:
a。 xfrm发送了一条ACQUIRE event给strongswan。
b。strongswan发送了一个NEWSA消息给xfrm。
之后便建立了新的child sa。
3.2 none实验
很显然,该实验并没有什么好实验的。我们只观察一件事情,就是在load的config之后。xfrm里边的policy情况。
如下:
[root@T9 sbin]# ip xfrm po
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0 ptype main
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
src ::/0 dst ::/0
socket in priority 0 ptype main
src ::/0 dst ::/0
socket out priority 0 ptype main
[root@T9 sbin]#
我们可以看到只有默认policy,而没有任何connection相关的policy。
4 背景知识
这里,需要额外补充一条背景知识。
通过阅读netlink plugin与xfrm接口部分的源码。并没有任何与start_action相关的信息交互。
主要的数据结构中,也都没有start_action这样一个概念存在。
注:有关什么是netlink plugin,以及它在strongswan中的作用,以后补充。。。
5. 机制分析
通过第四小节中补充的知识,以及第三小节的实验。我们可以推断出。start_action这个事情是strongswan
在控制层面上的概念。它通过使用预下发不同的policy和xfrm的acquire机制,共同实现了这一概念。
5.1 什么是acquire
acquire是xfrm通过API向上推送给应用程序的一种消息,它的类型是ACQUIRE。
5.2 那么,什么时候发送acquire消息呢
当xfrm收到一个包的时候,这个包命中了某条policy。这条policy却没有对应的child sa的时候。
xfrm就会对所有注册进了xfrm netlink的应用程序广播这条消息。然后,你便看到了第三小节里的实验现象。
strongswan收到这个消息后,主动下发一个新的sa给xfrm。
6.
完了。希望你已经懂了。
[strongswan] strongswan是如何实现与xfrm之间的trap机制的的更多相关文章
- 用ssh建立机器之间的信任机制
继续整理以前的博客,第二弹:用ssh建立机器之间的信任机制 #!/bin/bash #需要远程添加信任机制的机器 REMOTE[]=db-XXX-XXX1.db01 REMOTE[]=db-XXX-X ...
- [ipsec][strongswan] strongswan源码分析-- (三) xfrm与strongswan内核接口分析
目录 strongwan sa分析(三) xfrm与strongswan内核接口分析 1. strongswan的实现 2. 交互机制 4. xfrm的消息通信的实现 strongwan sa分析(三 ...
- [ipsec][strongswan] strongswan源码分析--(一)SA整体分析
strongswan SA分析(一) 1 概念 下面主要介绍两个本文将要阐述的核心概念.他们是SA和SP.注意,这不是一篇不需要背景知识的文章.作者认为你适合阅读接下来内容的的前提是,你已经具备了一下 ...
- [ipsec][strongswan] strongswan源码分析--(〇)总体架构图
history: 2019-06-05, 增加配置文件解析部分. 2019-06-05,增加plugin优先级排序部分. charon进程初始化阶段的流程图 约定: 实线代表流程图. 虚线代表调用栈, ...
- [ipsec][strongswan]strongswan源码分析--(零)引子
目录 strongswan sa 资料 编译 启动 进程信息 结构 架构图与插件 配置运行 传统配置方法 新的配置方法 其他配置方法 详细的配置文档 配置示例 用法 加密库 libgmp libcry ...
- [ipsec][strongswan] strongswan源码分析--(四)plugin加载优先级原理
前言 如前所述, 我们知道,strongswan以插件功能来提供各种各样的功能.插件之间彼此相互提供功能,同时也有可能提供重复的功能. 这个时候,便需要一个优先级关系,来保证先后加载顺序. 方法 在配 ...
- [ipsec][strongswan] strongswan源码分析-- (二)rekey/reauth机制分析
目录 strongwan sa分析(二) 名词约定 rekey/reauth 机制分析 1 概述 2 reauth 3 CHILD SA rekey 4 IKE SA rekey 5 其他 stron ...
- [ipsec][strongswan] strongswan源码分析--(五)plugin的配置文件的添加方法与管理架构解析
前言 我们知道,strongswan是基于插件式管理的.不同的插件有不同的配置文件,在这下面, 我们以netlink的插件为例:etc/strongswan.d/charon/kernel-netli ...
- [strongswan] strongswan METHOD宏
使用METHOD宏的函数定义: METHOD(message_t, get_message_id, uint32_t, private_message_t *this) { return this-& ...
随机推荐
- POJ 1410 Intersection (线段和矩形相交)
题目: Description You are to write a program that has to decide whether a given line segment intersect ...
- Go学习之路
注:图片来自 https://github.com/gocn/knowledge, 更新在此,共勉前行者.
- 原生js实现无缝轮播
原生js实现无缝轮播 因为要做到无缝,所以就要把第一张图片和最后一张连接起来,在此处采用js克隆了第一张图片的节点,添加到最后,显示图片序号的小圆按钮也是使用js动态添加的. html部分 <d ...
- pl/sql学习(6): 引号/程序调试/列中的字符串合并/正则表达式
有关自治事务的问题: https://www.cnblogs.com/princessd8251/p/4132649.html 我在plsql development学习中遇到的常见问题: (一) 引 ...
- 源码安装zabbix遇到的报错集锦
报错1:checking for mysql_config... configure: error: MySQL library not found 解决办法:查找mysql_config #find ...
- tp框架设置404页面
无法加载模板跳向404页面 /thinkphp/library/think/Dispatcher.class.php中176行 // 加载模块的扩展配置文件 load_ ...
- ThinkPHP5配置redis缓存
thinkphp采用cache类提供缓存功能支持,采用驱动方式,在使用缓存之前需要进行初始化操作.支持的缓存类型包括file.memcache.wincache.sqlite.redis和xcache ...
- 遍历文件路径python版,java版
python: # 获取所有txt路径列表 file_list = [] def gci(filepath): files=os.listdir(filepath) for fi in files: ...
- python基础篇_004_装饰器函数
python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...
- chattr和lsattr的基本用法
lsattr filename 查看一个文件的属性 chattr filename 改变一个文件的属性 主要用途:实现文件的原有内容不允许改变,但可以增加新行,则需通过改变文件的属性来实现. ch ...