Репозиторий содержит готовую реализацию методики тестирования ECMP-распределения по Source IP-адресу. Реализация включает контейнерную топологию, скрипты конфигурации, генератор трафика, захват пакетов и анализ результатов.
- Скрипты для создания топологии:
docker-compose.yml,Dockerfileвimages/. - Скрипты для настройки ECMP и хеширования:
scripts/configure_dut.sh,scripts/configure_tg.sh,scripts/configure_nexthop.sh. - Скрипт для генерации трафика:
scripts/traffic.py. - Скрипты для захвата трафика: встроены в
launch.py(черезtcpdumpв контейнерах nexthop). - Скрипты анализа результатов:
scripts/analyze.py.
+----------+
+---->| |
| +----------+
| Endpoint
|
+----------+ +----------+ | +----------+
| |------->| |---------->| |
+----------+ +----------+ | +----------+
Traffic Generator Device Under Test | Endpoint
|
| +----------+
+---->| |
| +----------+
| Endpoint
|
| +----------+
+---->| |
+----------+
Endpoint - TG — Traffic Generator
- DUT — Device Under Test
- NEXTHOP — Endpoint
- На DUT включается IP forwarding и задаётся ECMP-маршрут до
172.16.0.254/32через 4 nexthop-а. Политика хеширования задаётся на уровне L3:net.ipv4.fib_multipath_hash_policy=0. Поскольку Destination IP фиксирован, выбор nexthop фактически зависит только от Source IP-адреса. - На TG настраивается маршрут по умолчанию через DUT (
scripts/configure_tg.sh). - На NEXTHOP поднимается loopback-адрес назначения (
scripts/configure_nexthop.sh).
Тест состоит из двух частей:
-
Проверка равномерности распределения (distribution)
- Источник: множество случайных Source IP-адресов.
- Destination IP фиксирован:
172.16.0.254. - UDP порты фиксированы.
- Цель: проверить статистическое распределение потоков по ECMP-путям.
-
Проверка хеширования только по Source IP (hash-only-source)
- Source IP фиксированные (набор адресов).
- Destination IP фиксирован.
- UDP порты вариируются, чтобы убедиться, что смена портов не влияет на выбор nexthop.
- Цель: удостовериться, что один Source IP всегда попадает в один и тот же nexthop.
Захват осуществляется на каждом nexthop-контейнере через tcpdump:
- Фильтр:
udp and dst host 172.16.0.254. - Файлы сохраняются в локальную директорию
./pcaps/на хосте. - Запуск/остановка захвата автоматизированы в
launch.py.
Анализатор scripts/analyze.py вычисляет:
- Количество UDP пакетов по каждому nexthop.
- Количество уникальных Source IP по каждому nexthop.
- Долю уникальных Source IP на каждом nexthop.
Критерии корректности:
- Для distribution: максимальное отклонение доли уникальных Source IP от равномерной доли (
100% / число nexthop-ов) не превышает5%. - Для hash-only-source: каждый Source IP встречается строго на одном nexthop.
- Docker.
- Python на хосте.
- Python-зависимости виртуального окружения (
scapy,rich):
source .venv/bin/activate
pip install -r requirements.txtpython launch.pyПосле запуска в консоли выводятся таблицы и итоговые статусы:
- PASS — корректное распределение ECMP или корректное хеширование по Source IP-адресу.
- FAIL — распределение выходит за допуск или Source IP-адрес попадает на несколько nexthop-ов.