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

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; // 按源地址HASH
 	struct hlist_node byspi; // 按SPI值HASH

	atomic_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; // 请求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_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/IPCOMP
	struct 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

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞大圣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值