|
1 | 1 | # switch-capture |
2 | 2 |
|
3 | | -Orchestrateur de capture réseau pour switches HPE Comware |
4 | | -(5130/5140/5510/5520), avec CLI et interface graphique GTK4. |
| 3 | +Orchestrateur de capture réseau pour switches HPE Comware (5130/5140/5510/ |
| 4 | +5520), avec CLI et interface graphique GTK4. |
5 | 5 |
|
6 | | -Dépôt importé depuis les archives de livraison du projet — le code arrive |
7 | | -sur `main` uniquement via des PR depuis la branche `dev` (voir le |
8 | | -garde-fou d'intégration dans `.github/workflows/guard-main.yml`). |
| 6 | +**Auteur :** Mathilde Deuscher |
9 | 7 |
|
10 | | -Le contenu complet du projet est importé via la première PR `dev -> main`. |
| 8 | +--- |
| 9 | + |
| 10 | +## Cinq façons de récupérer du trafic depuis un switch |
| 11 | + |
| 12 | +switch-capture ne mise pas sur une seule méthode de capture : selon le |
| 13 | +contexte (diagnostic ponctuel, débit élevé, comparaison de plusieurs points |
| 14 | +d'observation, filtrage fin par ACL, collecteur joignable seulement en |
| 15 | +IP routé), l'une ou l'autre est la bonne réponse. Le détail complet, avec |
| 16 | +les procédures manuelles équivalentes sur Cisco et d'autres |
| 17 | +constructeurs, est dans |
| 18 | +[`src/docs/CAPTURE-METHODS.md`](src/docs/CAPTURE-METHODS.md). |
| 19 | + |
| 20 | +### 1. `packet-capture` local — fichiers rapatriés en direct |
| 21 | + |
| 22 | +Le switch écrit la capture en ring-buffer sur sa propre flash ; switch- |
| 23 | +capture rapatrie chaque fichier clôturé par SCP et le réinjecte en direct : |
| 24 | + |
| 25 | +- **`--output-mode fifo`** (par défaut) : un named pipe + une instance |
| 26 | + Wireshark lancée automatiquement. Simple, une capture à la fois. |
| 27 | +- **`--output-mode tap`** : réinjection dans une interface réseau virtuelle |
| 28 | + (TAP) dédiée. Plusieurs captures simultanées (une interface par switch/ |
| 29 | + point de capture) observables **dans une seule instance Wireshark**. |
| 30 | + |
| 31 | +```bash |
| 32 | +switch-capture capture --switch-ip 10.0.0.1 --ssh-user mathilde \ |
| 33 | + --capture-interface GigabitEthernet1/0/1 |
| 34 | +``` |
| 35 | + |
| 36 | +### 2. `packet-capture remote` — RPCAP natif Comware |
| 37 | + |
| 38 | +Certains modèles/versions Comware peuvent exposer le switch directement |
| 39 | +comme un **serveur RPCAP** : Wireshark s'y connecte en réseau |
| 40 | +(`rpcap://switch-ip:port/interface`), sans fichier ni FIFO/TAP local. |
| 41 | +Le plus simple des cinq méthodes quand il est disponible — **la |
| 42 | +disponibilité n'est pas garantie sur tous les modèles**, switch-capture le |
| 43 | +signale clairement si la commande n'existe pas sur votre plateforme. |
| 44 | + |
| 45 | +```bash |
| 46 | +switch-capture capture --switch-ip 10.0.0.1 --ssh-user mathilde \ |
| 47 | + --capture-interface GigabitEthernet1/0/1 --output-mode rpcap |
| 48 | +``` |
| 49 | + |
| 50 | +### 3. Port mirroring (SPAN local / ERSPAN+GRE distant) |
| 51 | + |
| 52 | +Copie le trafic au niveau du plan de données (ASIC), **avant** tout |
| 53 | +traitement CPU — débit ligne, sans les limites des deux méthodes |
| 54 | +précédentes. switch-capture pousse la configuration ; la capture se fait |
| 55 | +côté collecteur (Wireshark/tcpdump), externe à l'outil. |
| 56 | + |
| 57 | +```bash |
| 58 | +# SPAN local (câble direct vers l'hôte de capture) |
| 59 | +switch-capture mirror --switch-ip 10.0.0.1 --ssh-user mathilde \ |
| 60 | + --mode local --source-interface GigabitEthernet1/0/1 \ |
| 61 | + --monitor-interface GigabitEthernet1/0/24 |
| 62 | + |
| 63 | +# ERSPAN/GRE distant (routé, pas de câble direct requis) |
| 64 | +switch-capture mirror --switch-ip 10.0.0.1 --ssh-user mathilde \ |
| 65 | + --mode gre --source-interface GigabitEthernet1/0/1 \ |
| 66 | + --tunnel-local-ip 10.0.0.1 --tunnel-ip 192.168.100.1 --remote-ip 203.0.113.10 |
| 67 | +``` |
| 68 | + |
| 69 | +### 4. Flow mirroring filtré par ACL — `switch-capture mirror --filter-mode acl` |
| 70 | + |
| 71 | +Variante du mirroring de port ci-dessus : au lieu de dupliquer *tout* le |
| 72 | +trafic d'un port, ne duplique que les paquets qui correspondent à une |
| 73 | +ACL avancée, via une politique QoS (`traffic classifier` + `traffic |
| 74 | +behavior` + `qos policy`) — toujours au débit ligne, au niveau de |
| 75 | +l'ASIC. Utile pour isoler un hôte ou un protocole précis sans mirrorer |
| 76 | +tout un port chargé de trafic non pertinent. Pilotable en CLI comme en |
| 77 | +GUI (bloc « Port mirroring », menu déroulant « Mode de filtrage »). |
| 78 | + |
| 79 | +```bash |
| 80 | +switch-capture mirror --switch-ip 10.0.0.1 --ssh-user mathilde \ |
| 81 | + --filter-mode acl --acl-number 3000 \ |
| 82 | + --acl-rule "rule 0 permit ip source 10.0.0.5 0" \ |
| 83 | + --source-interface GigabitEthernet1/0/1 --monitor-interface GigabitEthernet1/0/24 |
| 84 | +``` |
| 85 | + |
| 86 | +### 5. Mirroring vers VLAN sonde + VXLAN L2 — `switch-capture mirror --mode vxlan` ⚠️ expérimental |
| 87 | + |
| 88 | +**Non vérifié contre la doc H3C officielle ni contre un switch réel dans |
| 89 | +ce dépôt** — implémenté sur demande explicite d'un utilisateur, qui en |
| 90 | +atteste le fonctionnement sur un 5520 HI. À valider vous-même avant tout |
| 91 | +déploiement en production ; voir |
| 92 | +[`src/docs/CAPTURE-METHODS.md`](src/docs/CAPTURE-METHODS.md) section 5 |
| 93 | +pour le détail complet des réserves. Utile quand le collecteur n'est |
| 94 | +joignable qu'en IP routé (pas d'adjacence L2 possible pour trunker un |
| 95 | +VLAN sonde classique) : le VLAN mirroré est raccordé à une VSI VXLAN qui |
| 96 | +l'achemine par-dessus le réseau routé. CLI uniquement, GUI pas encore |
| 97 | +câblée. |
| 98 | + |
| 99 | +```bash |
| 100 | +switch-capture mirror --switch-ip 10.0.0.1 --ssh-user mathilde \ |
| 101 | + --mode vxlan --group-id 10 --source-interface GigabitEthernet1/0/1 \ |
| 102 | + --remote-probe-vlan 666 --vsi-name mirror --vxlan-vni 666 \ |
| 103 | + --tunnel-id 0 --tunnel-local-ip 10.0.0.1 --remote-ip 203.0.113.10 \ |
| 104 | + --reflector-interface GigabitEthernet1/0/24 |
| 105 | +``` |
| 106 | + |
| 107 | +Côté collecteur, une interface VXLAN doit être créée manuellement |
| 108 | +(`ip link add ... type vxlan`, hors du périmètre de cet outil) — voir |
| 109 | +CAPTURE-METHODS.md pour la commande complète. |
| 110 | + |
| 111 | +### Comparer plusieurs points de capture (client / routeur / serveur) |
| 112 | + |
| 113 | +Pour que des traces prises à différents points du réseau soient |
| 114 | +comparables entre elles, les horloges des switches doivent être |
| 115 | +synchronisées — switch-capture vérifie et configure NTP automatiquement |
| 116 | +(`--ntp-server`) et écrit un sidecar `capture-meta.json` (étiquette du |
| 117 | +point de capture, statut NTP, filtre utilisé...) à côté de chaque capture, |
| 118 | +pour qu'un outil tiers de comparaison de traces (hors périmètre de ce |
| 119 | +projet) puisse s'y raccrocher. |
| 120 | + |
| 121 | +--- |
| 122 | + |
| 123 | +## Installation |
| 124 | + |
| 125 | +Trois méthodes équivalentes, au choix : |
| 126 | + |
| 127 | +| Méthode | Commande | |
| 128 | +|---|---| |
| 129 | +| **Script direct** (Ubuntu/Debian/Rocky/RHEL/CentOS 8-9) | `sudo ./install.sh` | |
| 130 | +| **Paquet `.deb`** (Debian/Ubuntu) | `./packaging/build_deb.sh` puis `sudo apt install ./packaging/switch-capture_1.0.0_all.deb` | |
| 131 | +| **Paquet `.rpm`** (Rocky/RHEL/CentOS Stream 8/9) | `./packaging-rpm/build_rpm.sh` puis `sudo dnf install ./packaging-rpm/RPMS/noarch/*.rpm` | |
| 132 | + |
| 133 | +Détail complet des prérequis (paquets système, GTK4 optionnel, différences |
| 134 | +el8/el9) dans `src/docs/INSTALL.md` (script direct), `packaging/INSTALL-deb.md` |
| 135 | +et `packaging-rpm/INSTALL-rpm.md`. |
| 136 | + |
| 137 | +Une fois installé : |
| 138 | + |
| 139 | +```bash |
| 140 | +switch-capture --help |
| 141 | +switch-capture # ouvre la GUI si GTK4 est disponible, sinon l'aide CLI |
| 142 | +switch-capture -c capture --help |
| 143 | +switch-capture -g # force la GUI |
| 144 | +``` |
| 145 | + |
| 146 | +## Interface graphique |
| 147 | + |
| 148 | +`switch-capture` (sans argument) ouvre une fenêtre GTK4 pensée pour piloter |
| 149 | +**plusieurs captures à la fois** (comparaison client/routeur/serveur), |
| 150 | +organisée en 5 pages : **Configuration** (liste des captures + formulaire |
| 151 | +d'ajout, avec champs qui s'adaptent au mode choisi), **Installation** |
| 152 | +(prépare toutes les captures — préalable obligatoire), **Démarrage** |
| 153 | +(disponible une fois toutes les captures installées), **Journal** (statut, |
| 154 | +progression, logs en direct, arrêt global) et **Résultats** (fichiers |
| 155 | +produits par capture). Le menu ☰ en haut à gauche ouvre les |
| 156 | +**Préférences** (slot/modèle/`.bin` forcé, repli KeePass — persistées |
| 157 | +dans `config.yaml`, voir USAGE.md) ou quitte l'application. La bascule |
| 158 | +CLI/GUI est automatique : si les arguments fournis suffisent à lancer une |
| 159 | +capture, tout se passe en ligne de commande, sans jamais ouvrir de |
| 160 | +fenêtre — pratique pour un usage cron/systemd même sur une machine qui a |
| 161 | +aussi un environnement graphique. `-c` force la CLI, `-g` force la GUI. |
| 162 | + |
| 163 | +## Structure du dépôt |
| 164 | + |
| 165 | +``` |
| 166 | +switch-capture/ |
| 167 | +├── install.sh # installation directe (sans .deb/.rpm) |
| 168 | +├── pyproject.toml # dépendances (uv) + config ruff/pytest/coverage — pour un venv manuel (`uv sync`, voir CLAUDE.md) |
| 169 | +├── src/ # code source + documentation |
| 170 | +│ ├── switch-capture # point d'entrée unique (CLI + GTK4) |
| 171 | +│ ├── switch_capture_core.py # logique métier (capture, SCP, TAP, NTP, mirroring...) |
| 172 | +│ ├── switch_capture_cli.py # sous-commandes CLI |
| 173 | +│ ├── switch_capture_gtk.py # interface graphique GTK4 |
| 174 | +│ └── docs/ |
| 175 | +│ ├── INSTALL.md # installation via install.sh |
| 176 | +│ ├── USAGE.md # référence complète CLI + GUI |
| 177 | +│ ├── CAPTURE-METHODS.md # comparaison des 5 méthodes de capture, procédures manuelles |
| 178 | +│ ├── README-feature-bin.md |
| 179 | +│ └── config.yaml.example |
| 180 | +├── feature-bin/ # (optionnel, à créer soi-même, non versionné) dépôt local de .bin HPE |
| 181 | +├── packaging/ # paquet .deb |
| 182 | +│ ├── build_deb.sh |
| 183 | +│ ├── INSTALL-deb.md |
| 184 | +│ └── debian/DEBIAN/ # métadonnées du paquet (control, postinst, postrm) |
| 185 | +└── packaging-rpm/ # paquet .rpm |
| 186 | + ├── build_rpm.sh |
| 187 | + ├── INSTALL-rpm.md |
| 188 | + └── switch-capture.spec |
| 189 | +``` |
| 190 | + |
| 191 | +`src/` est la source unique du code et de la documentation partagée : les |
| 192 | +trois méthodes d'installation (`install.sh`, `build_deb.sh`, `build_rpm.sh`) |
| 193 | +la lisent de la même façon et construisent l'arborescence finale au moment |
| 194 | +de l'installation/du build, plutôt que de la dupliquer. Voir |
| 195 | +`docs/architecture.md` pour le détail de l'architecture, les choix |
| 196 | +techniques, et les pièges déjà rencontrés et corrigés. |
| 197 | + |
| 198 | +## Dépendances système |
| 199 | + |
| 200 | +Toutes installées automatiquement par `install.sh`/les paquets : Python |
| 201 | +≥ 3.8, `netmiko`/`loguru`/`paramiko`/`scp` (paquets système en priorité, |
| 202 | +repli `pip` si absents des dépôts), `wireshark`, `iproute2`/`iproute` |
| 203 | +(pour le mode TAP). `sshfs`/`fuse-sshfs` et GTK4/PyGObject sont |
| 204 | +recommandés mais optionnels (mode `sshfs` legacy, GUI). Détail par |
| 205 | +distribution dans les docs d'installation citées plus haut. |
| 206 | + |
| 207 | +## Sécurité |
| 208 | + |
| 209 | +- Le compte switch est un compte RADIUS existant : aucun utilisateur local |
| 210 | + n'est créé. Le mot de passe n'est jamais écrit sur disque (variable |
| 211 | + d'environnement `SWITCH_SSH_PASSWORD` recommandée plutôt que |
| 212 | + `--ssh-password` en clair). |
| 213 | +- Le mode TAP nécessite root/CAP_NET_ADMIN — à réserver à un compte de |
| 214 | + service dédié. |
| 215 | +- Voir `docs/architecture.md`, section « Sécurité / bonnes pratiques », pour |
| 216 | + le détail. |
| 217 | + |
| 218 | +## État du projet |
| 219 | + |
| 220 | +[`CLAUDE.md`](CLAUDE.md) donne l'état courant en un coup d'œil ; |
| 221 | +[`docs/features-backlog.md`](docs/features-backlog.md) tient à jour |
| 222 | +l'inventaire de ce qui est réellement fait et testé, et de ce qui reste à |
| 223 | +faire — à consulter avant de démarrer une nouvelle session de travail sur |
| 224 | +ce dépôt. Détail session par session : [`docs/sessions/`](docs/sessions/index.md). |
| 225 | + |
| 226 | +## Licence |
| 227 | + |
| 228 | +À définir — un fichier `LICENSE` placeholder (MIT) est inclus dans ce |
| 229 | +dépôt en attendant un choix définitif. |
0 commit comments