Программа eBPF для пересылки HTTP-запросов на другой порт

Я пытаюсь реализовать функцию, в которой в зависимости от пути HTTP-запроса я могу перенаправить запрос на другой порт.

Например, если запрос GET /foo, я бы хотел перенаправить его на порт 81, а если это /bar, я бы хотел перенаправить его на порт 82. А если это что-то другое, я бы хотел продолжить пересылать его на порт. порт 80, поскольку он был входящим.

Есть ли пример такой программы eBPF?

Я пытаюсь понять, как определить, что такое HTTP-запрос, потому что eBPF будет применяться на уровне пакетов.


person halivingston    schedule 20.12.2018    source источник


Ответы (1)


Я не знаю о таком примере в это время. Я знаю, что проект Cilium использует BPF для создания фильтров на уровне HTTP API, но они генерируют BPF программы на лету, и я не верю, что в репо есть предварительно скомпилированные примеры.

Как вы упомянули, программы eBPF обрабатывают весь пакет, включая заголовки L2/L3/L4. Итак, чтобы определить HTTP-запрос, который у вас есть, вам нужно сделать что-то вроде этого:

  • Получить эфирный тип
  • Если ethertype не IPv4 или IPv6, выйдите (например, пропустите или отбросьте пакет), в противном случае продолжайте
  • Получить тип IP-протокола
  • Если тип IP-протокола не TCP, выйдите
  • Получить порт назначения TCP
  • Если этот порт не 80, выйдите
  • Получить первые 4 байта слоя приложения
  • Это байты GET␣? Если нет, выйдите.
  • Если да, попробуйте сопоставить следующие байты с вашими путями /foo и /bar
  • Если он совпадает, измените порт назначения на 81 или 82 соответственно.

По крайней мере, для первых шагов (обработка Ethernet, IP, TCP) у вас есть доступные примеры в Интернете. От parse_simple.c в примерах ядра до более сложных, таких как как этого балансировщика нагрузки L4 в репозитории образцов Netronome.

person Qeole    schedule 21.12.2018