strongwan sa分析(三)
xfrm與strongswan內核接口分析
1. strongswan的實現
如下圖,業務場景可以分為兩類:
- 下發類的交互主要由包觸發或用戶配置動作觸發。
- 消息類的交互主要由watcher監聽socket,然后觸發。
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()