Требуется ли для захвата исходящих кадров с использованием RAW-сокета Linux ETH_P_ALL

В Linux (ядро 2.6.39), используя необработанные сокеты, я пытаюсь получить все многоадресные кадры, отправляемые самой системой.

Я создал необработанный сокет socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); и читал кадры из сокета, выбрасывая кадры, у которых нет адреса назначения, начинающегося с «01:00:5e». Я знаю, что есть лучшие способы зафиксировать UDP, но я играл и заметил эту конкретную проблему, поэтому ниже приведена единственная область применения этого вопроса.

Я мог захватить все многоадресные пакеты, летающие вокруг, за исключением пакетов, созданных системой, на которой работала программа. Единственный способ, которым я мог заставить его начать перехватывать собственные пакеты системы (вместе с пакетами, поступающими к нему), состоял в том, чтобы изменить параметр protocol в вызове socket() на htons(ETH_P_ALL). Пакеты, которые я захватил таким образом, по-прежнему имели тип 0x0800, то есть ETH_P_IP.

Итак, я задаюсь вопросом об этом. Является ли использование ETH_P_ALL единственным способом захвата исходящих кадров так же, как входящих кадров? Есть ли другой способ указать направление захваченных пакетов?

packet(7) немного расплывчато говорит по этому поводу и говорит только:

Все входящие пакеты этого типа протокола будут переданы в сокет пакетов до того, как они будут переданы протоколам, реализованным в ядре.


person Pawel Veselov    schedule 01.01.2014    source источник


Ответы (1)


Используйте libpcap для захвата всех входящих и исходящих пакетов и используйте pcap_setdirection() для указания направления, в котором будут перехватываться пакеты. libpcap работает быстрее, чем необработанный сокет, так как внутри использует PF_PACKET.

person user3511903    schedule 10.04.2014
comment
Последнее предложение не имеет смысла. PF_PACKET — это то же самое, что и AF_PACKET, который пытается использовать спрашивающий. - person user253751; 21.12.2018