问题是:如何在 de片段之前使用netfilter NFQUEUE 将数据包排队到用户空间?
根据Linux内核源代码,nf_defrag_ipv4
安装在NF_INET_PRE_ROUTING
(iptables/nftables中称为PREROUTING)和NF_INET_LOCAL_OUT
(OUTPUT)中。
所以我尝试了以下反碎片整理nftables过滤器(原始:https://stackoverflow.com/a/30638753/5167443) NF_INET_LOCAL_OUT
,但我仍然得到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),这是我自己对libnetfilter_queue.so.1
的绑定
我刚刚自己解决了。
我误解了netfilter处理的TCP重组实际上是由"TCP Auto Corking"处理的。
现在我可以通过将0
写入/proc/sys/net/ipv4/tcp_autocorking
来获得碎片(即非软木塞)数据包。