【问题标题】:Is there any way to detect packet direction in the PRE_ROUTING hook point有什么方法可以检测 PRE_ROUTING 挂钩点中的数据包方向
【发布时间】: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->instate->out 字段来提取数据包的源设备和目标设备。

注意:上面的代码肯定会发生内核崩溃,其余代码无关紧要。

【问题讨论】:

  • 仔细检查stateinname都是有效的指针?
  • 您使用的是pre-routing 挂钩,对吧?但是如果是在路由之前,那么内核还没有决定将它路由到哪个设备。所以看起来state->out 没有意义。
  • 你是对的!谢谢,这段代码实际上在 FORWARDING 钩子中为我工作,我已经将它复制到 PRE_ROUTING 钩子中而没有意识到这是无意义的。现在,当我仅通过 state->in 检测方向时,它确实有效!
  • 如果您解决了问题,您可能会自行发布并自行接受答案。

标签: c linux-kernel firewall kernel-module netfilter


【解决方案1】:

解决方案:

在上面的 cmets 中发现,所犯的错误是假设在调用钩子函数时已经分配了数据包的目标设备。这个假设是有问题的,因为钩子函数是在 PRE_ROUTING 钩子中注册的,因此仍然没有目标网络设备。为了解决这个问题,我们可以只从源设备推断数据包的方向。

这里是固定版本的代码:

unsigned int inspect_packet(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
    char *src_device;

    src_device = state->in->name;
    /* Deduce the packets direction just by the source networking device */
    if (src_device[5] == IN_DEVICE_NUM)
    {
        /* some code */
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2019-06-05
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多