概述:什么是XFRM框架
XFRM的正确读音是transform(转换), 这表示内核协议栈收到的IPsec报文需要经过转换才能还原为原始报文;
同样地,要发送的原始报文也需要转换为IPsec报文才能发送出去。
IPsec(Internet协议安全)应该很多人都听过,IPsec是一组协议,他们通过对通信会话中的每个数据包进行身份验证和加密,以确保IP流量的安全。
XFRM框架是IPsec的“基础设施”,IPsec通过XFRM框架实现的。XFRM源自USAGI项目,该项目旨在提供适用于生产环境的IPv6和IPsec协议栈。自内核2.5之后引入了XFRM框架,这个“基础设施”独立于协议簇,包含可同时应用于IPv4和IPv6的通用部分,位于源代码的net/xfrm/目录下。
XFRM框架支持网络命名空间。这是一种轻型的进程虚拟化,它可以使得一个或者一组进程有属于自己的网络栈。每个网络命名空间都含有一个名为xfrm的成员——一个netns_xfrm结构实例。这个对象包含着许多的数据结构和变量,例如:XFRM策略散列表、XFRM状态散列表、sysctl参数、XFRM状态垃圾收集器、计数器等。
netns_xfrm结构体定义,文件路径include/net/netns/xfrm.h
struct netns_xfrm {
struct hlist_head *state_bydst;
struct hlist_head *state_bysrc;
struct hlist_head *state_byspi;
. . .
unsigned int state_num;
. . .
struct work_struct state_gc_work;
. . .
u32 sysctl_aevent_etime;
u32 sysctl_aevent_rseqth;
int sysctl_larval_drop;
u32 sysctl_acq_expires;
};
XFRM初始:XFRM Init
在IPv4中,XFRM初始化是通过在ip_rt_init()函数(位于net/ipv4/route.c文件)调用相关函数完成,函数调用结构为:ip_rt_init()->xfrm4_init()->xfrm_init()。
而在IPv6中,在ipv6_route_init()函数中调用xfrm6_init()方法实现了XFRM的初始化。
用户空间和内核之间的通信创建NETLINK_XFRM类型netlink套接字(socket)以及发送和接收netlink消息来完成。内核NE