netfilter - 如何在内核模块中指定队列号?

netfilter - how to specify queue number in kernel module?

我正在编写一个内核模块,它需要在 IP 层做一些数据包过滤工作。我需要做的是拦截所有 IP 数据包,并且在一些外发数据包上,我需要在发送它们之前将它们保留一小段时间(比如几十毫秒)进行分析。

我已经启动了内核模块 运行,目前它接受所有传入的数据包并且 returns NF_QUEUE 接受所有传出的数据包。然后我可以在用户空间中使用 libnetfilter 获取这些数据包(比如使用 Python 脚本和 NetfilterQueue)但问题是 Python 库需要一个队列号,我的内核模块将数据包排队队列 #0。我该如何配置?!

这是我的内核模块的传出数据包钩子的样子(从各种来源拼凑而成):

static struct nf_hook_ops nfho_send;

unsigned int hook_send_func(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
  return NF_QUEUE;
}

/* in init_module() */

nfho_send.hook = hook_send_func;
nfho_send.hooknum = NF_INET_POST_ROUTING;
nfho_send.pf = NFPROTO_IPV4;
nfho_send.priority = NF_IP_PRI_LAST;
nf_register_hook(&nfho_send);

我在哪里可以指定数据包将在哪个队列中结束?队列号有什么意义?我不能处理由另一个钩子排队的随机杂散数据包,默认情况下已经完成了吗?

谢谢!另外,我正在使用 Linux 3.x.

使用 NF_QUEUE_NR(x) 宏。您向它传递一个参数(队列号),它会为您构建 return 值。具体来说,它将队列号左移 16 位,然后将其与 NF_QUEUE.

如果您有兴趣,实现在 include/uapi/linux/netfilter.h