The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Обработка сетевых пакетов ядром Linux"
Отправлено gekt0r, 13-Апр-07 11:56 
>>>>>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
>>>>>>>>с кодингом.
>>>>>>>>При поступлении сетевого пакета в ОС 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 все есть.
>>
>>а можно ли как-то зарегить обработчик исходящих пакетов после всех остальных функций-обработчиков,
>>фаерволла в том числе. Так, чтобы фаер получал легитимный исходящий траффик,
>>пропускал его, а потом наша функция изменяла пакеты как нам хочется?
>>
>можно. самый простой способ - зарегестрируйте свою qdisc и смените во всех
>net_device их qdisc на свой.
>список нет девайсов экспортируется так что грязных хаков не нужно.


Спасибо за совет.ду копаться в этом направлении

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру