Ein Hook allein holt das VPN nicht zurück
Ein Hook, der mit null endet, beweist nur, dass das Skript lief. Ordnen Sie ihn nach dem Netzwerk ein, verwenden Sie die richtige Identität und prüfen Sie, ob das Profil überhaupt geeignet ist.
Setzen Sie einen Wiederverbindungsbefehl in den Sleep-Hook, und das Problem scheint gelöst. Gelöst ist es nur, wenn der Hook läuft, nachdem das Netzwerk existiert, als eine Identität, die der Client erkennt, über einen Weg, den der Client tatsächlich implementiert. Die meisten Fehler nach dem Aufwachen sind einer dieser drei, und keiner davon erscheint als Fehler im Hook selbst. Der Hook meldet trotzdem Erfolg.
Ein Skript, das mit null endet, hat Ihnen nichts darüber gesagt, ob ein Tunnel zurückkam.
Der Hook läuft, und dann?
#!/bin/sh
case "$1" in
pre)
vpn-client disconnect
;;
post)
vpn-client connect
;;
esac
Jedes Ereignis ruft den Hook zweimal auf, vor und nach dem Übergang, und übergibt ihm die Phase und den Ereignisnamen. Er läuft als root mit minimaler Umgebung, daher sind absolute Pfade nötig, und keine Variable einer Desktop-Sitzung sollte erwartet werden. Dass beide Aufrufe schnell zurückkehren, sagt nur, dass das Skript lief. Ob das Profil danach hochkam, ist eine eigene Beobachtung und braucht ihren eigenen Beleg im Protokoll.
Behandeln Sie das Phasenargument als Teil des Entwurfs. Ein Wiederverbindungsversuch in der pre-Phase geschieht, während die Maschine alles zu verlieren droht, und er kann nicht gelingen.
Root, minimale Umgebung, falscher Benutzer
Wenn der Client sein Anmelde-Token pro Benutzer hält, bleibt dem Hook als root nichts zum Vorzeigen. Prüfen Sie den Zustand unter der Identität, die der Hook tatsächlich nutzt, nicht unter der, die Sie von einem Desktop-Terminal aus getestet haben. Manche Builds hinterlassen nach dem Trennen auch einen Daemon, der die Schnittstelle hält, sodass eine Wiederverbindung in einem veralteten Zustand landet, und das vorherige Aufräumen des Prozesses stellt ihn auf Kosten eines unsauberen Herunterfahrens wieder her. Keines der beiden Verhalten ist sichtbar, wenn Sie nur den glücklichen Pfad testen.
Schreiben Sie den Hook mit absoluten Pfaden, halten Sie ihn root-eigen und ausführbar, und protokollieren Sie, was er tat. Ohne dieses Protokoll beginnt die nächste Untersuchung bei null.
Autoconnect ist nicht der VPN-Weg
NetworkManager bietet zwei Aktivierungsmechanismen: ein Autoconnect-Flag am Profil und sekundäre Verbindungen, die starten, wenn ein primäres Profil aktiviert wird. Native Gerätetypen implementieren das erste; VPN-Plugins haben historisch nur das zweite implementiert, sodass das Setzen von Autoconnect an einem OpenVPN-Profil gar keine Wirkung haben kann. Prüfen Sie beide Eigenschaften und hängen Sie das VPN dann stattdessen als sekundäre Verbindung an das Wi-Fi- oder Ethernet-Profil.
[Unit] PartOf=NetworkManager.service Requires=NetworkManager-wait-online.service After=NetworkManager-wait-online.service
Eine WireGuard-Schnittstelle, die von einer systemd-Unit verwaltet wird, braucht diesen Drop-in statt eines Hooks, eingeordnet, nachdem das Netzwerk online ist.
Warten Sie auf das Netzwerk, mit einer Obergrenze
timer=1 while ! ping -c1 -n -w1 203.0.113.1 >/dev/null; do sleep 1; timer=$((timer+1)) [ $timer -ge 300 ] && exit 0 done nmcli connection up "work-vpn"
Beim Aufwachen kann der Tunnel verlangt werden, während Wi-Fi noch neu assoziiert, was jedes feste Warten zum Raten macht. Warten Sie auf eine erreichbare Adresse, bringen Sie dann das Profil hoch, und begrenzen Sie das Warten, damit ein Hook den Aufwachpfad nicht unbegrenzt offen halten kann. Bevorzugen Sie den Profilnamen gegenüber einem numerischen Index, und wenn das richtige Profil je nach Netzwerk variiert, soll der gesunde Tunnel seine Wahl vorher in eine Datei schreiben.
Wehren Sie sich auch gegen Neustartstürme, indem Sie Versuche zählen und aufhören. Ein Watchdog, der auf jede fehlgeschlagene Prüfung reagiert, macht aus einem Ausfall eine Schleife.
Suspendieren Sie einmal und lesen Sie dann im Journal die eigene Ausgabe des Hooks. Das ist der einzige Test, der die Reihenfolge beweist.