Использование pcap для захвата двойного трафика VLAN - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь написать простой анализатор пакетов, который будет работать только с определенными типами трафика c. Я пишу код на C ++ и использую libpcap на коробке Centos 7. Он работает довольно хорошо, но надеялся улучшить производительность, используя опции фильтрации библиотеки pcap, так что для обработки представлены только интересующие меня типы пакетов.

Пример моего кода:

struct bpf_program filter;
if (pcap_compile(pcap, &filter,
                 "(ip && (tcp || udp)) || (vlan && (ip && (tcp || udp)))",
                 1 /*OPTIMIZE*/, PCAP_NETMASK_UNKNOWN) == PCAP_ERROR) {
  std::cout << "Failed to compile filter: " << pcap_geterr(pcap);
} else {
  // Load filter into packet capture device
  if (pcap_setfilter(pcap, &filter) == PCAP_ERROR) {
    std::cout << "Failed to set filter: " << pcap_geterr(pcap);
  }
}

По сути, я хочу, чтобы IP-пакеты содержали TCP или UDP, а также принимали пакеты с тегами VLAN того же типа. Я считаю, что синтаксис фильтра правильный, но теперь нужно поддерживать двойные пакеты VLAN (802.1ad) и не знаю, как мне переписать строку фильтра. У меня нет пакетов с двойным vlan для тестирования, поэтому я не могу просто поэкспериментировать, пока я не получу это правильно. Кто-нибудь есть какие-либо предложения о том, как строка фильтра должна выглядеть для принятия двойных пакетов VLAN (а также один VLAN и без VLAN)?

Я также заметил, что когда я запускаю вживую, функция pcap_compile не работает с ошибкой no VLAN support for data link type 113. Странно, когда я помещаю тот же код фильтра в wireshark, он не жалуется. Любая идея, что проблема здесь?

Обновление 1:

Мне удалось найти несколько двойных пакетов VLAN онлайн для тестирования. Используя wireshark, фильтр ieee8021ad работает нормально, но выдает синтаксическую ошибку при использовании в качестве аргумента с pcap_compile

1 Ответ

0 голосов
/ 09 января 2020

Я нашел правильную строку фильтра для пропуска пакетов с тегами 802.1ad. Вот обновленный код:

if (pcap_compile(pcap, &filter,
                   "(ip && (tcp || udp)) ||"
                   "(vlan && (ip && (tcp || udp))) ||"
                   "((ether[12:2] == 34984) && (vlan && (ip && (tcp || udp))))"
                   "|| vlan",
                   1 /*OPTIMIZE*/, PCAP_NETMASK_UNKNOWN) == PCAP_ERROR) {
    LOG(ERROR) << "Failed to compile filter: " << pcap_geterr(pcap);
  } else {
    // Load filter into packet capture device
    if (pcap_setfilter(pcap, &filter) == PCAP_ERROR) {
      LOG(ERROR) << "Failed to set filter: " << pcap_geterr(pcap);
    }
  }

По сути, он позволяет использовать tcp / udp (IP), tcp / udp (IP) в VLAN, tcp / udp (IP) в двойной VLAN, а затем, если есть 3 или более уровней VLAN, все разрешено. Из того, что я могу сказать, нет универсального параметра для разрешения всех вложенных VLAN, когда вы хотите указать другие параметры, поэтому пока это будет делать.

Второй Частично проблема связана с тем, что с обработанным перехваченным («любым» интерфейсом) поддерживаются не все фильтры, например, vlan, eth addr et c. Мы можем обойти это, открыв и захватив на каждом интерфейсе (собственных потоках), чтобы у нас был правильный тип ссылки, который позволяет нам больше параметров фильтрации.

...