gpt4 book ai didi

linux - xfrm_replay_state_esn 字段是什么意思?

转载 作者:行者123 更新时间:2023-12-03 09:53:07 25 4
gpt4 key购买 nike

我试图通过查看内核源代码来更多地了解 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];
};

我试过搜索文档,但是很少,而且我一直没能找到各种功能和结构的人,所以我不明白各个领域有什么关系。

最佳答案

XFRM 是 Linux 内核的 IPSec 实现。 XFRM 这个名称代表“转换”,指的是根据 IPSec 协议(protocol)转换 IP 数据包。

以下 RFC 与 IPSec 相关:

  • RFC4301 : IPSec 协议(protocol)的定义。
  • RFC4302 : 用于确保 IP 数据包真实性的身份验证 header (AH) 子协议(protocol)的定义。
  • RFC4303 : 封装安全有效负载 (ESP) 子协议(protocol)的定义,用于确保 IP 数据包的真实性和保密性。

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

抗重放机制在 AH 和 ESP 的 RFC 中定义。该机制保持传入数据包的可接受序列号的窗口。该窗口从目前收到的最高序列号向后延伸,定义了可接受序列号的下限。当收到低于该界限的序列号时,它会被拒绝。当接收到比当前最高序列号更高的序列号时,窗口向前移动。当在窗口内接收到一个序列号时,该机制将在一个检查列表中标记这个序列号,以确保窗口中的每个序列号只被接收一次。如果序列号已经被标注,则拒绝。

这个 list 可以实现为一个位图,其中窗口中的每个序列号都由一个位表示,0表示这个序列号还没有收到,1表示它已经收到已经收到了。

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

  • 到目前为止收到的最高序列号由seqseq_hi表示。每个都是一个 32 位整数,所以它们一起可以表示一个 64 位数字,seq 保存低 32 位,seq_hi 保存 hi呃 32 位。将 64 位值拆分为两个 32 位值而不是将其表示为单个 64 位变量的原因是 IPSec 协议(protocol)要求进行优化,其中仅序列号的低 32 位包含在包中。因此,将低 32 位作为一个单独的变量放在结构中会更方便,这样就可以直接访问它,而无需借助位操作。

  • oseqoseq_hi 中跟踪o待处理包的序列号计数器。和以前一样,64 位数字由两个 32 位变量表示。

  • 窗口的大小由replay_window 表示。如果由 seqseq_hi 减去 replay_window 加一表示的序列号给出,则最小的可接受序列号。

  • 用于检查窗口内接收到的序列号的位图由bmp 表示。它被定义为一个零大小的数组,但是当分配结构的内存时,会在结构之后保留额外的内存,然后可以访问它,例如使用 bmp[i](这当然只是 *(bmp+i) 的语法糖)。位图的大小保存在 bmp_len 中。它当然与窗口大小有关,即窗口大小除以 8*sizeof(u32),四舍五入。我推测它是明确存储的,以避免必须经常重新计算该值。

关于linux - xfrm_replay_state_esn 字段是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44938767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com