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