+7(495)587-42-74 (МСК)
+7(800)100-37-24 (Бесплатный)
DDoSExpert
профессиональная защита от атак
16+

DDoS под прицелом: NetMap, PF RING ZC и Intel DPDK (Часть первая)

2015-06-28 15:45:00

Теперь рассмотрим фреймворки высокоскоростной обработки данных (с помощью которых мы будем осуществлять защиту от DDoS) и применяемые в них методы детальнее.

Несмотря на различное происхождение NetMap, PF RING ZC и DPDK все они используют очень схожие методы ускоренной обработки пакетов. Некоторые особенности обработки пакетов, такие, как отказ от многократного копирования, предварительное распределение памяти, а также отключение сетевого стека введены стали активно использоваться не так давно. Другие, как то polling или пакетная обработка используются уже долгое время.

В рамках использования рассматриваемых технологий происходит полное отключение от сетевого стека. Для ядра операционной системы и её сетевого стека кажется, что сетевой трафик отсутствует вообще. В описываемых фреймворках совершаются над пакетами значительно меньше действий, чем при традиционной обработке, вследствие чего ресурсы используемые для глубокого анализа протокола не расходуются эффективно уменьшая время обработки пакетов.

В привычном понимании пакетные данные должны быть многократно скопированы из сокета в ядро и обратно. Это вносит дополнительную задержку обработки пакетов, которой можно избежать с использованием фрэймворков. Время необходимое для дублирования пакетов зависит от длины пакета. Следовательно затраты можно уменьшить помощью использования технологии прямого доступа к памяти, минуя центральный процессор (DMA), методами обмена данными между устройствами (PIO), а также contiguous DMA или Scatter/gather DMA. Ещё одним важным моментом является возможность лёгкой реализации пересылки пакетов приложений. Принятые пакеты не должны копироваться из выходного интерфейса, а просто помечаются для отправки. В свою очередь память для буферизации пакетов должна выделяться только в фазе запуска приложения. Такое предварительное выделение позволяет избежать ненужных накладных расходов во время обработки пакета. Так как при данном подходе размер памяти не может быть изменён во время выполнения обработки необходимый объём должен быть выделен в соответствии с потребностями приложения в момент запуска. Тем самым необходимо обеспечить достаточное количество памяти на сервере, который будет осуществлять фильтрацию DDoS-атак.

PF RING ZC и DPDK используют большие страницы памяти именуемые huge pages. Размер этих страниц увеличен с 4 КБ до 2 МБ. Huge pages уменьшают количество промахов буфера ассоциативной трансляции (TLB) и затрат на обработку этих промахов. NetMap же, при инициализации, выделяет непрерывную область физической памяти для всех необходимых ему для работы структур данных. Т.е. используется не классический huge page, а свой собственный аллокатор, как бы создающий одну большую страницу памяти, используя указатель на начало выделенной области и смещение. Пример такого подхода приведён ниже

static int
netmap_memory_init(void)
{
//...
          buf = contigmalloc(sz + extra_sz,
           M_NETMAP,
           M_WAITOK | M_ZERO,
           0, /* low address */
           -1UL, /* high address */
           PAGE_SIZE, /* alignment */
           0 /* boundary */
          );

 

//...
}

При осуществлении системных вызовов приложением контроль за ними осуществляет операционная система. при этом приложение останавливается и контекст передаётся из пространства ядра в пространство пользователя. Там происходит дополнительная обработка пакетов, например, обработка протокола. Приостановка приложения, переключение контекста, размещение/получение данных в кеше, и обработка пакетов приводит к высокой стоимости для этих системных вызовов, что губительно сказывается при DDoS атаках типа SYN-flood и приводит к краху ОС. PF RING ZC и DPDK полностью исключают эти системные вызовы и передачу пакетов в пространство пользователя для обработки. Тем самым эти структуры не имеют никаких дополнительных затрат, вызванных системными вызовами обработки пакетной передачи.

Решение на базе NetMap обрабатывает пакеты не исключая системных вызовов, но в значительной степени их модифицировав. Работа с системными вызовами сводится к простейшим операциям. Затраты на системные вызовы также уменьшаются за счёт ещё большего пакетирования данных, что приводит к уменьшению системных вызовов распределяющих затраты на большее количество пакетов.