Что ты пробовал? Вероятно, вам следует прочитать немного больше о eBPF, чтобы попытаться понять, как обрабатывать пакеты, приведенный вами пример basi c не кажется слишком сложным.
В основном вам нужно будет проанализировать заголовки, чтобы увидеть, где полезная нагрузка начинается. Простые примеры синтаксического анализа BPF могут помочь вам понять принципы:
- Начать с начала заголовка (например, Ethe rnet сначала)
- Проверить длину пакета достаточно, чтобы удерживать заголовок (иначе вы рискуете получить доступ за пределами границ при попытке доступа к верхним уровням).
- Добавьте длину заголовка, чтобы получить смещение вашего следующего заголовка (например, IPv4, затем, например, TCP ...)
- Промойте и повторите.
В вашем случае вы должны обрабатывать все заголовки, пока не получите смещение полезной нагрузки данных . Обратите внимание, что это тривиально, если трафик c, который вы пытаетесь сопоставить, всегда имеет одни и те же заголовки (например, всегда IPv4 и UDP), но вы получаете больше случаев для сортировки, если есть сочетание (IPv4 + IPv6, инкапсуляция, параметры IPv4 ...).
Когда у вас есть смещение для ваших данных, просто сравните данные с этим смещением с вашим шаблоном (который вы можете жестко запрограммировать в программе BPF или получить из карты BPF , в зависимости от вашего варианта использования). Обратите внимание, что у вас нет доступа к strcmp()
, но __builtin_memcmp()
доступен, если вам нужно сравнить более 64 бит.
(Все вышеперечисленное, конечно, применимо к C программа, которую вы бы скомпилировали в объектный файл, содержащий инструкции eBPF, с помощью серверной части LLVM.)
Если бы вы искали строку с произвольным смещением в полезной нагрузке, знайте, что eBPF теперь поддерживает ( bounded), начиная с ядра 5.3 (если я правильно помню).