引言
在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;