Как стать автором
Обновить

Генерация трафика в linux на уровне ядра

Привет All!


Хочу рассказать вам о генерации трафика в linux на уровне ядра. Для чего это нужно — спросите вы? Ну, например для тестирования маршрутизаторов, свитчей, сетевых карт,устранения конкурентов — отвечу я, в этом ключе мы и используем в данное время генератор.
Генератор трафика работающий на уровне ядра системы имеет огромную производительность и способен генерировать трафик на скорости сетевого интерфейса. Производительность генерации трафика зависит от железа.На производительность влияют такие параметры как: производительность CPU, скорость шины PCI, задержки памяти, задержки DMA, количество чтения/запись в MMIO и другие.Оптимизация производительности, это тема отдельной статьи и здесь её затрагивать не будем.
Для генерации трафика в linux используется модуль pktgen. После запуска модуль pktgen, создает поток ядра и привязывает его к CPU, к потоку привязываются устройства через которые будет проходит сгенерированный, такие как /dev/eth[0], /dev/vlan[]. Соответственно 1 CPU — 1 поток, 2 CPU — 2 потока и так далее. К каждому CPU можно привязать несколько устройств, с разными настройками, что дает необходимую гибкость в управлении генератором. Так же у генератора есть ограничение, а точнее — TTL=3, то есть трафик пройдет через 3 хоста и дальше не уйдет.

Быстрый старт или практическая часть

Собираем примитивную схему:
image
Для запуска генератора нам понадобится модуль ядра pktgen, загрузить его можно командой:

#modprobe pktgen

Проверяем загрузился модуль или нет, вывод должен быть похож на такой:

# lsmod | grep pktgen
pktgen 66645 1


После загрузки модуля появится директория /proc/net/pktgen/, она служит для мониторинга и управления генератором, в ней можно увидеть:
/proc/net/pktgen/pgctrl - управление потоком
/proc/net/pktgen/kpktgend_X - статус генератора
/proc/net/pktgen/ethX(vlanX) - просмотр статистики по устройству


Для запуска генератора, ему необходимо передать параметры, для этого воспользуемся одним из скриптов приведенных в примерах

Возьмем самый простой из них скрипт, который использует 1 процессор и 1 сетевой интерфейс.
Отредактируем строки : pgset "dst 10.10.11.2" и pgset "dst_mac 00:04:23:08:91:dc", заменим их на pgset "dst 192.168.0.1" и pgset "dst_mac мак адрес вашего маршрутизатора"
Теперь можно запустить генератор:
chmod 744 pktgen.conf-1-1
./pktgen.conf-1-1

В консоле появится:
Removing all devices
Adding eth1
Setting max_before_softirq 10000
Configuring /proc/net/pktgen/eth1
Running... ctrl^C to stop

Остановить генератор можно послав ctr+c в консоль, либо убив процесс echo, через kill.
Посмотреть результаты можно так:
#cat /proc/net/pktgen/eth1
После запуска генератора лампочки на интерфейсах начнут весело моргать, если запустить tcpdump на том же хосте, что и генератор, пакетов от сетевого адаптеры вы не увидите, так как они генерируются на уровне ядра и tcpdump не может их перехватить.

<Подвал>
Генератор пакетов, встроенный в ядро Linux. Автор: Николай Малых. — Хорошее описание параметров, нюансов. Скрипты не рабочие в примере.
pktgen the linux packet generator.Autor:Robert Olsson,Uppsala Universitet & SLU — Вопросы мультипоточности + pktgen
</Подвал>
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.