我想添加一个规则来丢弃一个IPv4
带有任何IP option
跟随头的数据包。我了解标头中IHL
的(Internet 标头长度)字段包含 IPv4 标头中的 32 位字数,包括选项。所以,我的理解是,规则应该从IHL
字段中获取数据包+选项长度并与 20(不带选项的 IPv4 标头长度)进行比较,如果大于 20,则丢弃数据包。
是否有iptables
允许检查IP
标头和评估(进行算术运算)的特定模块?
我想添加一个规则来丢弃一个IPv4
带有任何IP option
跟随头的数据包。我了解标头中IHL
的(Internet 标头长度)字段包含 IPv4 标头中的 32 位字数,包括选项。所以,我的理解是,规则应该从IHL
字段中获取数据包+选项长度并与 20(不带选项的 IPv4 标头长度)进行比较,如果大于 20,则丢弃数据包。
是否有iptables
允许检查IP
标头和评估(进行算术运算)的特定模块?
iptables
包括u32
match 方法,它允许对数据包有效负载进行一些按位(但不是任意算术)操作、范围比较和一些类似指针的间接操作以匹配条件:它有自己的子语言语法,需要检查手册中的语法和示例。
IHL是 IP 标头大小(以 32 位块而不是字节为单位)并且是标头中前 32 位的一部分(4 位用于版本,IPv4 值为 0x04,后跟 4 位用于 IHL),因此,如果有没有选项,这个大小应该是最小大小:20(字节)/4(每 32 位字的字节数)所以 IHL = 5(32 位字)。我不会处理 IHL < 5 的无效情况,IPv4 堆栈应该已经解决了这个问题。
这转化为:
!
在匹配时反转结果)因此,要使用iptables丢弃此类传入数据包:
没有反转(匹配 6 或更大):
手册有一个类似的例子,它被移动了 24 位,然后乘以 4(所以只移动了 22 位)以获得字节而不是 32 位字(因为
u32
稍后使用的指针使用 8 位地址),以检索第 4 层有效载荷并继续进行进一步操作:给予 OP 的案例:
没有反转(并且不关心第一个可能的值不是 21 而是 24 也不关心确切的最大值,只要给定的值更大):
第一种方法可以简化为:
给予:
或者:
甚至:
给予:
或者:
选择您的选择。