Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработки трафика.(Евгений Ёрхов)
1. NETMAP (от Luigi Rizzo)
Простой и удобный открытый фреймворк для
обработки трафика на скоростях 10Gbit/s или
14 Mpps
Евгений Ёрхов
Компания IXI
2. Структура доклада
• Анализ проблемы производительности стеков
TCP/IP в OS общего назначения
• Краткий обзор известных подходов по
увеличению производительности на больших
скоростях
• Быстрое введение в Netmap, архитектура,
основные операции
• Примеры: генератор трафика, компонент
подсистемы DDOS защиты
• Обзор производительности
3. Анализ overhead’ов в стеках OS общего назначения
ОСНОВНЫЕ ПРОБЛЕМЫ ПРИ
СКОРОСТНОЙ ОБРАБОТКЕ ПАКЕТОВ
9. Подход NETMAP к обработке
пакетов на больших скоростях
• Доступ к NIC в обход стека OS
• Защита памяти в хрупком kernel space
• Zero copy операции при форвардинге
пакетов
• Линейные, лёгкие структуры данных
• pre-alloceted буферы для пакетов и
метаданных
• Поддержка множественных очередей NIC
10. Схема взаимодействия NETMAP, NIC и OS
NIC пересылает данные между
сетью и оперативной памятью
ядро OS выполняет защиту
памяти
ядро OS обеспечивает
многозадачность и
синхронизацию
NETMAP обеспечивает
механизмы управления и доступа
к данным для приложения
11. Структуры данных NETMAP экспортируемые в
user space
Пакетные буферы
( packet buffers )
Кольцевые
буферы-очереди
( netmap rings )
Дескриптор
интерфейса
( netmap_if )
12. Разделение ответственности
Приложение user space Ядерная часть
• Управляет слотами в • NETMAP управляет
«netmap_ring» границами в netmap_rings
• Управляет текущей • NIC DMA engine
позицией (номер слота) в заполняет/читает пакетные
«netmap_ring» буферы в позициях кроме
• Заполняет/читает как начиная с
пакетные буферы, «cur» по «cur + avail»
начиная с позиции • NETMAP управляет
«cur» по «cur + avail -1» синхронизацией метаданных
• Управляет полем в «netmap_rings» и структур
«netmap_ring->avail» NIC
13. NETMAP API Основные операции
• /dev/netmap
• ioctl(…, NIOCREGIF, arg)
• ioctl (…, NIOCTXSYNC) – синхронизация очередей
(netmap rings) для отправки с соответствующими
очередями сетевой карты, что эквивалентно
отправке пакетов в сеть, синхронизация начинается
с позиции cur
• ioctl (…, NIOCRXSYNC) – синхронизация очередей
сетевой карты с соответствующими очередями
netmap rings, для получения пакетов, поступивших
из сети. Запись осуществляется начиная с позиции
cur
18. Прототип генератора трафика
fds.fd = open("/dev/netmap", O_RDWR);
strcpy(nmr.nm_name, "ix0");
ioctl(fds.fd, NIOCREG, &nmr);
p = mmap(0, nmr.memsize, fds.fd);
nifp = NETMAP_IF(p, nmr.offset);
fds.events = POLLOUT;
for (;;) {
poll(fds, 1, -1);
for (r = 0; r < nmr.num_queues; r++) {
ring = NETMAP_TXRING(nifp, r);
while (ring->avail-- > 0) {
i = ring->cur;
buf = NETMAP_BUF(ring, ring->slot[i].buf_index);
//... store the payload into buf ...
ring->slot[i].len = ... // set packet length
ring->cur = NETMAP_NEXT(ring, i);
}
}
}
19. NETMAP API в подсистеме очистки
трафика DDOS
Основными требованиями к подсистеме
очистки трафика выбраны
• возможность фильтрации пакетов на предельных
скоростях
• возможности по обработке пакетов в системе
фильтров, реализующие различные, известные на
сегодняшний день техники противодействия
DDOS атакам
21. Открываем очереди для обмена с
host stack
struct nmreq nmr;
…
/* NETMAP ассоциирует netmap ring с наибольшим ringid с
сетевым стеком */
targ->nmr.ringid = stack_ring_id | NETMAP_SW_RING;
…
ioctl(targ.fd, NIOCREGIF, &targ->nmr);
…
22. Стартуем thread’ы каждая из которых
работает со своей очередью
for ( i = 0; i < MAX_THREADS; i++ ) {
/* start first rx thread */
targs[i].used = 1;
if (pthread_create(&targs[i].thread, NULL, rx_thread, &targs[i]) == -1) {
D("Unable to create thread %d", i);
exit(-1);
}
}
…
/* Wait until threads will finish their loops */
for ( i = 0; i < MAX_THREAD; i++ ) {
if( pthread_join(targs[i].thread, NULL) ) {
ioctl(targs[i].fd, NIOCUNREGIF, &targs[i].nmr);
close(targs[i].fd);
}
…
}
23. Ожидание пакетов в rx_thread()
while(targ->used) {
ret = poll(fds, 2, 1 * 100);
if (ret <= 0)
continue;
…
/* run rings processing */
for ( i = targ->begin; i < targ->end; i++) {
ioctl(targ->fd, NIOCTXSYNC, 0);
ioctl(targ->fd_stack, NIOCTXSYNC, 0);
targ->rx = NETMAP_RXRING(targ->nifp, i);
targ->tx = NETMAP_TXRING(targ->nifp, i);
if (targ->rx->avail > 0)
{
…
/* process ring */
cnt = process_incoming(targ->id, targ->rx, targ->tx,
targ->stack_rx, targ->stack_tx);
…
}
}
24. Получение доступа к raw пакетам
process_incoming()
limit = nic_rx->avail;
while ( limit-- > 0 ) {
struct netmap_slot *rs = &nic_rx->slot[j]; // rx slot
struct netmap_slot *ts = &nic_tx->slot[k]; // tx slot
eth = (struct ether_header *)NETMAP_BUF(nic_rx,
rs->buf_idx);
if (eth->ether_type != htons(ETHERTYPE_IP)) {
goto next_packet; // pass non-ip packet
}
/* get ip header of the packet */
iph = (struct ip *)(eth + 1);
…
}
26. Метрики
Per-bytes Per-packets
• Измерение • Измерение
осуществляется на основе осуществляется на основе
отношения показателей к отношения показателей к
передаваемым полезным количеству
данным (payload) обрабатываемых пакетов
• Поскольку NETMAP • Интересно измерить
использует zero copy загрузку CPU в отношении
forwarding – результат к количеству
очевиден обрабатываемых 64-
байтовых пакетов
27. Тестовое железо и OS
i7-870 4-core 2.93GHz CPU (3.2 GHz в режиме
turbo-boost), оперативная память на частоте
1.33GHz, в систему установлена двухпортовая
сетевая карта на базе чипсета Intel 82599
FreeBSD HEAD/amd64, Апрель 2012 г.
32. Скорости фильтрации flood-атак
сервером очистки трафика RUSCREEN
Наименование атаки Способ противодействия Скорости обработки
(на случайном
распределении src_addr)
Synflood SYNCOOKIE 12 883 408 pps
UDP flood PPS limiting, blacklisting, 13 854 096 pps
greylisting
ICMP flood PPS limiting, blacklisting, 13 780 314 pps
greylisting
Смешанный flood SYNCOOKIE, stateful 11 083 147 pps
inspection, PPS limiting,
blacklisting, greylisting
33. Заключение
• В докладе рассмотрены основные возможности NETMAP по
обработке трафика на скоростях 10Gbit/s
• Сделан сравнительный анализ NETMAP с другими системами
скоростной обработки пакетов
• Подтверждены тесты производительности, сделанные автором
NETMAP – Luigi Rizzo
• Продемонстрированы основные приёмы использования
NETMAP на примерах прототипов генератора трафика и
подсистемы очистки трафика.
Благодаря подходу, реализованному в NETMAP, автору доклада
удалось добиться нужно производительности при фильтрации
трафика в проекте DDOS-защиты RUSCREEN, позволяющей
работать на скоростях 14Mpps.