libpcap - захватывает пакеты со всех интерфейсов - PullRequest
3 голосов
/ 25 января 2012

Мне нужно захватывать пакеты со всех сетевых интерфейсов на машине с Linux. Для этого я планирую использовать pcap_open_live() API и передать «any» в качестве аргумента устройства.

У меня есть разные типы портов: порты Ethernet (скажем, eth0) и туннели GRE (скажем, tun0) Пакеты, поступающие из разных типов интерфейсов, имеют разный формат заголовков:

  1. Пакеты из порта Ethernet имеют заголовок MAC
  2. Пакеты из туннеля, идущие с заголовком «готовая» инкапсуляция захвата Linux (16 байт)

Как я могу проверить в pcap_loop() обработчике обратного вызова, какой тип заголовка пакета я получил?

1 Ответ

6 голосов
/ 27 января 2012

Все пакеты, которые вы получаете, получают заголовки пакетов одинакового типа;это тип, который вы получаете, когда вызываете pcap_datalink() на pcap_t.Значения, которые возвращает pcap_datalink(), являются значениями DLT_, как показано на странице Типы заголовков канального уровня на сайте tcpdump.org.

Если вы открыли any device, pcap_datalink() вернет DLT_LINUX_SLL, что означает, что ALL захваченные вами пакеты будут иметь "готовый" заголовок захвата - даже те, которые eth0!Чтобы получить заголовки Ethernet для этих пакетов, вам нужно будет захватить eth0, а не any.

...