>>>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан >>>>>>с кодингом. >>>>>>При поступлении сетевого пакета в ОС Linux он сохраняется в каком-то буфере >>>>>>в ядре до обработки фаерволлом. Вопрос: можем ли мы получить доступ >>>>>>к этому буферу и пакетам в нем? Каким функциями это можно >>>>>>сделать? И вообще, где можно про это почитать? >>>>>>Пол-инета облазил, нашел пару более менее путных статей, но там мало... >>>>> >>>>>1) Если я правильно понял вопрос, то существует ровно 2 способа >>>>>из ядра - зарегистрировать свою packet_type структуру с нужным proto id - >>>>>мы будем получать пакет в коллбеке >>>>>Выглядит это примерно так: >>>>>... >>>>>int my_rcv_callback(struct sk_buff *skb, /* это наш пакет */, struct net_device *dev, >>>>>struct packet_type *pt) >>>>>{ >>>>> ...что нибудь сделать с пакетом... >>>>> return 1/0; - мы не/приняли пакет >>>>>} >>>>> .... >>>>> struct packet_type my_packet_type = >>>>>{ __constant_htons(НУЖНЫЙ_ПРОТО_ИД), >>>>> NULL, >>>>> my_rcv_callback, >>>>> NULL, >>>>> NULL >>>>>}; >>>>>... >>>>>int module_init() { >>>>> ....dev_add_pack(&my_packet_type); >>>>> ... >>>>>} ну и т п. >>>>> >>>>>2) способ - из userspace - использовать PF_PACKET сокеты с ETH_P_ALL. Если >>>>>ядро умеет - их можно отмапить. Вообще чума будет. >>>> >>>> >>>>Все, с первым способом я фактически разобрался. Если найду способ в своей >>>>функции-обработчике убивать пакеты, чтобы онм не шли дальше, то это будет >>>>именно то, что мне нужно)) >>>это очень просто. твой обработчик будет первый в цепочке => чтобы пакет не пошёл дальше его нужно испортить (например так - memset(skb->data, 0, skb->len), skb будет освобождена в следующем обработчике. >> >>Кстати, а в исходящих пакетах можно таким образом, к примеру, менять ip >>адрес получателя? >>Вот так, например: >>skb->nh.iph->daddr=my_address >>Ведь если наш обработчик стоит в самом начале, то по сути можно >>перенаправлять пакеты куда мы хотим > >в исходящих нельзя. это коллбек на input, с исходящими до файервола >нужно хучить ip_queue_xmit, что некрасиво. можно правда определить свою qdisc и >менять адрес в её коллбеке. можно и ище кой-чего :) >в src/net все есть. а можно ли как-то зарегить обработчик исходящих пакетов после всех остальных функций-обработчиков, фаерволла в том числе. Так, чтобы фаер получал легитимный исходящий траффик, пропускал его, а потом наша функция изменяла пакеты как нам хочется?
|