Linux Netfilter:在碎片整理之前将数据包排队给用户-space

Linux Netfilter: Enqueue packets to the user-space before defragment

问题是:如何使用 netfilter NFQUEUE before de 片段将数据包排队到 user-space?

根据 Linux kernel sourcenf_defrag_ipv4 安装在 NF_INET_PRE_ROUTING(在 iptables/nftables 中称为 PREROUTING)和 NF_INET_LOCAL_OUT(输出)。

所以我为 NF_INET_LOCAL_OUT 尝试了以下反碎片整理 nftables 过滤器(原始:),但我仍然收到 de 碎片包.

sudo nft add table filter
sudo nft add chain filter predefrag { type filter hook output priority -- -450 \; }
sudo nft add filter predefrag skuid nfqhooked counter queue num 42

在上面的过滤器中,-450 代表优先级在 NF_IP_PRI_CONNTRACK_DEFRAG=-400 之前。即,过滤器预计在 nf_defrag_ipv4.

之前工作

我正在使用 Linux 3.19(Ubuntu 15.04)和 this my own binding 用于 libnetfilter_queue.so.1

我自己解决了

我误以为 netfilter 处理的 TCP 重组实际上是由 "TCP Auto Corking" 处理的。

现在我只需将 0 写入 /proc/sys/net/ipv4/tcp_autocorking 就可以获得碎片化的(即非软木塞)数据包。

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f54b311142a92ea2e42598e347b84e1655caf8e3