我正在编写一个内核模块,需要在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);
我在哪里指定数据包最终会在哪个队列中?队列号的意义是什么?我无法处理由我的另一个钩子排队的随机杂散数据包,默认情况下已经完成了吗?
谢谢!另外,我使用的是Linux 3.x。
答案 0 :(得分:2)
使用NF_QUEUE_NR(x)
宏。您传递一个参数(队列号),它将为您构建返回值。具体来说,它会将队列号左移16位,然后将其与NF_QUEUE进行AND运算。
如果您有兴趣,请执行include/uapi/linux/netfilter.h