我正在传输大小为 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