В 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)
немного расплывчато говорит по этому поводу и говорит только:
Все входящие пакеты этого типа протокола будут переданы в сокет пакетов до того, как они будут переданы протоколам, реализованным в ядре.