# Tests VM — eBPF sur kernel réel (Rocky Linux 9)

## Pourquoi une VM ?

Les tests Docker ne peuvent capturer que L3/L4 et TLS (via le hook TC). Les données
L7 HTTP (method, path, status_code, header_order_signature) nécessitent :

| Fonctionnalité eBPF | Docker | VM |
|---|---|---|
| Hook TC (XDP) — L3/L4 + TLS | ✅ | ✅ |
| Uprobe SSL_read — L7 HTTP | ✅ attache | ✅ attache |
| Tracepoint accept4 — corrélation IP | ❌ pas de tracefs | ✅ |
| Kprobe accept4 — corrélation IP | ❌ pas de perf PMU | ✅ |

Dans une VM, le kernel complet est disponible → **accept4 fonctionne** →
la corrélation IP est parfaite → les données L7 arrivent dans ClickHouse.

## Prérequis (installation unique)

```bash
# 1. Installer Vagrant + libvirt + KVM
sudo apt-get install -y vagrant libvirt-daemon-system libvirt-clients \
                        qemu-kvm ruby-libvirt bridge-utils

# 2. Plugin vagrant-libvirt
vagrant plugin install vagrant-libvirt

# 3. Ajouter ton user aux groupes (nécessite une reconnexion)
sudo usermod -aG libvirt,kvm $USER
# → Se déconnecter et se reconnecter

# 4. Vérifier que KVM fonctionne
virsh list --all
```

## Utilisation

```bash
# Depuis la racine du projet :

# Créer la VM (première fois, ~5-10 min — télécharge Rocky Linux 9)
make vm-up

# Lancer le test nginx complet (L3/L4 + TLS + L7 HTTP)
make test-vm-nginx

# Après modification des sources Go/C
make vm-rebuild-ja4ebpf   # synchronise + recompile dans la VM
make test-vm-nginx         # relancer les tests

# Connexion SSH interactive
make vm-ssh

# Détruire la VM (libère l'espace disque)
make vm-down
```

## Ce que teste `test-vm-nginx`

1. **Build** — recompile ja4ebpf (BPF CO-RE + Go) depuis les sources
2. **ClickHouse** — démarre dans Docker (dans la VM)
3. **nginx** — démarre avec TLS + HTTP/2
4. **ja4ebpf** — démarre avec uprobes + accept4 tracepoints
5. **Trafic** — HTTP/1.0, HTTP/1.1, HTTPS/1.1, HTTPS/2.0
6. **Vérification DB** :
   - `ip_meta_ttl`, `tcp_meta_mss`, `tcp_meta_window_size` ✅
   - `ja4`, `tls_sni` ✅
   - **`method`, `path`, `status_code`** ✅ (uniquement en VM)
   - **`header_order_signature`** ✅ (uniquement en VM)

## Différence avec les tests Docker

| Check | Docker | VM |
|---|---|---|
| L3/L4 (TTL, MSS, window) | ✅ | ✅ |
| TLS fingerprint (JA4, SNI) | ✅ | ✅ |
| L7 méthode HTTP | ❌ | ✅ |
| L7 path HTTP | ❌ | ✅ |
| status_code | ❌ | ✅ |
| header_order_signature | ❌ | ✅ |

## Architecture de la VM

```
VM Rocky Linux 9 (KVM)
├── nginx + libssl.so.3   ← serveur web cible
├── ja4ebpf               ← agent eBPF (natif, pas Docker)
│   ├── TC hook (eth0)    ← capture L3/L4 + TLS ClientHello
│   ├── Uprobe SSL_read   ← capture HTTP déchiffré
│   └── Tracepoint accept4 ← corrélation fd→IP (disponible !)
└── ClickHouse (Docker)   ← base de données
```

## Dépannage

**vagrant up échoue : "Call to virConnectOpen failed"**
```bash
sudo systemctl start libvirtd
sudo usermod -aG libvirt $USER  # puis se reconnecter
```

**Erreur "default pool not found"**
```bash
sudo virsh pool-define-as default dir --target /var/lib/libvirt/images
sudo virsh pool-build default
sudo virsh pool-start default
sudo virsh pool-autostart default
```

**ja4ebpf : "uprobe SSL_read" ne s'attache pas**
```bash
# Vérifier le chemin libssl dans la VM
vagrant ssh -- 'ls -la /usr/lib64/libssl*'
# Si différent de /usr/lib64/libssl.so.3, modifier /tmp/ja4ebpf.yml
```
