Привет 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 хоста и дальше не уйдет.
Быстрый старт или практическая часть
Собираем примитивную схему:
Для запуска генератора нам понадобится модуль ядра 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
</Подвал>