The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Обработка сетевых пакетов ядром Linux, !*! Gekt0r, 09-Апр-07, 16:57  [смотреть все]
Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан с кодингом.
При поступлении сетевого пакета в ОС Linux он сохраняется в каком-то буфере в ядре до обработки фаерволлом. Вопрос: можем ли мы получить доступ к этому буферу и пакетам в нем? Каким функциями это можно сделать? И вообще, где можно про это почитать?
Пол-инета облазил, нашел пару более менее путных статей, но там мало...
  • Обработка сетевых пакетов ядром Linux, !*! pavel_simple, 20:56 , 09-Апр-07 (1)
    если очень хочеться менять/считать/ещё.. что нибудь делать с пакетами -- то самый верный путь это libipq -- она устарела, и сейчас нужно юзать libconntrack_ipq
    • Обработка сетевых пакетов ядром Linux, !*! gekt0r, 22:10 , 09-Апр-07 (2)
      >если очень хочеться менять/считать/ещё.. что нибудь делать с пакетами -- то самый
      >верный путь это libipq -- она устарела, и сейчас нужно юзать
      >libconntrack_ipq

      Насчет  libconntrack_ipq и Яндекс, и Гугл молчат... А что касается libipq, это, кажется, какая-то утилита уровня пользователя? А мне нужно получить доступ именно к функциям ядра

      • Обработка сетевых пакетов ядром Linux, !*! pavel_simple, 23:20 , 09-Апр-07 (3)
        netfilter.org смотри -- вот если вопрос в обработке пакетов, до firewall'а -- то я правильный путь показываю, и да это в юзерспейсе обрабатывается, а перехватывается ядром.

        libconntrack_queue она называется -- обшибся немного.

        а если есть дикое желание написать именно какой-нибудь модуль ядра -- то, как говориться бог в помощь -- я тут подсказать ни чем не могу.

        • Обработка сетевых пакетов ядром Linux, !*! Gekt0r, 16:24 , 10-Апр-07 (5)
          >netfilter.org смотри -- вот если вопрос в обработке пакетов, до firewall'а --
          >то я правильный путь показываю, и да это в юзерспейсе обрабатывается,
          >а перехватывается ядром.
          >
          >libconntrack_queue она называется -- обшибся немного.
          >
          >а если есть дикое желание написать именно какой-нибудь модуль ядра -- то,
          >как говориться бог в помощь -- я тут подсказать ни чем
          >не могу.


          libconntrack_queue тоже в гугле нет...
          Да, мне нужна именно обработка пакетов до их анализа netfilter. Это вообще возможно?

          • Обработка сетевых пакетов ядром Linux, !*! perece, 21:21 , 10-Апр-07 (10)
            >>netfilter.org смотри -- вот если вопрос в обработке пакетов, до firewall'а --
            >>то я правильный путь показываю, и да это в юзерспейсе обрабатывается,
            >>а перехватывается ядром.
            >>
            >>libconntrack_queue она называется -- обшибся немного.
            >>
            >>а если есть дикое желание написать именно какой-нибудь модуль ядра -- то,
            >>как говориться бог в помощь -- я тут подсказать ни чем
            >>не могу.
            >
            >
            >libconntrack_queue тоже в гугле нет...
            >Да, мне нужна именно обработка пакетов до их анализа netfilter. Это вообще
            >возможно?
            до анализа...iptables, осмелюсь предположить? iptables != netfilter
            можно добавить свой модуль netfilter и зацепить за prerouting и output до всех модулей iptables. это не то, что нужно?
            возможно, вам сюда:
            http://www.iptables.org/documentation/HOWTO/netfilter-hackin...
            (google netfilter hacking howto - первая ссылка)

            \^P^/

  • Обработка сетевых пакетов ядром Linux, !*! int_0dh, 00:04 , 10-Апр-07 (4)
    >Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
    >с кодингом.
    >При поступлении сетевого пакета в ОС 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. Если ядро умеет - их можно отмапить. Вообще чума будет.

    • Обработка сетевых пакетов ядром Linux, !*! Gekt0r, 16:27 , 10-Апр-07 (6)
      >>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
      >>с кодингом.
      >>При поступлении сетевого пакета в ОС 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. Если
      >ядро умеет - их можно отмапить. Вообще чума будет.

      А можно подробней? Что за proto id? И callback? Можете какой-нибудь док посоветовать?

    • Обработка сетевых пакетов ядром Linux, !*! Gekt0r, 18:03 , 10-Апр-07 (8)
      >>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
      >>с кодингом.
      >>При поступлении сетевого пакета в ОС 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. Если
      >ядро умеет - их можно отмапить. Вообще чума будет.


      Все, с первым способом я фактически разобрался. Если найду способ в своей функции-обработчике убивать пакеты, чтобы онм не шли дальше, то это будет именно то, что мне нужно))

      • Обработка сетевых пакетов ядром Linux, !*! int_0dh, 19:44 , 10-Апр-07 (9)
        >>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
        >>>с кодингом.
        >>>При поступлении сетевого пакета в ОС 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 будет освобождена в следующем обработчике.

        • Обработка сетевых пакетов ядром Linux, !*! Gekt0r, 10:03 , 11-Апр-07 (11)
          >>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
          >>>>с кодингом.
          >>>>При поступлении сетевого пакета в ОС 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 будет освобождена в следующем обработчике.

          Ты даже не представляешь, насколько не помог)) Фактически дал пищу третьей главе моего диплома)) Спасибо большое)
          Жаль только для исходящих пакетов такой обход фаерволла не действует(

        • Обработка сетевых пакетов ядром Linux, !*! Gekt0r, 11:48 , 11-Апр-07 (12)
          >>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
          >>>>с кодингом.
          >>>>При поступлении сетевого пакета в ОС 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
          Ведь если наш обработчик стоит в самом начале, то по сути можно перенаправлять пакеты куда мы хотим

          • Обработка сетевых пакетов ядром Linux, !*! pavel_simple, 12:18 , 11-Апр-07 (13)
            рыбяты -- а поделитесь сцылками пожалуйста.

          • Обработка сетевых пакетов ядром Linux, !*! int_0d, 19:59 , 11-Апр-07 (16)
            >>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
            >>>>>с кодингом.
            >>>>>При поступлении сетевого пакета в ОС 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 все есть.

            • Обработка сетевых пакетов ядром Linux, !*! gekt0r, 21:31 , 11-Апр-07 (17)
              >>>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
              >>>>>>с кодингом.
              >>>>>>При поступлении сетевого пакета в ОС 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 все есть.

              а можно ли как-то зарегить обработчик исходящих пакетов после всех остальных функций-обработчиков, фаерволла в том числе. Так, чтобы фаер получал легитимный исходящий траффик, пропускал его, а потом наша функция изменяла пакеты как нам хочется?

              • Обработка сетевых пакетов ядром Linux, !*! int_0d, 00:16 , 12-Апр-07 (18)
                >>>>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
                >>>>>>>с кодингом.
                >>>>>>>При поступлении сетевого пакета в ОС 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 на свой.
                список нет девайсов экспортируется так что грязных хаков не нужно.

                • Обработка сетевых пакетов ядром Linux, !*! gekt0r, 11:56 , 13-Апр-07 (19)
                  >>>>>>>>Затрудняюсь, в каком разделе создавать топик, создам здесь, так как он связан
                  >>>>>>>>с кодингом.
                  >>>>>>>>При поступлении сетевого пакета в ОС 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 на свой.
                  >список нет девайсов экспортируется так что грязных хаков не нужно.


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




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

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