【IPSec】strongSwan:从 swanctl 到内核 SA
内容提要
本文介绍strongSwan通过swanctl配置IKEv2隧道并安装到Linux xfrm的流程。核心是connection定义IKE SA参数,children定义Child SA及流量选择器,经charon守护进程与内核netlink交互,最终生成xfrm policy/state。排障需同时查看swanctl和ip xfrm状态,常用命令包括load-all、list-sas、initiate等,并对比Libreswan差异。
延伸解读
用户态与内核态视图需同步排查
strongSwan 的 charon 守护进程通过 kernel-netlink 插件将 IKE 协商结果写入内核 xfrm,但用户态状态与内核实际安装的 SA 可能不一致。例如,swanctl --list-sas 显示 ESTABLISHED,而 ip xfrm state 中却无对应条目,或内核残留旧 SPI。排障时必须同时查看 swanctl 和 ip xfrm 的输出,仅依赖一侧容易遗漏问题,如插件错误或网络命名空间(netns)配置错误。
配置模型:connection 与 children 的分层
swanctl 配置将隧道拆分为 connection(定义 IKE SA 参数)和 children(定义 Child SA 及流量选择器)。这种分层与 IKEv2 协议对应:proposals 对应 IKE_SA_INIT 的 SA 载荷,esp_proposals 对应 Child SA 提议,local_ts/remote_ts 映射到 TSi/TSr 并最终生成 xfrm policy 选择器。理解这种映射有助于将配置问题定位到协议或内核层面。
常见故障点:证书 ID 与 TS 收窄
文章指出,证书部署时故障常源于本地 ID 与证书 SAN 不一致,而非 ESP 算法问题。此外,TS 收窄失败(如本地或远端流量选择器不匹配)也是常见原因。排障时应优先检查 charon 日志中的错误码(如 NO_PROPOSAL_CHOSEN、AUTHENTICATION_FAILED),而不是盲目调整加密算法。
Q&A
strongSwan中swanctl和charon分别扮演什么角色?
swanctl是strongSwan的配置与控制CLI,通过VICI协议与charon守护进程通信;charon是IKE守护进程,负责状态机、认证、密钥派生,并通过kernel-netlink插件将SA安装到内核xfrm。
strongSwan中connection和children分别对应什么?
connection定义IKE SA参数,如版本、地址、认证、IKE proposals和rekey时间;children定义Child SA,包括local_ts/remote_ts、ESP proposals、start_action和DPD动作。
strongSwan如何将SA安装到内核?
通过swanctl --load-all加载配置,触发IKE_SA_INIT和IKE_AUTH后,charon派生密钥,然后kernel-netlink插件通过XFRM netlink添加policy和state。
排障时为什么需要同时查看swanctl和ip xfrm状态?
因为只信一侧会漏掉用户态ESTABLISHED但内核无state,或内核有残留SA但用户态已teardown的情况,必须同时查看才能全面判断。
strongSwan中start_action = trap的作用是什么?
start_action = trap表示策略trap,即当感兴趣流触发时,才发起IKE协商获取SA,而不是立即建立隧道。
strongSwan与Libreswan的主要区别是什么?
两者都实现IKEv2并向Linux xfrm安装SA,但配置语言和守护进程名不同(Libreswan使用pluto和ipsec.conf),迁移时需翻译连接、子SA、提议和TS,不能假设文件兼容。
如何查看strongSwan的SA和策略状态?
使用swanctl --list-sas查看SA状态,swanctl --list-pols查看策略,同时用ip xfrm state和ip xfrm policy查看内核状态。