Что такое XDP (Express Data Path) в Linux

XDP (или Express Data Path) — это сетевой утилита, доступная в ядре Linux. XDP используется во многих популярных компаниях для решения серьезных сетевых проблем, с которыми они сталкиваются при обработке миллионов запросов в секунду. Это программа с лицензией MIT, слияние которой произошло в ядро Linux начиная с версии 4.8.
XDP является высокопроизводительным и программируемым обработчиком сетевых пакетных данных. Он создан для смягчения некоторых серьезных проблем на стороне сервера, таких как DDoS-атаки (распределенный отказ в обслуживании) или для выполнения функций балансировщика нагрузки.
Содержание
- Необходимость в XDP
- Почему XDP очень быстрый
- Связь сетевого стека с XDP
- Типы операций, выполняемых XDP
- XDP и eBPF
- Общие случаи использования XDP и eBPF
- Часто задаваемые вопросы
Также прочитайте: 5 полезных советов при компиляции собственного ядра Linux
Необходимость в XDP
Необходимость в высокопроизводительном сетевом путе данных всегда является требуемой функцией для серверов Linux. Но программируемость этих путей данных также должна присутствовать, чтобы разработчики могли создать что-то полезное из этого. Хотя у XDP довольно крутая кривая обучения, благодаря недавнему развитию множества инструментов и фреймворков, написание кода XDP стало достаточно доступным в настоящее время.
Огромное преимущество XDP заключается в его скорости. Основная функция XDP заключается в том, что разработчики могут построить новую функциональность для фильтрации пакетов без необходимости модификации самого ядра.
Есть некоторые сценарии, когда пакеты не должны проходить через весь сетевой стек, чтобы просто решить, следует ли передать или отбросить пакет. Это должно быть сделано на первом уровне сетевого стека с помощью размещения некоторых фильтров. Эти фильтры должны быть запрограммированы таким образом, чтобы они могли легко распознавать вредоносный пакет и отбрасывать его сразу же в начале стека. Это может сэкономить много вычислительных ресурсов и времени.
С помощью XDP это фильтрация возможна прямо на фронте сетевого стека.
Теперь, используя XDP, разработчик может отбрасывать любые пакеты, которые могут быть отправлены любым хакером для проведения DDoS-атаки. Это может значительно снизить нагрузку на обычный сетевой стек ядра. Эта функция была недавно продемонстрирована Cloudflare в их демонстрации защиты от DDoS.

Некоторые примечательные особенности XDP следующие:
- Не требует специального оборудования: XDP может работать на любом оборудовании, которое вы ему предоставите. Да, скорость может быть снижена, если у вас нет оптимизированного устройства или его драйверов, но для тестирования вам не нужно специальное оборудование.
- Не требует обхода ядра: XDP работает до того, как пакет попадет в сетевой стек ядра. Функция обратного вызова срабатывает, когда пакет получает, и XDP обрабатывает его как можно быстрее.
- Не заменяет стек TCP/IP: XDP присутствует на самом нижнем уровне сетевого стека. Когда он передает пакет, пакет входит в обычный сетевой стек ядра, который включает стек TCP/IP.
- Работает в сочетании с TCP/IP со всеми функциями BPF (Berkeley Packet Filter): XDP ничего не заменяет. Он даже использует eBPF для обработки пакетов и упрощает написание кода для разработчика.
Также прочитайте: Как создать и установить пользовательское ядро на Ubuntu
Почему XDP очень быстрый
XDP — это программируемый, высокопроизводительный сетевой путь данных на основе eBPF в ядре Linux. Увеличение производительности XDP объясняется прямой обработкой пакетов на самом низком уровне программного стека. Это означает, что сетевой пакет, поступающий из сети, сначала контактирует с XDP до того, как любые другие процессы ядра.
Таким образом, инженеры могут программировать XDP, чтобы оптимизировать его для различных сценариев использования, от защиты от DDoS до балансировщика нагрузки.
XDP загружается непосредственно в сетевой стек. Когда пакет принимается сетевым стеком, он получает обратный вызов и обрабатывает пакеты как можно быстрее. XDP может отбросить 26 миллионов пакетов в секунду на ядро в стандартном оборудовании.
Основная причина, по которой XDP очень быстрый, заключается в том, что пользователю разрешено напрямую читать или изменять данные сетевого пакета и принимать решения о том, как обрабатывать пакет на более ранней стадии. Это требует очень малых накладных расходов и соответственно обеспечивает лучшую скорость.
Связь сетевого стека с XDP
Вы можете подключиться к сетевым возможностям с помощью XDP различными способами, но я упомяну здесь несколько популярных методов.
- Generic XDP: В этом процессе XDP загружается в ядро, но получает очень небольшую выгоду в производительности. Это простой способ запустить программу XDP без какой-либо поддержки от оборудования.
- Native XDP: Native XDP загружается самим сетевым драйвером. Он требует поддержки от драйвера сетевой карты.
Также прочитайте: Как исправить ошибку данных встраивания ядра в Windows
Типы операций, выполняемых XDP
Некоторые операции, которые может выполнить XDP, когда пакет принимается сетевым интерфейсом:
- XDP_DROP: Он отклоняет пакеты и не обрабатывает их. Используя программу eBPF для анализа трафика, можно отбросить пакеты в реальном времени.
- XDP_PASS: Он пересылает пакеты в сетевой стек для дальнейшей обработки. Он может изменить содержание пакета перед этим.
- XDP_ABORTED: Он отбрасывает сетевой пакет данных, оставляя исключение точки трассировки.
- XDP_TX: Перенаправляет пакеты на тот же сетевой интерфейс, который их получил. Пакеты могут быть изменены или остаться неизменными.
- XDP_REDIRECT: Перенаправляет пакет на другой NIC (контроллер сетевых интерфейсов).

XDP и eBPF
eBPF — это расширенная версия Berkeley Packet Filter. Это как абстрактная виртуальная машина, работающая внутри ядра Linux. eBPF используется для выполнения определенной пользователем программы внутри sandbox-окружения в ядре Linux. Обычно он используется для запуска сетевых и мониторинговых инструментов на серверах Linux, чтобы гарантировать оптимальную работу.
XDP — это фреймворк, используемый для написания высокоскоростной обработки пакетов в приложениях BPF. Чтобы сделать это даже быстрее, XDP запускает BPF сразу после получения пакета сетевым стеком.
У XDP очень высокая кривая обучения. Поэтому разработчики создают инструменты и фреймворки, чтобы упростить программирование с использованием eBPF. Это делает написание кода для обработки очень высокочастотной сетевой обработки с использованием XDP и eBPF очень простым. Основное преимущество XDP заключается в том, что вам не нужно модифицировать ядро, что было огромной головной болью для инженеров.
Но, как говорят, большая сила сопряжена с большой ответственностью. Так как XDP запускает eBPF как можно раньше, прежде чем пакеты будут разобраны самим ядром, программы eBPF должны выполнять все разборы сами и не могут полагаться на ядро, чтобы сделать что-либо для них.
Как программист, большую часть своего времени вы проводите с терминалом. Это руководство по украшению вашего терминального запроса. Проверьте его.
Также прочитайте: Как откатить ядро в Linux
Общие случаи использования XDP и eBPF
- DDoS-атака: Основной случай использования XDP — это защита от DDoS (распределенного отказа в обслуживании). Во время DDoS-атаки злоумышленник пытается использовать как можно больше ресурсов сервера, не оставляя никаких процессов для конечного пользователя. Используя XDP как очень быстрый уровень сетевого стека, нет никаких накладных расходов на отклонение сетевого пакета данных. После фильтрации XDP пакет проходит через все другие методы фильтрации, которые предоставляет ядро Linux.
- Балансировщик нагрузки: XDP также используется как балансировщик нагрузки для обработки огромного количества трафика к серверу. Включая Facebook, многие крупные технологические компании используют эту технологию. Ранее инженеры использовали выделенный сервер в качестве балансировщика нагрузки. Что довольно трудно управлять и должно работать очень эффективно, чтобы обслуживать миллионы клиентов. Но представьте, что использовать уровень XDP в качестве балансировщика нагрузки без центрального сервера, как результат, нет единой точки отказа.
- Брандмауэр: XDP с eBPF можно использовать для написания различных правил брандмауэра для защиты системы с очень минимальными накладными расходами.
Также прочитайте: Как использовать команду rm в Linux
Часто задаваемые вопросы
Что такое BCC в eBPF?
BCC основан на eBPF. Это набор инструментов или фреймворк для трассировки ядра и манипуляции программами, который имеет очень удобный интерфейс командной строки. BCC помогает писать инструкции ядра на C. Он также включает в себя обертку вокруг LLVM.
Что такое libBPF?
LibBPF — это альтернативный набор инструментов для создания BPF-приложений. Он написан на языке программирования C.