没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
1 / 41
Linux 的 xfrm 实现源码分析
刘成天
2018 年 5 月
1 引言
本文主要介绍 Linux 内核中 IPSec 模块 xfrm 的实现逻辑,分析重点源码,不介绍加
密认证算法的具体实现,内核版本基于 Linux-3.18。本文的读者理应具备一定的 Linux 内
核协议栈基础知识,比如 HOOK、路由、网络设备、hash 链表等相关技术。
2 实现原理
IPSec 主要通过两种协议来实现对 IP 数据包的安全封装,分别是 AH 和 ESP:AH 用
于数据完整性验证,ESP 主要用于数据机密性,也可以用于完成性验证,两种协议可以单
独使用,也可以混合使用,本文的源码分析基于 ESP 封装方式。
IPSec 在连接模式上有两种:一种是传输模式,一种是隧道模式,选择哪种模式要根
据 ipsec 的具体使用场景而定。在 IPSecVPN 的三种应用场景中:网关到网关(site-to-
site)、端到端(end-to-end)、端到网关(end-to-site),传输模式只能用于端到端,
本文的源码分析基于网关到网关的隧道模式封装。
2.1 封装协议 ESP
ESP 协议号为 50,头部格式如下:
2 / 41
8位 8位 16位
安全参数索引SPI
序列号
报文载荷
……
填充项(可选)
填充长度 下一个头
验证数据(可选)
SPI 值用于唯一标识 SA,它在 AH 和 ESP 头中传输,在手动配置 SA 时需要指定 SPI
的值;使用 IKE 协商产生 SA 时,SPI 随机生成。
序列号是单调递增的数值,用于防止重放攻击。
ESP 通过加密算法(DES/3DES/AES)对数据进行加密,使用散列函数(MD5/SHA-
1)对报文进行摘要计算,最后把摘要放入 ESP 校验的部分,隧道模式的封装格式如下图:
IP
数据
封装IP 数据
ESP IP
ESP填充 ESP校验
加密
摘要
2.2 核心模块
xfrm 的核心实现是安全策略 SP(Security Policy)和安全联盟 SA(Security
Association)。
SP 安全策略用来匹配那些数据要进行 ipsec 处理,如果匹配上安全策略则进行加密封
装处理,它通过配置的条件参数(如地址、端口、协议等)决定那些数据进行 ipsec 处理,
不满足条件的数据不进入 ipsec 安全处理。
3 / 41
SA 安全联盟包含了 ipsec 协议的加密算法、认证算法、密钥和存活期等,是两个通信
实体协商建立起来的一种对象,它有三个元素定义:安全协议 AH/ESP、安全参数索引
SPI 和目标 IP。SA 是单向的,发送数据需要一个 SA,接收数据也需要一个 SA,SA 可以
手动设置,也可以通过 IKE 协商出来。
SP 策略匹配成功后生成安全路由,即路由结构存放的 SA 处理函数,如果存在多层封
装,则所有的安全路由会形成一个链表,每一个完成一次安全封装。
xfrm 整体处理流程如下:
发送:普通IP报文
SP匹配?
安全路由存在?
SA发现?
生成安全路由
AH/ESP头处理
验证/加密
通知用户空间
IKE进行协商
发送报文
N
Y
N
接收:ESP加密报文
验证通过?
解密
丢弃
N
重新进入转发流程
2.3 整体架构
4 / 41
xfrm 中 SP 和 SA 的策略生成在用户空间完成,所以一个完整的 ipsec 系统架构需要
有效的应用程序进行管理,尤其是 IKE 协商处理,一些开源项目如 strongswan 较好的完
成了这些业务。
用户态和内核 xfrm 通信可以通过两种接口完成,一种是 PF_KEY(或 PF_KEY_V2)
类型的套接口,另一种是 NETLINK_XFRM 类型的 netlink 套接口,iproute2 套件中的 ip
工具中的 xfrm 命令就是通过这种 netlink 接口完成和内核的通信,对于用户空间和内核的
通信接口的具体实现,本文不进行分析。
内核 SPD/SAD 是用于维护策略和状态的链表集合,SP 检查和匹配、SA 的获取都需
要在该集合中根据条件搜索对应的策略和状态节点,获取对应的处理参数,然后进入
ESP/AH 模块进行对应的解封包和加解密的处理。
ipsec 的整体架构如下:
解密后普通报文
重新进入收包队列
密钥管理程序ip xfrm工具
PF_KEY协议
NETLINK_XFRM
SPD/SAD
网络接口
Route
SP检查/匹配SA获取
AH/ESP
发送处理
TCP/IP处理
AH/ESP
接收处理
udp封装
ESP加密报文普通转发报文
ESP
普通报文
User
Kernel
2.4 xfrm 初始化
xfrm 在内核通过 CONFIG_XFRM 宏开启,它在内核协议栈系统中作为路由功能的扩展,
在路由初始化函数 ip_rt_init()中调用 xfrm 的初始化函数 xfrm_init()和 xfrm4_init(),xfrm
5 / 41
架构的初始化及注册使用名字空间机制实现,操作集结构为 xfrm_net_ops,初始化函数调
用流程如下:
xfrm_init()
-> xfrm_net_init()
-> xfrm_statistics_init()/*mib 统计初始化,用于网络诊断*/
-> xfrm_state_init()/*状态初始化,参见 sa 处理章节*/
-> xfrm_policy_init()/*状态初始化,参见 sp 处理章节*/
-> xfrm_dst_ops_init()/* xfrm4_dst_ops 初始化*/
-> xfrm_sysctl_init()/* xfrm 的 sysctl 配置参数初始化*/
-> flow_cache_init()/* flow_cache 初始化*/
3 策略(SP)处理
SP 主要是用来匹配哪些数据需要进行 IPSec 的处理,当数据包匹配上安全策略后才会
进入 IPsec 的处理流程,否则作为普通报文返回原流程继续处理。
SP 处理主要包括三部分:初始化、策略管理和策略匹配处理,策略管理主要是分配、
增加、删除策略等操作,形成以 hash 存放的 SPD 策略集合;策略匹配主要是根据 IP 报文
进行策略校验、策略查询匹配,形成安全路由表项。在实现上有三个重要对象协助完成:
选择器(selector)、状态模板(tmpl)和安全路由集(bundles)。
selector
用来进行数据流参数匹配,主要是地址、端口、协议等信息;
tmpl
通过 SP 查询 SA 的结构对象,是 SP 和 SA 之间匹配的一个桥梁;
bundles
通过 SA 形成的安全路由集合,方便后续的加速处理。
3.1 协议注册结构
和策略相关的协议处理结构变量是 xfrm4_policy_afinfo(ipv6 的忽略),初始化时调
用 xfrm_policy_register_afinfo()完成注册,形成的结构关系如下图所示,当 policy 的处理
需要根据协议调用相关函数时,只要根据协议类型找到注册对应的全局结构变量指针
xfrm4_policy_afinfo,即可获取对应的封装函数和其它结构对象。
剩余40页未读,继续阅读
nj_sky
- 粉丝: 7
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0