Pull to refresh

Генерация трафика в 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
</Подвал>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.