- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过查看内核源代码来更多地了解 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 相关:
IPSec 协议(protocol)允许大小为 32 位或 64 位的序列号。 64 位序列号称为扩展序列号 (ESN)。
抗重放机制在 AH 和 ESP 的 RFC 中定义。该机制保持传入数据包的可接受序列号的窗口。该窗口从目前收到的最高序列号向后延伸,定义了可接受序列号的下限。当收到低于该界限的序列号时,它会被拒绝。当接收到比当前最高序列号更高的序列号时,窗口向前移动。当在窗口内接收到一个序列号时,该机制将在一个检查列表中标记这个序列号,以确保窗口中的每个序列号只被接收一次。如果序列号已经被标注,则拒绝。
这个 list 可以实现为一个位图,其中窗口中的每个序列号都由一个位表示,0表示这个序列号还没有收到,1表示它已经收到已经收到了。
根据这些信息,xfrm_replay_state_esn
结构中字段的含义可以给出如下。该结构保存具有扩展序列号(64 位)的反重放机制的状态:
到目前为止收到的最高序列号由seq
和seq_hi
表示。每个都是一个 32 位整数,所以它们一起可以表示一个 64 位数字,seq
保存低 32 位,seq_hi
保存 hi呃 32 位。将 64 位值拆分为两个 32 位值而不是将其表示为单个 64 位变量的原因是 IPSec 协议(protocol)要求进行优化,其中仅序列号的低 32 位包含在包中。因此,将低 32 位作为一个单独的变量放在结构中会更方便,这样就可以直接访问它,而无需借助位操作。
在 oseq
和 oseq_hi
中跟踪o待处理包的序列号计数器。和以前一样,64 位数字由两个 32 位变量表示。
窗口的大小由replay_window
表示。如果由 seq
和 seq_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/
我试图通过查看内核源代码来更多地了解 Linux 内核 IPSec 网络。我从概念上理解 IPSec 可以防止带有序列号和重播窗口的重播攻击,即如果收件人收到的数据包的序列号不在重播窗口内,或者之前收
我是一名优秀的程序员,十分优秀!