【发布时间】:2022-01-17 07:05:56
【问题描述】:
我正在尝试在 C 中创建一个防火墙作为 linux 内核模块。作为防火墙的一部分,我实现了一个钩子函数,它在PRE_ROUTING 钩子点内执行数据包检查。
在钩子函数中,我需要根据其源和目标网络设备推断数据包方向。
每当我尝试提取源设备和目标设备时,在数据包检查功能中,都会发生内核恐慌并且操作系统崩溃,我不知道为什么(我严格遵循linux/netfilter.h)。我会非常感谢任何帮助!
钩子函数的相关部分如下:
unsigned int inspect_packet(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
char *src_device;
char *dst_device;
src_device = state->in->name;
dst_device = state->in->name;
/* Deduce the packets direction by the networking devices direction */
if (src_device[5] == IN_DEVICE_NUM && dst_device[5] == OUT_DEVICE_NUM)
{
/* some code */
}
}
如您所见,我使用(在头文件中)state->in 和 state->out 字段来提取数据包的源设备和目标设备。
注意:上面的代码肯定会发生内核崩溃,其余代码无关紧要。
【问题讨论】:
-
仔细检查
state、in和name都是有效的指针? -
您使用的是pre-routing 挂钩,对吧?但是如果是在路由之前,那么内核还没有决定将它路由到哪个设备。所以看起来
state->out没有意义。 -
你是对的!谢谢,这段代码实际上在 FORWARDING 钩子中为我工作,我已经将它复制到 PRE_ROUTING 钩子中而没有意识到这是无意义的。现在,当我仅通过 state->in 检测方向时,它确实有效!
-
如果您解决了问题,您可能会自行发布并自行接受答案。
标签: c linux-kernel firewall kernel-module netfilter