3.2 KiB
VPN Watchdog — WireGuard
Script de surveillance automatique du tunnel WireGuard. Détecte toute fuite ou déconnexion VPN et relance l'interface sans intervention manuelle.
Objectif
Garantir qu'une machine ne tourne jamais sans VPN actif.
Cas couverts :
- Interface
wg0absente ou non démarrée - Tunnel mort (handshake trop ancien)
- Trafic réseau qui sort hors du tunnel WireGuard (fuite)
Compatibilité
| Critère | Requis |
|---|---|
| OS | Linux (testé sur Ubuntu 24.04) |
| Systemd | Oui — obligatoire |
| WireGuard | wg-quick + interface configurée |
| Shell | Bash |
Dépendances
| Outil | Usage | Paquet |
|---|---|---|
wg |
Lecture état WireGuard | wireguard-tools |
ip |
Vérification routage | iproute2 (inclus par défaut) |
systemctl |
Redémarrage du service | systemd |
awk |
Parsing des sorties | gawk (inclus par défaut) |
Installation si manquant :
apt install wireguard-tools iproute2
Fonctionnement
Le script s'exécute en 3 étapes séquentielles :
Étape 1 — Présence de l'interface
Vérifie que wg0 est active via wg show.
Si absente : tente un systemctl restart wg-quick@wg0.service.
Si le redémarrage échoue : log l'erreur et quitte.
Étape 2 — Âge du handshake
Récupère le timestamp du dernier handshake WireGuard.
Si supérieur à 180 secondes : le tunnel est considéré mort, WireGuard est redémarré.
Étape 3 — Vérification du routage
Exécute ip route get 8.8.8.8 et vérifie que l'interface de sortie est bien wg0.
Si le trafic sort par une autre interface (fuite) : redémarre WireGuard et vérifie le résultat.
Si le trafic sort toujours hors VPN après redémarrage : log l'erreur et quitte avec code 1.
Installation
1. Copier le script
cp vpn_watchdog.sh /usr/local/bin/vpn_watchdog.sh
2. Rendre exécutable
chmod +x /usr/local/bin/vpn_watchdog.sh
3. Créer la tâche cron (toutes les minutes)
crontab -e
Ajouter :
* * * * * /usr/local/bin/vpn_watchdog.sh
Logs
Les événements sont enregistrés dans :
/var/log/vpn_watchdog.log
Exemple de sortie :
[2025-05-19 14:00:01] OK : Trafic sur wg0 — VPN actif.
[2025-05-19 14:01:01] ALERTE : Fuite détectée — trafic sur 'ens18' au lieu de 'wg0'. Redémarrage...
[2025-05-19 14:01:12] OK : Trafic rétabli sur wg0 après redémarrage.
Configuration
Variables modifiables en tête de script :
| Variable | Défaut | Description |
|---|---|---|
WG_INTERFACE |
wg0 |
Nom de l'interface WireGuard |
LOG_FILE |
/var/log/vpn_watchdog.log |
Chemin du fichier de log |
MAX_HANDSHAKE_AGE |
180 |
Seuil en secondes avant de considérer le tunnel mort |
Limitations connues
- Si le réseau physique est indisponible au moment de l'exécution du cron, WireGuard ne peut pas monter — le script échouera et réessaiera à la minute suivante.
- Le script ne bloque pas le trafic en cas de fuite détectée — il redémarre WireGuard. Une fenêtre de fuite d'une durée maximale d'une minute est possible entre deux exécutions cron.
- Nécessite les droits root pour
wg showetsystemctl restart.