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

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

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

Isесть пример программы eBPF, подобной этой?

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

1 Ответ

0 голосов
/ 21 декабря 2018

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

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

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

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

...