[ipsec][strongswan] strongswan源码分析-- (三) xfrm与strongswan内核接口分析

廉价感情. 提交于 2019-11-29 03:18:58

strongwan sa分析(三)

Author:caotong
Date:2019-01-02
Version:1.0


xfrm与strongswan内核接口分析

1. strongswan的实现

如下图,业务场景可以分为两类:

  1. 下发类的交互主要由包触发或用户配置动作触发。
  2. 消息类的交互主要由watcher监听socket,然后触发。

netlink_plugin.png

2. 交互机制

2.1 下发消息

消息名 功能定义
XFRM_MSG_ALLOCSPI 获取SPI
XFRM_MSG_NEWSA 新建SA
XFRM_MSG_UPDSA 更新SA
XFRM_MSG_GETSA 获取SA
XFRM_MSG_DELSA 删除SA
XFRM_MSG_FLUSHSA 清空SA
XFRM_MSG_GETSPDINFO 获取SPD信息
XFRM_MSG_NEWPOLICY 新建安全策略
XFRM_MSG_UPDPOLICY 更新安全策略
XFRM_MSG_GETPOLICY 获取安全策略
XFRM_MSG_DELPOLICY 删除安全策略
XFRM_MSG_FLUSHPOLICY 清空安全策略

2.2 接收消息

消息名 功能定义
XFRM_MSG_ACQUIRE ???
XFRM_MSG_EXPIRE CHILD_SA超时
XFRM_MSG_MIGRATE CHILD_SA热迁移
XFRM_MSG_MAPPING NAT端口关系改变

POLICY也有与CHILD_SA同样的超时机制,strongswa那种没有处理这个消息。
消息类型为:XFRM_MSG_POLEXPIRE。同样分HARD和SOFT。

4. xfrm的消息通信的实现

着重分析两个消息过程:EXPIRE,ACQUIRE。

4.1 EXPIRE

源码文件:

linux.git/net/xfrm/xfrm_user.c

消息处理的关键函数

static struct xfrm_mgr netlink_mgr = {
    .id     = "netlink",
    .notify     = xfrm_send_state_notify,
    .acquire    = xfrm_send_acquire,
    .compile_policy = xfrm_compile_policy,
    .notify_policy  = xfrm_send_policy_notify,
    .report     = xfrm_send_report,
    .migrate    = xfrm_send_migrate,
    .new_mapping    = xfrm_send_mapping,
};

policy的超时由timer触发:

xfrm_policy.c::xfrm_policy_timer()

SA的超时

1. timer触发

分为hard和soft两个触发逻辑

xfrm_state.c::xfrm_timer_handler()
2. 包与字节数触发

同样分为hard和soft两个触发逻辑。
实现逻辑的代码:

xfrm_state.c::xfrm_state_check_expire()

在数据包的input和output两个地方进行检查:

xfrm_input.c::xfrm_input()
xfrm_output.c::xfrm_output_one()

4.2 ACQUIRE

目前还没搞懂,到底是干嘛的。

xfrm_state.c::xfrm_state_find()
xfrm_state.c::km_query()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!