es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de detectar la dirección de los paquetes en el punto de enganche PRE_ROUTING?

Estoy tratando de crear un firewall en C como un módulo del kernel de Linux. Como parte del firewall, he implementado una función de gancho que realiza la inspección de paquetes dentro del punto de gancho “PRE_ROUTING”. En la función de gancho, necesito deducir la dirección del paquete en función de sus dispositivos de red de origen y destino.

Cada vez que intento extraer los dispositivos de origen y destino en la función de inspección de paquetes, se produce un kernel panic y el sistema operativo se bloquea, y no tengo idea de por qué (he seguido “linux/netfilter.h” estrictamente). ¡Agradecería mucho cualquier ayuda!

La parte relevante de la función de gancho es la siguiente:

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 */
    }
}

Como puedes ver, utilizo (como en los archivos de encabezado) los campos “state->in” y “state->out” para extraer el dispositivo de origen y destino del paquete.

Nota: El kernel panic ciertamente ocurre debido al código anterior, el resto del código no es relevante.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema para deducir la dirección del paquete en el módulo del kernel de Linux Firewall

    Como experto en TI especializado en C, kernel de Linux, firewall, módulo del kernel y netfilter, un cliente se ha acercado a mí y me ha informado sobre un problema que están enfrentando al crear un firewall en C como módulo del kernel de Linux. Han implementado una función de gancho que realiza una inspección de paquetes dentro del punto de gancho PRE_ROUTING, pero están enfrentando problemas para deducir la dirección del paquete basándose en los dispositivos de red origen y destino. Cada vez que intentan extraer los dispositivos de origen y destino en la función de inspección de paquetes, se produce un pánico del kernel y el sistema operativo se bloquea.

    La parte relevante de la función de gancho es la siguiente:

    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 la dirección de los paquetes mediante la dirección de los dispositivos de red */
        if (src_device[5] == IN_DEVICE_NUM && dst_device[5] == OUT_DEVICE_NUM)
        {
            /* algún código */
        }
    }
    

    Como experto en este campo, reconozco que el problema se encuentra en las siguientes líneas de código:

    src_device = state->in->name;
    dst_device = state->in->name;
    

    Estas líneas extraen el nombre del dispositivo de la interfaz de entrada (state->in) dos veces, en lugar de extraer el nombre del dispositivo de la interfaz de salida (state->out) para dst_device. Esto resulta en la extracción de información incorrecta, lo que provoca el pánico del kernel.

    Para solucionar este problema, en su lugar se debe utilizar el siguiente código:

    src_device = state->in->name;
    dst_device = state->out->name;
    

    Esta corrección permitirá al cliente extraer la información correcta y deducir la dirección del paquete sin causar pánicos del kernel.

Comments are closed.