Ce document détaille la configuration, le déploiement et l'observabilité de la plateforme de génération de trafic Cisco TRex v3.08 entièrement conteneurisée et supervisée en temps réel à l'aide de Prometheus et Grafana.
La solution est orchestrée via un unique fichier Docker Compose exécutant 4 services complémentaires :
4501, convertit les statistiques brutes et les expose pour Prometheus sur le port 8000.Le projet est structuré sur l'hôte sous le chemin `/home/jonathan/docker/trex-bundle/` de la manière suivante :
/home/jonathan/docker/trex-bundle/
├── docker-compose.yaml # Fichier d'orchestration multi-conteneurs
├── docker-compose.yaml.bak # Copie de sauvegarde historique
├── trex/ # Répertoire dédié au service TRex
│ ├── Dockerfile # Image système TRex (Ubuntu 24.04 + Setuptools)
│ ├── trex_cfg.yaml # Fichier de configuration d'interfaces et CPU
│ └── scratch/ # Dossier monté contenant les binaires et profils
└── monitoring/ # Répertoire dédié à la stack d'observabilité
├── Dockerfile # Image système de l'exportateur Prometheus
├── prometheus.yml # Configuration de collecte (Scraping)
└── grafana-datasource.yml # Provisionnement automatique de la source Prometheus
Ce fichier orchestre l'ensemble des dépendances, gère l'accès privilégié au matériel hôte et configure les volumes persistants.
services: trex: build: context: . dockerfile: ./trex/Dockerfile container_name: trex-server image: local/trex:3.08 restart: unless-stopped privileged: true network_mode: "host" volumes: # Montage du dossier scratch contenant les scripts et exécutables TRex - ./trex/scratch:/scratch # Montage de la configuration réseau/matériel TRex - ./trex/trex_cfg.yaml:/etc/trex_cfg.yaml # Montage des Hugepages pour les performances d'accès mémoire DPDK (Critique) - /dev/hugepages:/dev/hugepages # Montage en lecture seule des modules noyau de l'hôte pour le chargement des pilotes - /lib/modules:/lib/modules:ro # Montage des répertoires systèmes pour le mapping PCI - /sys:/sys - /dev:/dev working_dir: /scratch command: ["-i", "--no-watchdog"] ciscotrex-exporter: build: context: . dockerfile: ./monitoring/Dockerfile container_name: ciscotrex-exporter network_mode: "host" environment: - TREX_EXT_LIBS=/scratch/external_libs - TREX_HOST=127.0.0.1 - TREX_ZMQ_PORT=4501 - PYTHONPATH=/scratch/automation/trex_control_plane/interactive volumes: - ./trex/scratch:/scratch:ro restart: unless-stopped depends_on: - trex prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped ports: - "9090:9090" extra_hosts: - "host.docker.internal:host-gateway" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus grafana: image: grafana/grafana-oss:latest container_name: grafana restart: unless-stopped ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - ./monitoring/grafana-datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml - grafana-data:/var/lib/grafana volumes: prometheus-data: grafana-data:
Ce fichier utilise Ubuntu 24.04 comme base. Afin d'assurer la compatibilité avec l'API interne de TRex v3.08 écrite pour des versions de Python antérieures à Python 3.12 (qui a déprécié/retiré distutils), le paquet python3-setuptools est installé pour émuler l'import de distutils à la volée.
FROM ubuntu:24.04
# Évite les interruptions lors des installations interactives APT
ENV DEBIAN_FRONTEND=noninteractive
# Supprime les avertissements de syntaxe hérités d'anciennes versions de Python
ENV PYTHONWARNINGS="ignore"
# Installation des dépendances requises par DPDK et TRex
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 \
python3-setuptools \
libz-dev \
pciutils \
iproute2 \
kmod \
procps \
libc6 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /scratch
ENV PATH="/scratch:${PATH}"
ENTRYPOINT ["./t-rex-64"]
Définit les adresses PCI des ports réseau configurés pour le test ainsi que la topologie CPU (Socket 0, Threads 4 à 7 dédiés à la génération de paquets).
- version: 2 interfaces: ['03:00.0', '03:00.1'] port_info: - ip: '192.168.100.11' # Port 0 TRex IP default_gw: '192.168.100.1' # Port 0 Router Gateway IP - ip: '192.168.101.12' # Port 1 TRex IP default_gw: '192.168.101.1' # Port 1 Router Gateway IP platform: master_thread_id: 0 latency_thread_id: 1 dual_if: - socket: 0 threads: [4,5,6,7]
Utilise une image légère Debian-slim et clone le dépôt de l'exportateur officiel de Cisco TRex pour l'exposer sur l'hôte.
FROM python:3.10-slim # Installation de git pour cloner le dépôt de l'exportateur RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* # Clonage de l'exportateur Prometheus pour TRex RUN git clone https://github.com/Civil/ciscotrex_exporter.git /app WORKDIR /app # Installation des paquets Python (ZMQ, Prometheus Client, etc.) RUN pip install --no-cache-dir -r requirements.txt EXPOSE 9362 ENV TREX_EXT_LIBS=/scratch/external_libs ENV TREX_HOST=127.0.0.1 ENV TREX_ZMQ_PORT=4501 ENTRYPOINT ["python", "main.py"] CMD ["--web.listen-address=0.0.0.0:9362"]
Configure Prometheus pour requêter l'exportateur local à une fréquence rapide (toutes les 10 secondes) afin de capturer l'ensemble des spikes de trafic.
global: scrape_interval: 10s evaluation_interval: 10s scrape_configs: - job_name: 'cisco-trex' static_configs: - targets: ['host.docker.internal:8000']
Ajoute automatiquement Prometheus comme source de données active lors de l'initialisation de Grafana.
apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true
Avant de démarrer le conteneur, l'hôte physique doit disposer des modules noyau adéquats et de mémoire Hugepages configurée.
# Allouer 1024 pages de 2MB (2 Go de RAM au total pour DPDK) echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # Rendre la modification permanente au redémarrage echo "vm.nr_hugepages = 1024" | sudo tee -a /etc/sysctl.conf
Assurez-vous que les modules requis par DPDK sont actifs sur l'hôte physique :
sudo modprobe uio sudo modprobe vfio-pci sudo modprobe uio_pci_generic
| Description de l'action | Commande |
|---|---|
| Construire & Démarrer la stack | docker compose up -d –build |
| Arrêter la stack | docker compose down |
| Afficher les logs globaux | docker compose logs -f |
| Vérifier l'export des métriques | curl http://localhost:8000/metrics |
| Accéder à la Console interactive TRex | docker exec -it trex-server ./trex-console |
admin / adminCette section regroupe les commandes essentielles pour administrer le serveur, interagir avec la console et lancer des profils de trafic.
Démarrer le serveur TRex en mode interactif (Stateless) tout en désactivant le thread de surveillance matérielle :
sudo ./t-rex-64 -i --no-watchdog
Ouvrir la console CLI interactive permettant d'acquérir les ports et d'injecter le trafic :
sudo ./trex-console
Ces commandes sont executees directement a l'interieur de trex-console :
Acquerir le controle exclusif des ports de test :
acquire
Activer le Mode Service (necessaire pour le trafic ARP et de controle) :
service
Activer le mode Promiscuous (promiscuite) sur tous les ports :
portattr -a --prom on
Desactiver le Mode Service (retour au mode haute performance) :
service --off
Lancer le trafic IMIX a un taux de 10 000 PPS sur le Port 0 :
start -f stl/imix.py -m 10kpps --port 0
Lancer le trafic IMIX a un taux de 10 000 PPS sur le Port 1 :
start -f stl/imix.py -m 10kpps --port 1
Arreter la generation de trafic sur le Port 0 :
stop --port 0
Arreter la generation de trafic sur le Port 1 :
stop --port 1
Arreter la generation sur les Ports 0 et 1 simultanement :
stop --port 0 1
Ouvrir l'interface utilisateur textuelle (TUI) en temps reel :
tui
Afficher un tableau recapitulatif instantane des compteurs :
stats
Ces commandes simulent des flux IP traversant votre equipement Juniper SRX300.
Gaspillage de bande passante UDP (Port 0 uniquement, trames de 512 octets) :
start -f stl/udp_1pkt-jo1.py -m 960mbps --port 0 -t fsize=512
Test UDP bidirectionnel a 985 Mbps (Trames de 1518 octets) :
start -f stl/udp_1pkt-jo1.py -m 985mbps --port 0 1 -t fsize=1518
Simulation de flux UDP Route (L3) a 960 Mbps de Port 0 a Port 1 :
start -f stl/udp_1pkt-l3.py -m 960mbps --port 0 -t fsize=1518,src_ip=192.168.100.11,dst_ip=192.168.101.12
Simulation de flux TCP Route (L3) a 960 Mbps de Port 0 a Port 1 :
start -f stl/tcp_1pkt-l3.py -m 960mbps --port 0 -t fsize=1518,src_ip=192.168.100.11,dst_ip=192.168.101.12
Simulation de flux TCP Route (L3) a 960 Mbps de Port 1 a Port 0 :
start -f stl/tcp_1pkt-l3.py -m 960mbps --port 1 -t fsize=1518,src_ip=192.168.101.12,dst_ip=192.168.100.11