引言
在Linux网络栈中,IPSec提供了网络层的数据加密和认证服务。传统的IPSec支持两种模式:传输模式(Transport Mode)和隧道模式(Tunnel Mode)。然而,这两种模式各有优缺点:传输模式开销小但无法隐藏原始IP头;隧道模式提供完全封装但增加了开销。
BEET(Bound End-to-End Tunnel)模式应运而生,它是一种介于传统传输模式和隧道模式之间的混合模式。BEET模式提供了类似隧道模式的固定外部头,但内部处理又类似于传输模式,能够在保证安全性的同时减少协议开销。本文将深入分析Linux内核中IPv4 BEET模式的实现机制。
BEET模式的核心思想
BEET模式的设计理念是在保持隧道模式安全特性的同时,尽量减少封装带来的额外开销。与完整隧道模式不同,BEET模式使用固定的外部IP头,避免了隧道模式下内外IP头完全独立带来的开销。
这种设计使得BEET模式特别适合需要固定外部头但希望保持内部协议处理的场景,如移动IP和某些VPN应用。BEET模式通过伪头部(pseudo-header)机制处理IP选项,进一步优化了数据传输效率。
代码实现分析
1. 头部构建函数
c
static void xfrm4_beet_make_header(struct sk_buff *skb) {struct iphdr *iph = ip_hdr(skb);iph->ihl = 5;iph->version = 4;iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol;