当前位置: 首页> 汽车> 时评 > Linux 内核源码分析---IPsec 互联网安全协议

Linux 内核源码分析---IPsec 互联网安全协议

时间:2025/8/23 8:49:27来源:https://blog.csdn.net/FDS99999/article/details/141340616 浏览次数: 0次

IPsec基础知识

IPsec(Internet Protocol Security,缩写为IPsec,即互联网安全协议),是一个协议包,通过对 IP 协议的分组进行加密和认证来保护 IP 协议的网络传输协议族(一些相互关联的协议的集合)。

IPSec 可为通信两端设备提供安全通道,比如用于两个路由器之间以创建点到点 VPN,以及在防火墙和 Windows 主机之间用于远程访问 VPN等。

IPSec 可以实现以下四项功能:
数据机密性:IPSec 发送方将包加密后再通过网络发送,可以保证在传输过程中,即使数据包遭截取,信息也无法被读取。
数据完整性:IPSec 可以验证 IPSec 发送方发送过来的数据包,以确保数据传输时没有被改变。若数据包遭篡改导致检查不相符,将会被丢弃。
数据认证(不可否认性):IPSec 接受方能够鉴别 IPSec 包的发送起源,此服务依赖数据的完整性。
防重放(反重播性):确保每个 IP 包的唯一性,保证信息万一被截取复制后不能再被重新利用,不能重新传输回目的地址。该特性可以防止攻击者截取破译信息后,再用相同的信息包获取非法访问权。

IPsec 主要由以下协议组成
一、认证头(AH),主要提供数据源验证、数据完整性验证和防报文重放功能,不提供加密功能
二、封装安全载荷(ESP),主要提供加密、数据源验证、数据完整性验证和防报文重放功能;
三、安全关联(SA),提供算法和数据包,提供 AH、ESP 操作所需的参数。
四、密钥协议(IKE),提供对称密码的钥匙的生存和交换。

在这里插入图片描述

XFRM 框架及策略

1、XFRM框架

IPsec 是由 XFRM 框架实现的,此框架源自 USAGI 项目,该项目旨在提供适用于生产环境的 IPv6 和 IPsec 协议栈。在内核栈中根据 IPsec 规则对入站或出站数据包进行变换。XFRM 框架基础设施独立于协议簇
自内核2.5之后引入了XFRM框架,这个“基础设施”独立于协议簇,包含可同时应用于IPv4和IPv6的通用部分,位于源代码的net/xfrm/目录下。

XFRM 框架支持网络命名空间,是一种轻型的进程虚拟化,它令一个或一组进程有了自己的网络栈。每个网络命名空间(结构 net 的实例)都包含一个名为 xfrm 的成员----一个
netns_xfrm 结构实例。这个对象包含很多数据结构和变量。如 XFRM 策略散列表、XFRM 状态散列表、计数器等。

2、XFRM策略
安全策略是告诉 IPsec 是否要对特定流进行处理的规则,它由结构 xfrm_policy 表示,策略包含一个选择器(xfrm_selector对象),用于指定要将策略应用到哪些流。XFRM 选择器包含源地址和目标地址、协议等段。

在这里插入图片描述

3、XFRM状态(安全关联)
结构xfrm_state表示 IPsec 安全关联,表示的是单向流量,包含加密密钥、标志、请求ID、统计信息等等。可从用户空间套接字发送请求(XFRM_MSG_NEWSA)。在内核中由 xfrm_state_add() 处理。同样要删除状态,可发送XFRM_MSG_DELSA消息,此消息在内核中
由方法xfrm_del_sa()处理。

/* Full description of state of transformer. */
struct xfrm_state {possible_net_t		xs_net;union {struct hlist_node	gclist;struct hlist_node	bydst;	// 按目的地址HASH};struct hlist_node bysrc; // 按源地址HASHstruct hlist_node byspi; // 按SPI值HASHatomic_t		refcnt;	// 所有使用计数spinlock_t		lock;	// 状态锁struct xfrm_id		id;struct xfrm_selector	sel;struct xfrm_mark	mark;u32			tfcpad;u32			genid;/* Key manager bits */struct xfrm_state_walk	km;/* Parameters of this state. */struct {\u32  reqid; // 请求IDu8  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_auth	*aalg;	// hash算法struct xfrm_algo	*ealg;	// 加密算法struct xfrm_algo	*calg;	// 压缩算法struct xfrm_algo_aead	*aead;const char		*geniv;/* 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;	// 回放检测结构,包含各种序列号掩码等信息struct xfrm_replay_state_esn *replay_esn;/* Replay detection state at the time we sent the last notification */struct xfrm_replay_state preplay;	// 上次的回放记录值struct xfrm_replay_state_esn *preplay_esn;/* The functions for replay detection. */const struct xfrm_replay *repl;/* 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 tasklet_hrtimer	mtimer;struct xfrm_state_offload xso;/* used to fix curlft->add_time when changing date */long		saved_tmo;/* Last used time */unsigned long		lastused;struct page_frag xfrag;/* Reference to data common to all the instances of this* transformer. */const struct xfrm_type	*type;	// 协议, ESP/AH/IPCOMPstruct xfrm_mode	*inner_mode;struct xfrm_mode	*inner_mode_iaf;struct xfrm_mode	*outer_mode;const struct xfrm_type_offload	*type_offload;/* Security context */struct xfrm_sec_ctx	*security;	// 安全上下文, 加密时使用/* Private data of this transformer, format is opaque,* interpreted by xfrm_type methods. */void			*data;
};

传输模式 / 隧道模式 / IPSec 高可靠性

IPSec 是如何工作的?
通信间的方式,IPSec采用的是 SA(安全关联 security association),但请注意,它是单向的,就是说,要实现双方通信,得建立两条 SA,并且双方得互相维护它的状态,所以说 IPsec 是面向连接的,而 IP 是无连接的。

IPSec 的工作方式涉及五个关键步骤:
在这里插入图片描述

传输(transport)模式:只是传输层数据被用来计算 AH 或 ESP 头,AH 或 ESP 头以及 ESP 加密的用户数据被放置在原 IP 包头后面。通常,传输模式应用在两台主机之间的通讯,或一台主机和一个安全网关之间的通讯。

隧道(tunnel)模式:用户的整个 IP 数据包被用来计算 AH 或 ESP 头,AH 或 ESP 头以及 ESP 加密的用户数据被封装在一个新的 IP 数据包中。通常,隧道模式应用在两个安全网关之间的通讯。

传输模式和隧道模式比较:

  • 安全性来讲,隧道模式优于传输模式。它可以完全对原始IP数据包进行验证和加密。隧道模式下可以隐藏内部IP地址,协议类型和端口。
  • 从性能上来讲,隧道模式有一个额外的IP头,所有它将比传输模式占用更多的带宽。
  • 从场景来讲,传输模式主要应用于两台主机或一台主机和一台VPN网关之间通信;隧道模式主要应用于两台VPN网关之间或一台主机与一台VPN网关之间的通信。

3、IPSec 高可靠性设计可以分为两类,一种是链路冗余,另一种是主备网络备份。其中链路冗余可以分为主备链路备份和隧道化链路备份。

https://www.cnblogs.com/longlyseul/p/16966471.html
http://t.csdnimg.cn/BSO9B
https://juejin.cn/post/7009869273103335455

关键字:Linux 内核源码分析---IPsec 互联网安全协议

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: