Files
script-bash/vpn_watchdog.sh
2026-05-19 12:23:16 +00:00

68 lines
2.4 KiB
Bash

#!/bin/bash
# ============================================================
# VPN WATCHDOG — WireGuard
# Vérifie que le trafic sort bien par wg0
# Si fuite détectée : redémarre WireGuard
# ============================================================
WG_INTERFACE="wg0"
LOG_FILE="/var/log/vpn_watchdog.log"
MAX_HANDSHAKE_AGE=180 # secondes
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# ============================================================
# ÉTAPE 1 : Vérifier que l'interface wg0 existe
# ============================================================
if ! wg show "$WG_INTERFACE" &>/dev/null; then
log "ALERTE : Interface $WG_INTERFACE absente. Tentative de démarrage..."
systemctl restart wg-quick@$WG_INTERFACE.service
sleep 10
if ! wg show "$WG_INTERFACE" &>/dev/null; then
log "ECHEC : Impossible de démarrer $WG_INTERFACE. Intervention manuelle requise."
exit 1
fi
log "OK : $WG_INTERFACE démarré."
fi
# ============================================================
# ÉTAPE 2 : Vérifier l'âge du dernier handshake
# ============================================================
LAST_HANDSHAKE=$(wg show "$WG_INTERFACE" latest-handshakes | awk '{print $2}')
NOW=$(date +%s)
DIFF=$((NOW - LAST_HANDSHAKE))
if [[ $DIFF -gt $MAX_HANDSHAKE_AGE ]]; then
log "ALERTE : Handshake trop ancien (${DIFF}s). Redémarrage de WireGuard..."
systemctl restart wg-quick@$WG_INTERFACE.service
sleep 10
fi
# ============================================================
# ÉTAPE 3 : Vérifier que le trafic sort bien par wg0
# ============================================================
ROUTE_DEV=$(ip route get 8.8.8.8 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}')
if [[ "$ROUTE_DEV" != "$WG_INTERFACE" ]]; then
log "ALERTE : Fuite détectée — trafic sur '$ROUTE_DEV' au lieu de '$WG_INTERFACE'. Redémarrage..."
systemctl restart wg-quick@$WG_INTERFACE.service
sleep 10
# Revérifier après redémarrage
ROUTE_DEV_AFTER=$(ip route get 8.8.8.8 2>/dev/null | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}')
if [[ "$ROUTE_DEV_AFTER" == "$WG_INTERFACE" ]]; then
log "OK : Trafic rétabli sur $WG_INTERFACE après redémarrage."
else
log "ECHEC : Trafic toujours sur '$ROUTE_DEV_AFTER'. Intervention manuelle requise."
exit 1
fi
else
log "OK : Trafic sur $WG_INTERFACE — VPN actif."
fi
exit 0