#35 — WireGuard VPN Inter-sites
PLANIFIÉ
Priorité: 🔵 MOYENNE · Type: TYPE F · Conteneur: rgz-wireguard · Code: config/wireguard/Dépendances: #7 rgz-gateway
Description
Tunnel VPN chiffré WireGuard reliant l'infrastructure NOC centralisée (Bénin) aux sites revendeurs distants. Port 51820/udp. Adressage VPN: 10.200.0.0/24 avec 10.200.0.1 (NOC) et 10.200.0.[2-254] (sites revendeurs). Le tunnel permet au NOC d'accéder directement aux CPE, serveurs de monitoring et d'effectuer des opérations de maintenance sur les revendeurs sans passer par l'Internet public.
Chaque site revendeur reçoit sa propre paire de clés WireGuard. Le NOC maintient une configuration centralisée avec la clé publique de chaque site. Le tunnel fonctionne en topologie "hub and spoke" où tous les sites convergent vers le NOC. Les routes par-dessus le tunnel incluent : accès aux CPE (subnets VLAN 10.100-499.0.0/24), accès au Prometheus interne (9090), et accès aux bases de données (5432 PostgreSQL).
Les clés sont régénérées annuellement via Celery task. Un keepalive est configuré pour maintenir le tunnel actif même sans trafic.
Architecture Interne
1. Topologie:
Internet (public):
├─ NOC: wg0 ip 10.200.0.1
├─ Site A: wg0 ip 10.200.0.2 (peer)
├─ Site B: wg0 ip 10.200.0.3 (peer)
└─ Site C: wg0 ip 10.200.0.4 (peer)
Trafic VPN (encapsulé UDP 51820):
└─ NOC ↔ Site A: 10.200.0.1 ↔ 10.200.0.2
└─ NOC ↔ Site B: 10.200.0.1 ↔ 10.200.0.3
└─ NOC ↔ Site C: 10.200.0.1 ↔ 10.200.0.4
└─ Site A ↔ Site B: VIA NOC (inter-site non-direct)
2. Routes via tunnel (à partir de chaque site):
├─ 10.100-499.0.0/16 via 10.200.0.1 (VLAN sites revendeurs)
├─ 10.0.0.0/24 via 10.200.0.1 (services NOC: DNS, monitoring)
└─ 5432, 9090, 3000 via tunnel
3. Chiffrement:
└─ Elliptic Curve Diffie-Hellman (ECDH) via Curve25519
└─ ChaCha20 + Poly1305 AEAD
└─ Rekey every 2 minutes (automatic)
└─ Forward secrecy: old keys oubliés après rekey
4. Génération clés (une fois par site):
└─> wg genkey | tee privatekey | wg pubkey > publickey
└─> Clés stockées dans secrets manager ou env var
└─> Rotation annuelle via Celery task #50
5. Configuration NOC (hub):
└─> /config/wireguard/wg0.conf:
[Interface]
Address = 10.200.0.1/24
PrivateKey = [NOC_PRIVATE_KEY]
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT
[Peer] # Site A
PublicKey = [SITE_A_PUBLIC_KEY]
AllowedIPs = 10.200.0.2/32, 10.150.0.0/24 (VLAN Site A)
PersistentKeepalive = 25
[Peer] # Site B
PublicKey = [SITE_B_PUBLIC_KEY]
AllowedIPs = 10.200.0.3/32, 10.160.0.0/24 (VLAN Site B)
PersistentKeepalive = 25
6. Configuration site revendeur (spoke):
└─> /config/wireguard/wg0.conf:
[Interface]
Address = 10.200.0.2/24
PrivateKey = [SITE_A_PRIVATE_KEY]
DNS = 10.0.0.9
[Peer] # NOC
PublicKey = [NOC_PUBLIC_KEY]
AllowedIPs = 10.0.0.0/24, 10.200.0.0/24
Endpoint = noc-rgz.duckdns.org:51820 (DNS ou IP fixe)
PersistentKeepalive = 25
7. Up/Down:
└─> systemctl enable wg-quick@wg0
└─> systemctl start wg-quick@wg0
└─> wg show (vérifier status)Configuration
Variables d'environnement
WIREGUARD_PRIVATE_KEY=... # NOC private key (base64)
WIREGUARD_PEER_COUNT=5 # Nombre de sites
WIREGUARD_LISTEN_PORT=51820 # Port UDP
WIREGUARD_INTERFACE_IP=10.200.0.1 # NOC IP sur tunnel
WIREGUARD_KEEPALIVE_INTERVAL=25 # secondes
WIREGUARD_KEY_ROTATION_DAYS=365 # Rotation annuelle
NOC_PUBLIC_HOSTNAME=noc-rgz.duckdns.org # Pour endpoints clientsFormat config WireGuard (NOC)
# /config/wireguard/wg0.conf (NOC - hub)
[Interface]
Address = 10.200.0.1/24
ListenPort = 51820
PrivateKey = [NOC_PRIVATE_KEY]
# Optional: DNS server for clients
DNS = 10.0.0.9
# Networking: allow WireGuard interface in firewall
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Peer 1: Site A (Tech Connect, VLAN 150)
[Peer]
PublicKey = [SITE_A_PUBLIC_KEY]
AllowedIPs = 10.200.0.2/32, 10.150.0.0/24
PersistentKeepalive = 25
# Peer 2: Site B (Network Plus, VLAN 160)
[Peer]
PublicKey = [SITE_B_PUBLIC_KEY]
AllowedIPs = 10.200.0.3/32, 10.160.0.0/24
PersistentKeepalive = 25
# Peer 3: Site C
[Peer]
PublicKey = [SITE_C_PUBLIC_KEY]
AllowedIPs = 10.200.0.4/32, 10.170.0.0/24
PersistentKeepalive = 25
# Peer 4: Site D
[Peer]
PublicKey = [SITE_D_PUBLIC_KEY]
AllowedIPs = 10.200.0.5/32, 10.180.0.0/24
PersistentKeepalive = 25
# Peer 5: Site E
[Peer]
PublicKey = [SITE_E_PUBLIC_KEY]
AllowedIPs = 10.200.0.6/32, 10.190.0.0/24
PersistentKeepalive = 25Format config WireGuard (Site revendeur)
# /etc/wireguard/wg0.conf (Site A - spoke)
[Interface]
Address = 10.200.0.2/24
PrivateKey = [SITE_A_PRIVATE_KEY]
ListenPort = 51820
# Optional DNS
DNS = 10.0.0.9
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Peer: NOC (hub)
[Peer]
PublicKey = [NOC_PUBLIC_KEY]
AllowedIPs = 10.0.0.0/24, 10.200.0.1/32, 0.0.0.0/0 # Entire NOC subnet + all other sites via NOC
Endpoint = noc-rgz.duckdns.org:51820
PersistentKeepalive = 25Endpoints API (indirects)
| Méthode | Route | Réponse | Auth |
|---|---|---|---|
| GET | /api/v1/vpn/status | 200 {peers: [...], uptime, rx_bytes, tx_bytes} | Admin |
| GET | /api/v1/vpn/peers | 200 {items: [{peer_id, ip, last_handshake, ...}], total} | Admin |
| POST | /api/v1/vpn/peers/regenerate | 202 {job_id} | Admin |
Commandes Utiles
# Générer paire de clés
wg genkey | tee privatekey | wg pubkey > publickey
# Voir status du tunnel (NOC)
wg show wg0
# Voir détail peers
ip link show wg0
ip addr show wg0
# Activer l'interface WireGuard
ip link add dev wg0 type wireguard
ip address add 10.200.0.1/24 dev wg0
wg set wg0 listen-port 51820 private-key <(cat privatekey)
wg set wg0 peer [SITE_A_PUBLIC_KEY] allowed-ips 10.200.0.2/32,10.150.0.0/24
ip link set wg0 up
# Ou via wg-quick (plus simple)
wg-quick up wg0
wg-quick down wg0
# Tester connectivité tunnel
ping 10.200.0.2 (du NOC vers Site A)
ping 10.200.0.1 (du Site A vers NOC)
# Vérifier handshake (doit être recent)
wg show wg0 latest-handshakes
# Voir statistiques trafic
wg show wg0 transfer
# Recharger config sans interruption
wg syncconf wg0 <(wg-quick strip wg0)
# Systemd service (persistent)
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0
# Logs (sur systèmes avec journalctl)
journalctl -u wg-quick@wg0 -fImplémentation TODO
- [ ] Génération clés WireGuard pour NOC et 5+ sites
- [ ] Configuration /config/wireguard/wg0.conf (hub NOC)
- [ ] Distribution clés vers sites via CI/CD ou enrollment manual
- [ ] Script Python pour monitoring tunnel (wg show → metrics)
- [ ] Intégration Prometheus: expose WireGuard metrics
- [ ] Celery task: rotation clés annuelle (#50)
- [ ] Health check tunnel: ping 10.200.0.1 depuis chaque site
- [ ] Tests: connectivité inter-site, trafic encapsulé UDP 51820
- [ ] Documentation: provisioning nouveau site WireGuard
- [ ] Monitoring alertes: handshake >2min, latence >100ms
- [ ] Backup config WireGuard dans #77 config-backup
Dernière mise à jour: 2026-02-21