Как создать модуль ядра, который может перехватывать все пакеты, поступающие в/из сетевого интерфейса

В моей системе есть 2-портовая сетевая карта - eth0 и eth1, как их видит Linux.
Я хочу перехватывать все пакеты, входящие/входящие в eth0, и отправлять их через eth1 на внешнее устройство, подключенное к тому же коммутатору, что и eth1. Поэтому мне нужно добавить дополнительный заголовок, чтобы он достиг нужного внешнего устройства.

Я знаю, что существует концепция сетевых кранов, на которые отправляются как код передачи, так и код приема в ядре, но как мне его создать? Также я хочу захватить не только IP, но и все пакеты Ethernet, я знаю, что NETFILTER_HOOK помог бы мне получить пакеты IPv4.


person smam    schedule 17.06.2014    source источник
comment
Вы проверили библиотеку libpcap?   -  person icbytes    schedule 17.06.2014
comment
Похоже, вы пытаетесь превратить свою Linux-систему в модифицированный концентратор...   -  person twalberg    schedule 17.06.2014
comment
Спасибо, но libcap в основном для пользовательского пространства, пока я искал что-то в ядре. я думаю, что понял, где искать, в основном зарегистрировать обработчик протокола, используя dev_add_pack(), который принимает структуру 'packet_type' в качестве входных данных и 'тип' пакета, установленного на ETH_P_ALL   -  person smam    schedule 18.06.2014


Ответы (1)


Это может быть легко реализовано с помощью rx_handler:

static rx_handler_result_t handle_frame(struct sk_buff **pskb)
{
    struct sk_buff *skb = *pskb;
    struct net_device *whereto_dev;

    skb = skb_share_check(skb, GFP_ATOMIC);
    if (unlikely(!skb))
        return RX_HANDLER_CONSUMED;

    *pskb = skb;

    whereto_dev = rcu_dereference(skb->dev->rx_handler_data);

    skb->dev = whereto_dev;

    return RX_HANDLER_ANOTHER; /* Do another round in receive path */
}

Они зарегистрированы через netdev_rx_handler_register(slave_dev, handle_frame, whereto). См. связывание или мой uman для примера использования.

dev_add_pack тоже будет работать, но, похоже, кроме af_packet.c, все пользователи dev_add_pack, перехватывающие все пакеты, были переведены на использование rx_handler, например. https://patchwork.ozlabs.org/patch/367236/. Обсуждение патча предполагает, что это может быть более эффективным.

person a3f    schedule 04.03.2018