
linux ipsec 源码分析.pdf
158页IPsec IPsec 源码分析源码分析 目录目录 1. 前言 4 2. 数据结构 4 2.1 状态(SA) . 4 2.2 安全策略(SP) 6 2.3 协议结构 8 2.4 模式结构 9 2.5 策略的相关协议处理结构 10 2.6 状态的相关协议处理结构 11 2.7 回调通知信息结构 12 3. 初始化 12 3.1 xfrm 状态初始化 . 13 3.2 策略初始化 13 3.3 输入初始化 15 4. 状态(xfrm_state)处理 15 4.1 状态分配 15 4.2 状态删除 19 4.3 删除全部状态 21 4.4 状态增加或更新 21 4.5 状态插入 24 4.6 状态查找 26 4.6.1 xfrm_state_lookup 26 4.6.2 按地址查找状态 . 27 4.6.3 __xfrm_state_locate . 28 4.6.4 查找 ACQUIRE 类型的状态 29 4.6.5 按序号查找 ACQUIRE 类型的状态 31 4.6.6 xfrm_state_find() 32 4.7 遍历状态 36 4.8 状态检查 38 4.9 状态 HASH 表扩展 . 39 4.10 垃圾搜集 42 4.11 回调处理 43 4.11.1 登记和拆除 . 43 4.11.2 xfrm 策略处理的回调通知 43 4.11.3 xfrm 状态处理的回调通知 44 4.11.4 xfrm 策略到期的回调通知 44 4.11.5 xfrm 状态获取的回调通知 44 4.11.6 xfrm 状态映射处理的回调通知 45 4.11.7 xfrm 策略到期的回调通知 45 4.11.8 xfrm 报告的回调通知 46 4.12 小结 46 5. 安全策略(xfrm_policy)处理 . 48 5.1 策略分配 48 1 5.2 策略插入 50 5.3 删除某类型的全部安全策略 . 53 5.4 策略查找 55 5.4.1 策略查找并删除 . 55 5.4.2 按索引号查找并删除 . 56 5.4.3 根据路由查找策略 . 57 5.4.4 查找和 sock 对应的策略 60 5.5 遍历安全策略 61 5.6 策略检查 63 5.7 安全策略路由查找 67 5.8 变更 HASH 表大小 . 75 5.9 垃圾搜集 77 5.10 杂项 79 5.10.1 协议处理类型处理 . 79 5.10.2 协议模式处理 . 81 5.10.3 协议信息处理 . 83 5.10.4 网卡回调 . 85 5.11 小结 87 6. XFRM 的其他操作 . 90 6.1 HASH 处理 . 90 6.2 算法操作 94 6.2.1 认证算法 . 95 6.2.2 加密算法 . 96 6.2.3 压缩算法 . 97 6.2.4 通过名称查找算法 . 98 6.2.5 xfrm 算法探测 100 6.3 通过 netlink 套接口访问 xfrm 101 6.4 xfrm_input . 101 7. IPV4 下的 xfrm 支持处理 . 103 7.1 IPV4 下的 xfrm 策略 . 103 7.1.1 小结 . 110 7.2 IPV4 安全路由操作 . 110 7.3 IPV4 下的 xfrm 状态 . 112 7.3.1 小结 114 7.4 模式 114 7.4.1 通道 . 114 7.4.2 传输 . 116 7.4.3 BEET 117 7.4.4 小结 . 117 7.5 数据接收 118 7.6 数据发送 121 7.7 NAT-T 支持 125 7.7.1 接收数据 . 125 7.7.2 ESP 包的 UDP 封装 129 8. 安全协议 129 8.1 AH 129 8.1.1 初始化 . 129 8.1.2 IPV4 下的 AH 协议处理结构 . 130 2 8.1.3 AH4 协议的 IPSEC 处理结构 . 131 8.2 ESP . 137 8.2.1 初始化 . 137 8.2.2 IPV4 下的 ESP 协议处理结构 138 8.2.3 ESP4 协议的 IPSEC 处理结构 138 9. IPSEC 封装流程 . 150 9.1 转发包的封装 150 9.2 自身数据发出 153 9.3 dst_output . 156 10. 总结 157 3 1. 前言前言 在 Linux2.6 内核中自带了 IPSEC 的实现,这样就不用象 2.4 那样打补丁来实现了。
该实现包括以下 几个部分: PF_KEY 类型套接口, 用来提供和用户层空间进行 PF_KEY 通信,代码在 net/key 目录下,前 面已经介绍过;安全联盟 SA 和安全策略 SP 管理,是使用 xfrm 库来实现的,代码在 net/xfrm/目录下 定义;ESP,AH 等协议实现,在 net/ipv4(6)下定义;加密认证算法库,在 crypto 目录下定义,这些算 法都是标准代码了本系列文章主要描述 XFRM 库的实现以及在 IPV4 下相关协议的处理部分, IPV6 的 忽略 本文 Linux 内核代码版本为 2.6.19.2xfrm 是内核中变化比较大的部分,每个版本中都有不小的差 异, 同时也说明了该模块的不成熟性 在 net/xfrm 目录下的各文件大致功能说明如下: xfrm_state.c: xfrm 状态管理 xfrm_policy.c: xfrm 策略管理 xfrm_algo.c: 算法管理 xfrm_hash.c: HASH 计算函数 xfrm_input.c: 安全路径(sec_path)处理,用于进入的 ipsec 包 xfrm_user.c: netlink 接口的 SA 和 SP 管理 在 net/ipv4 目录下的和 ipsec 相关各文件大致功能说明如下: ah4.c: IPV4 的 AH 协议处理 esp4.c: IPV4 的 ESP 协议处理 ipcomp.c: IP 压缩协议处理 xfrm4_input.c: 接收的 IPV4 的 IPSEC 包处理 xfrm4_output.c: 发出的 IPV4 的 IPSEC 包处理 xfrm4_state.c: IPV4 的 SA 处理 xfrm4_policy.c: IPV4 的策略处理 xfrm4_tunnel.c: IPV4 的通道处理 xfrm4_mode_transport.c: 传输模式 xfrm4_mode_tunnel.c: 通道模式 xfrm4_mode_beet.c: BEET 模式 2. 数据结构数据结构 内核 SA 的定义用 xfrm_state 结构定义,SP(Security Policy)用 xfrm_policy 结构定义,在 include/net/xfrm.h 中定义。
2.1 状态状态(SA) xfrm_state 状态结构用来描述 SA 在内核中的具体实现: struct xfrm_state { /* Note: bydst is re-used during gc */ // 每个状态结构挂接到三个 HASH 链表中 struct hlist_node bydst; // 按目的地址 HASH struct hlist_node bysrc; // 按源地址 HASH struct hlist_node byspi; // 按 SPI 值 HASH atomic_t refcnt; // 所有使用计数 4 spinlock_t lock; // 状态锁 struct xfrm_id id; // ID 结构, 即目的地址,SPI,协议三元组 struct xfrm_selector sel; // 状态选择子 u32 genid; // 状态的标志值, 防止发生碰撞 /* Key manger bits */ struct { u8 state; u8 dying; u32 seq; } km; // KEY 回调管理处理结构参数 /* Parameters of this state. */ struct { u32 reqid; // 请求 ID u8 mode; // 模式: 传输/通道 u8 replay_window; // 回放窗口 u8 aalgo, ealgo, calgo; // 认证,加密,压缩算法 ID 值 u8 flags; // 一些标准 u16 family; // 协议族 xfrm_address_t saddr; // 源地址 int header_len; // 添加的协议头长度 int trailer_len; } props; // SA 相关参数结构 struct xfrm_lifetime_cfg lft; // 生存时间配置 /* Data for transformer */ struct xfrm_algo *aalg; // hash 算法 struct xfrm_algo *ealg; // 加密算法 struct xfrm_algo *calg; // 压缩算法 /* Data for encapsulator */ struct xfrm_encap_tmpl *encap; // NAT-T 封装信息 /* Data for care-of address */ xfrm_address_t *coaddr; /* IPComp needs an IPIP tunnel for handling uncompressed packets */ struct xfrm_state *tunnel; // 通道, 实际是另一个 SA /* If a tunnel, number of users + 1 */ atomic_t tunnel_users; // 通道的使用数 /* State for replay detection */ struct xfrm_replay_state replay; // 回放检测结构,包含各种序列号掩码等信息 5 /* Replay detection state at the time we sent the last notification */ struct xfrm_replay_state preplay; // 上次的回放记录值 /* internal flag that only holds state for delayed aevent at the * moment */ u32 xflags; // 标志 /* Replay detection notification settings */ u32 replay_maxage; // 回放最大时间间隔 u32 replay_maxdiff; // 回放最大差值 /* Replay detection notification timer */ struct timer_list rtimer; // 回放检测定时器 /* Statistics */ struct xfrm_stats stats; // 统计值 struct xfrm_lifetime_cur curlft; // 当前时间计数器 struct timer_list timer; // SA 定时器 /* Last used time */ u64 lastused; // 上次使用时间 /* Reference to data common to all the instances of this * transformer. */ struct xfrm_type *type; // 协议, ESP/AH/IPCOMP struct xfrm_mode *mode; // 模式, 通道或传输 /* Security context */ struct xfrm_sec_ctx *security; // 安全上下文,。
