Table of Contents
Infrastructure de Test : Cisco TRex & Stack d'Observabilité (Docker Compose)
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.
1. Architecture Globale
La solution est orchestrée via un unique fichier Docker Compose exécutant 4 services complémentaires :
- trex-server (TRex) : Le moteur de génération de trafic s'exécutant en mode privilégié et réseau hôte pour permettre l'accès matériel direct via DPDK aux interfaces réseau physiques.
- ciscotrex-exporter : Un exportateur de télémétrie Python qui se connecte au serveur TRex sur le port API ZMQ
4501, convertit les statistiques brutes et les expose pour Prometheus sur le port8000. - prometheus : La base de données de séries temporelles configurée pour scraper l'exportateur toutes les 10 secondes.
- grafana : L'interface de visualisation affichant les graphiques temps réel de trafic (Bitrates, PPS, Utilisation CPU et Perte de paquets).
2. Structure des Répertoires
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
3. Configuration de l'Orchestrateur (docker-compose.yaml)
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:
4. Service TRex (Dossier /trex)
Dockerfile (trex/Dockerfile)
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"]
Configuration TRex (trex/trex_cfg.yaml)
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]
5. Service Observabilité (Dossier /monitoring)
Dockerfile de l'exportateur (monitoring/Dockerfile)
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"]
Configuration de Collecte (monitoring/prometheus.yml)
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']
Provisionnement de la Source de Données (monitoring/grafana-datasource.yml)
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
6. Configuration Requise sur l'Hôte (Prise en charge DPDK)
Avant de démarrer le conteneur, l'hôte physique doit disposer des modules noyau adéquats et de mémoire Hugepages configurée.
Allocation des Hugepages
# 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
Chargement des Pilotes Noyau
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
7. Guide d'Exploitation (Commandes Clés)
| 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 |
8. Adresses d'Accès aux Services
- Prometheus Dashboard : http://<IP_HOTE>:9090/targets (Vérifier que le statut du endpoint “cisco-trex” est à “UP”)
- Grafana Web UI : http://<IP_HOTE>:3000
- Identifiants de connexion :
admin/admin - Dashboard TRex Officiel : Menu > Dashboards > Import > Saisir l'ID 23559 > Sélectionner la source de données Prometheus > Import**.
9. Référence des Commandes TRex (Cheat Sheet)
Cette section regroupe les commandes essentielles pour administrer le serveur, interagir avec la console et lancer des profils de trafic.
9.1. Gestion du Serveur
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
9.2. Connexion à la Console
Ouvrir la console CLI interactive permettant d'acquérir les ports et d'injecter le trafic :
sudo ./trex-console
9.3. Gestion des Ports et Mode Service
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
9.4. Lancement et Arret du Trafic IMIX
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
9.5. Visualisation des Statistiques en Console
Ouvrir l'interface utilisateur textuelle (TUI) en temps reel :
tui
Afficher un tableau recapitulatif instantane des compteurs :
stats
9.6. Profils Avances et Tests L3 (Routage SRX)
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
