>>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан >>>>>с кодингом. >>>>>При поступлении сетевого пакета в ОС 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 все есть.
|