xfrm_replay_state_esn字段的含义是什么?

3

我正在尝试通过查看内核源代码来更好地了解Linux内核IPSec网络技术。从概念上讲,我理解IPSec使用序列号和重放窗口来防止重放攻击,即如果接收者收到一个不在重放窗口内或已经接收过的序列号,则丢弃该数据包并增加重放计数器。

我正在尝试将此与xfrm_replay_state_esn结构相关联,该结构定义如下:

struct xfrm_replay_state_esn {
  unsigned int  bmp_len;
  __u32     oseq;
  __u32     seq;
  __u32     oseq_hi;
  __u32     seq_hi;
  __u32     replay_window;
  __u32     bmp[0];
};

我试图搜索相关文档,但是很少,我也无法找到各种函数和结构的手册,因此我不理解每个字段之间的关系。

1个回答

0

XFRM 是 Linux 内核的 IPSec 实现。XFRM 的名称代表着根据 IPSec 协议转换 IP 数据包。

以下 RFC 对于 IPSec 相关:

  • RFC4301:IPSec 协议的定义。
  • RFC4302:用于确保 IP 数据包真实性的认证头(AH)子协议的定义。
  • RFC4303:用于确保 IP 数据包真实性和机密性的封装安全载荷(ESP)子协议的定义。

IPSec 协议允许使用 32 位或 64 位大小的序列号。64 位序列号称为扩展序列号 (ESN)。

反重放机制在 AH 和 ESP 的 RFC 中都有定义。该机制保持了一个可接受的入站数据包序列号窗口。该窗口从迄今为止收到的最高序列号向后延伸,定义了可接受序列号的下限。当接收到低于该下限的序列号时,它将被拒绝。当接收到高于当前最高序列号的序列号时,窗口将向前移动。当接收到窗口内的序列号时,该机制将在检查清单中标记此序列号,以确保窗口中的每个序列号仅被接收一次。如果该序列号已经被标记,则将其拒绝。

这个检查清单可以实现为一个位图,其中窗口中的每个序列号由一个单独的位表示,0 表示尚未接收到该序列号,1 表示已经接收到该序列号。

基于这些信息,可以给出 xfrm_replay_state_esn 结构中字段的含义如下。该结构保存了具有扩展序列号(64 位)的反重放机制的状态:

  • 目前接收到的最高序列号由seqseq_hi表示。每个都是32位整数,因此它们可以一起表示64位数字,其中seq保存较低的32位,而seq_hi保存较高的32位。将64位值分成两个32位值的原因是IPSec协议规定了一种优化方式,其中仅包括序列号的较低32位。因此,将较低的32位作为结构中的单独变量更方便,这样可以直接访问它,而不必使用位操作。

  • 站包的序列号计数器在oseqoseq_hi中跟踪。与之前一样,64位数字由两个32位变量表示。

  • 窗口的大小由replay_window表示。给定的最小可接受序列号由seqseq_hi减去replay_window加1表示。

  • 用于检查窗口内已接收序列号的位图由bmp表示。它被定义为零大小的数组,但是当为结构分配内存时,在结构后面保留了额外的内存,然后可以通过bmp[i]访问它(这当然只是*(bmp+i)的语法糖)。位图的大小保存在bmp_len中。它当然与窗口大小相关,即窗口大小除以8*sizeof(u32),向上取整。我猜测它被明确存储是为了避免频繁重新计算此值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接