有什么方法可以检测 PRE_ROUTING 挂钩点中的数据包方向

Is there any way to detect packet direction in the PRE_ROUTING hook point

我正在尝试在 C 中创建防火墙作为 linux 内核模块。作为防火墙的一部分,我实现了一个钩子函数,它在 PRE_ROUTING 钩子点内执行数据包检查。 在挂钩函数中,我需要根据其源和目标网络设备推断数据包方向。 每当我尝试提取源设备和目标设备时,在数据包检查功能中,都会发生内核恐慌并且 OS 崩溃,我不知道为什么(我严格遵循 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 字段来提取数据包的源设备和目标设备。

注意:kernel panic肯定是从上面的代码开始发生的,其余代码无关。

解决方案:

正如在上面的评论中所发现的,所犯的错误是假设在调用挂钩函数时已经分配了数据包的目标设备。这个假设是有问题的,因为挂钩函数是在 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 */
    }
}