使用 tc 或 ipfilter 匹配 IP 数据包的最后一个片段

使用 tc 或 ipfilter 匹配 IP 数据包的最后一个片段

我正在传输大小为 2900 字节的 UDP 数据包。由于碎片化,数据包被分成 2 个 IP 片段。我的 tc u32 过滤器(更多片段位和 IP/PORT 组合)仅匹配第一个片段,而第二个片段不匹配。

我如何使用过滤器匹配最后一个片段。我可以使用 tc 或 iptables 过滤器规则

答案1

不行。加载 nf_conntrack_ipv4。此模块对数据包进行碎片整理,然后您的规则应该可以正常工作。

答案2

不行。加载 nf_conntrack_ipv4。此模块对数据包进行碎片整理,然后您的规则应该可以正常工作。

这不是真的。

当 pkt 在本地发送时,nf_conntrack_ipv4 不会对 pkt 碎片进行碎片整理。因为钩子 NF_INET_LOCAL_OUT(其中调用 ipv4_conntrack_defrag)在碎片发生之前。

如果启用了 UFO 或 udp gso,tc 过滤器将匹配整个 pkt(而不是片段)。tc 过滤器中的 UDP 端口有效。

如果禁用,则匹配片段。大多数情况下,UDP 端口位于第一个片段中。因此您无法将第二个片段与端口匹配,只能使用 ip 和协议。

UFO 和 udp gso 取决于您的内核版本和 nic(对于 UFO)。

当内核 >=4.14 时,UFO 内核支持被删除

当内核 >=4.18 时添加 Up gso

相关内容