Назад | Перейти на главную страницу

Выполнение задач и настраиваемая логика для сетевых пакетов

Я ищу способ обрабатывать пакеты на сервере Linux определенным образом - мне нужно запустить некоторую настраиваемую логику для каждого пакета, затем (возможно) предпринять некоторые действия с пакетами и позволить ядру маршрутизировать его по своему усмотрению. Мои конкретные варианты использования:

  1. Перехватывайте пакеты IGMP (которые передаются внутри моста Linux на моем хосте) и проверяйте их внутренние поля (группу многоадресной рассылки и контрольную сумму) по некоторому списку допустимых значений, который у меня есть. Если совпадений не найдено, отбросьте пакет.
  2. При получении пакета IPv6 (который маршрутизируется через мою машину Linux) сравните исходный адрес с некоторым словарем «подозрительных» адресов. Если это правда, откройте пакет (до заголовков HTTP и внутри) и запустите несколько тестов, чтобы убедиться, что он действителен (например, проверьте номера портов, длину содержимого, структуру заголовков).
  3. После захвата сегмента TCP проверьте количество включенных в нем флагов, и если это число больше 5, отправьте копию пакета в другое место назначения (скажем, в устройство IDS) и отправьте пакет в обычном режиме.

Я просмотрел некоторые утилиты и инструменты Linux, такие как tc, XDP, DPDK и другие FD.io решения (VPP), но я не мог найти простой способ отработать эти технологии простым способом, чтобы достичь того, что я хочу. Желательно, чтобы мои проверки и действия могли выполняться в современной, гибкой среде и коде (не запрашивая здесь python или Java, но bash был бы предпочтительнее некоторого кода C, подобного ядру).

Как обычно можно реализовать такие действия на машине с Linux? Какие-либо передовые методы или технологии, которые позволяют программно реализовать все упомянутые модификации и функции?

Ура.

Использование XDP INGRESS было бы идеальным кандидатом для сценариев igmp и tcp. Но для ipv6, поскольку у вас больше проверок и границ, не знаю, как это будет переводиться. Недостатком здесь является отсутствие конкретного пользовательского приложения, поэтому нельзя использовать режим нулевого копирования пользователя и процесс пакет за пакетом eBPF в JIT песочницы. Зеркало пакетов для идентификаторов тоже будет трудным.

DPDK с TAP или KNI действительно может быть подходящим вариантом, поскольку вы можете группировать и амортизировать стоимость. Но это связано с перехватом пользовательского пространства.

Вот мои предложения

  1. Если у вас есть hw ack или flow.director, то направьте интересующий трафик на настраиваемый порт или очередь.
  2. Используйте DPDK на настраиваемом порту и проверьте. Если сопоставить зеркало для ida, а затем ввести в ядро ​​через тап или kni.

Или

  1. Если hw-фильтры отсутствуют, попробуйте ebpf пользовательского пространства для фильтрации содержимого igmp, ipv6 и tcp из входящего трафика.
  2. Затем приложение пользовательского пространства запускает логику фильтрации и зеркалирования, а затем вводит обратно в ядро.