#strongswan与xfrm之间的trap机制 [TOC]网络
你必须同时知道,strongswan,xfrm,strongswan connect trap三个概念。 才有继续读下去的意义。 入门请转到:【TODO...】数据结构
strongswan的vici配置文件中,child_conn配置项下,有一个配置start_action。里边有三个可选的值。 分别为start,none,trap。none为默认。 其中start表明在load好配置以后就up该条conn。 而后,有关none与trap将作为本文的两个重点讨论场景,经过一下篇幅进行考察。 欢迎收看,@_@~~socket
基于前文。咱们如今来解释一下none与trap的含义。ui
none,表明只加载配置,而不对链接进行任何操做。等于控制程序进行触发conn的up操做。spa
trap,翻译成中文是陷阱,捕获的意思。就是说一旦它捕获了一个包,就要触发conn的up。 而捕获这个操做,是经过policy进行的。咱们知道,在strongswan的配置信息一旦进行了加载以后, 它就会下发policy给xfrm,这个捕获动做正是经过这个预下发的policy来完成的。翻译
咱们分别用none与trap配置作了两个实验。code
[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。ip
很显然,该实验并无什么好实验的。咱们只观察一件事情,就是在load的config以后。xfrm里边的policy状况。 以下:ci
[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。
这里,须要额外补充一条背景知识。 经过阅读netlink plugin与xfrm接口部分的源码。并无任何与start_action相关的信息交互。 主要的数据结构中,也都没有start_action这样一个概念存在。
注:有关什么是netlink plugin,以及它在strongswan中的做用,之后补充。。。
经过第四小节中补充的知识,以及第三小节的实验。咱们能够推断出。start_action这个事情是strongswan 在控制层面上的概念。它经过使用预下发不一样的policy和xfrm的acquire机制,共同实现了这一律念。
acquire是xfrm经过API向上推送给应用程序的一种消息,它的类型是ACQUIRE。
当xfrm收到一个包的时候,这个包命中了某条policy。这条policy却没有对应的child sa的时候。 xfrm就会对全部注册进了xfrm netlink的应用程序广播这条消息。而后,你便看到了第三小节里的实验现象。 strongswan收到这个消息后,主动下发一个新的sa给xfrm。
完了。但愿你已经懂了。