Wenn der Windows Rechner aus dem Ruhezustand kommt oder sich während des Tages die IP der Gegenstelle eines Tunnels ändert merkt Wireguard nicht, dass der Tunnel nicht mehr funktioniert. In der GUI werden alle aktivierten Tunnel weiterhin „grün“ angezeigt. Nur ein Blick auf den letzten Schlüsseltausch zeigt einem, dass der Tunnel tot ist.
Ich habe ein Powershell Skript geschrieben, das über die Aufgabenplanung aufgerufen werden kann und testet ob über den Tunnel tatsächlich Daten fließen.
Dieses Skript kann über die Aufgabenplanung nach einem „Aufwachen“ aus dem Ruhezustand oder Energiesparmodus aber auch regelmäßig alle x Minuten aufgerufen werden und prüft ob die Tunnel noch „leben“. Wenn Sie nicht mehr leben dann startet es die Tunnel neu, so dass wieder Daten fließen können.
$Interfaces = wg show interfaces
$InterfaceList = $Interfaces -split '\s+' | Where-Object { $_ -ne "" }
foreach ($Interface in $InterfaceList) {
Write-Host "`n--- Intelligenter Check: ${Interface} ---" -ForegroundColor Cyan
# 1. Ziel-IP aus den AllowedIPs extrahieren
$allowedIPsRaw = wg show $Interface allowed-ips
# Wir nehmen den ersten Block, der wie eine IP aussieht (z.B. 192.168.1.0/24)
if ($allowedIPsRaw -match "(\d{1,3}\.\d{1,3}\.\d{1,3}\.)0/\d+") {
$targetIP = $Matches[1] + "1"
Write-Host " Erkanntes Ziel im Subnetz: $targetIP" -ForegroundColor Gray
} else {
$targetIP = "8.8.8.8" # Fallback falls kein Subnetz gefunden wird
Write-Host " Kein Subnetz erkannt, nutze Fallback: $targetIP" -ForegroundColor Gray
}
# 2. Datenstand VORHER holen
$transferData1 = wg show $Interface transfer
$bytesBefore = 0
foreach ($line in $transferData1) {
$parts = $line -split '\s+' | Where-Object { $_ -ne "" }
if ($parts.Count -ge 2) { $bytesBefore += [int64]$parts[1] }
}
# 3. Datenverkehr PROVOZIEREN (Ping auf das Subnetz-Ziel)
Write-Host " Sende Test-Ping an $targetIP..." -ForegroundColor Gray
$null = Test-Connection -ComputerName $targetIP -Count 2 -Quiet -ErrorAction SilentlyContinue
Start-Sleep -Seconds 1
# 4. Datenstand NACHHER holen
$transferData2 = wg show $Interface transfer
$bytesAfter = 0
foreach ($line in $transferData2) {
$parts = $line -split '\s+' | Where-Object { $_ -ne "" }
if ($parts.Count -ge 2) { $bytesAfter += [int64]$parts[1] }
}
Write-Host " Traffic-Anstieg: $($bytesAfter - $bytesBefore) Bytes"
# 5. URTEIL
$NeedsRestart = $false
if ($bytesAfter -gt $bytesBefore) {
Write-Host " -> URTEIL: Tunnel lebt (Traffic via VPN erkannt)." -ForegroundColor Green
} else {
# Check ob Internet generell da ist (via öffentlichem DNS)
if (Test-Connection -ComputerName 1.1.1.1 -Count 1 -Quiet -ErrorAction SilentlyContinue) {
Write-Host " -> URTEIL: Internet ok, aber VPN-Ziel $targetIP antwortet nicht. RESTART." -ForegroundColor Yellow
$NeedsRestart = $true
} else {
Write-Host " -> URTEIL: Kein Internet. Reset abgebrochen." -ForegroundColor Gray
}
}
if ($NeedsRestart) {
Write-Host " -> AKTION: Reset für ${Interface}..." -ForegroundColor Red
Clear-DnsClientCache
$Service = Get-Service | Where-Object { $_.Name -like "*$Interface*" -and $_.Name -like "WireGuard*" }
if ($Service) {
Stop-Service $Service.Name -Force
Start-Sleep -Seconds 2
Start-Service $Service.Name
Get-Process WireGuard -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Process "C:\Program Files\WireGuard\wireguard.exe"
Write-Host " Dienst und GUI neu gestartet." -ForegroundColor Green
}
}
}
Um dies nun über die Aufgabenplanung im Hintergrund laufen zu lassen musst Du in der Aufgabenplanung eine neue Aufgabe erstellen: Wichtig ist als Benutzerkonto SYSTEM zu wählen.

Unter Trigger: Einen Trigger für das Aufwachen aus dem PowerSafe

Ein Zweiter Trigger, der tagsüber regelmäßig guckt, falls sich die IP des Zielhosts geändert hat:

Nun noch unter Aktion das Skript angeben:

Jetzt sollten alle aktivierten Tunnel immer auch verfügbar sein, solange sie tatsächlich auch funktionieren können…. 😉
