我正在编写一个内核模块,它需要在IP层做一些包过滤工作。我需要做的是拦截所有的IP数据包,在一些传出的数据包上,我需要保留它们一小段时间(就像几十毫秒),以便在发送它们的途中进行分析。
我已经启动并运行了内核模块,目前它接受所有传入数据包,并在所有传出数据包上返回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);我应该在哪里指定数据包将在哪个队列上结束?排队数的意义是什么?我不能处理由另一个钩子排队的随机丢包,这在默认情况下已经完成了吗?
谢谢!另外,我使用的是Linux3.x。
发布于 2015-10-13 16:17:25
使用NF_QUEUE_NR(x)宏。传递给它一个参数(队列号),它将为您构建返回值。具体来说,它将把队列号左移16位,然后使用NF_QUEUE。
如果您感兴趣,实现是在include/uapi/linux/netfilter.h中实现的
https://stackoverflow.com/questions/33052951
复制相似问题