xfrm_replay_state_esn字段是什么意思?

时间:2017-07-06 02:17:08

标签: linux networking linux-kernel network-programming ipsec

我试图通过查看内核源代码来了解有关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 :(得分:0)

XFRM 是Linux内核的IPSec实现。 XFRM名称代表“转换”,表示根据IPSec协议对IP数据包进行的转换。

以下RFC与IPSec相关:

  • RFC4301:IPSec协议的定义。
  • RFC4302:用于确保IP数据包真实性的Authentication Header(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保持 hi gher 32位。将64位值拆分为两个32位值而不是将其表示为单个64位变量的原因是,IPSec协议要求进行优化,包中仅包含序列号的低32位。因此,将低32位作为结构体中的单独变量更为方便,以便无需使用位操作就可以直接对其进行访问。

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

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

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