Warum eine 23-Stunden-VPN-Erinnerung für die falsche Sitzung auslöst
Ein 23-Stunden-Hinweis sollte einer Sitzung folgen, nicht dem Konto. Binden Sie den Timer an die Verbindung, die begonnen hat, und behandeln Sie Ruhezustand und Neuverbindung als getrennte Fälle.
Der Hinweis erschien zwanzig Minuten nach dem Verbinden. Der Zähler darunter lief seit dem vorigen Morgen, oder seit der letzten Authentifizierung des Kontos, und nichts in der Warnung sagte, welches von beidem. Das ist das Symptom: eine Erinnerung, die an etwas anderes gebunden ist als an die Verbindung vor Ihnen.
Die Lösung ist keine bessere Warnung. Sie besteht darin, zu entscheiden, welche Uhr die Anforderung meint, und den Timer dann an ein Objekt zu binden, das in dieser Uhr existiert.
Was ausgelöst wurde und was gezählt hat
Drei plausible Quellen erzeugen dieselbe Meldung. Eine Kalenderregel läuft zu einer festen Ortszeit und weiß nichts über Tunnel. Ein Zähler im Client summiert, solange irgendeine Verbindung steht, und übersteht Neuverbindungen. Eine Gateway-Richtlinie lässt die Sitzung serverseitig ablaufen und schickt zuerst eine Warnung.
Nur die letzten beiden betreffen eine Sitzung, und selbst die stimmen nicht überein. Der Client-Zähler misst, was der lokale Prozess beobachtet hat; das Gateway misst, was es authentifiziert und abgerechnet hat. Ein Ruhezustand, ein Netzwerkwechsel oder ein Neustart des Beobachters können beide um Stunden trennen, und deshalb driften Warnung und erzwungenes Ablaufen auseinander.
Drei Uhren hinter einer Anforderung
Schreiben Sie zuerst den Satz auf, den Sie wirklich wollen. Zu warnen, bevor das Gateway diese Verbindung beendet, ist nicht dieselbe Anforderung wie zu erinnern, nachdem ein Tag verbundener Zeit vergangen ist. Es ist auch nicht dasselbe wie zu melden, dass diese Sitzung seit 23 Stunden steht. Jede Fassung benennt ein anderes Ereignis, und eine andere Komponente muss darauf antworten.
Prüfen Sie dann, ob die Daten existieren. Ein lokaler Startzeitstempel liefert das Sitzungsalter ohne Abhängigkeit vom Server. Eine Gateway-Richtlinie liefert die Restlebensdauer, aber nur, wenn das Gateway sie offenlegt. Ein Nutzungsbericht liefert die Dauer im Nachhinein, und das kann keinen Vorabhinweis treiben.
Binden Sie den Timer an die Sitzung, nicht an das Konto
Wählen Sie zuerst das Objekt. Ein Konto kann mehrere Geräte und mehrere gleichzeitige Sitzungen halten, also kann eine am Benutzernamen festgemachte Erinnerung nicht sagen, welche Verbindung das Alter erreicht hat. Binden Sie sie an das Profil plus jene Aktivierung, und brechen Sie den ausstehenden Hinweis ab, wenn die Aktivierung endet.
| Evidence you can read | What it establishes | Where it misleads |
|---|---|---|
| Connection state changes to active | A session started now | Does not carry the gateway's own session identifier |
| Duration reported at disconnect | Total service time for that session | Arrives too late for any advance notice |
| Interim usage update | Time accounted up to that update | Staleness equals the update interval |
| Local timestamp taken at activation | Age of your observation | Resets whenever the observer restarts |
Diese Tabelle ist ein Vertrag für Ihren eigenen Notifier, keine Beschreibung der Callback-API irgendeines Clients. Was auch immer das installierte Produkt zum Verbindungszustand dokumentiert, ist die Quelle, an die Sie binden sollten; wo es nur Authentifizierungsereignisse offenlegt, sagen Sie das laut und akzeptieren Sie das gröbere Verhalten, statt eine Sitzung zu erschließen.
Testen Sie es mit einer kurzen Schwelle
Debuggen Sie niemals einen ganztägigen Timer mit einem ganztägigen Warten. Fügen Sie eine konfigurierbare Schwelle hinzu, setzen Sie sie auf dreißig Sekunden und führen Sie vier Übergänge der Reihe nach aus: verbinden, warten, trennen, neu verbinden. Jeder Übergang sollte genau eine Zustandsänderung erzeugen, und die Neuverbindung sollte eine neue Frist planen, statt die alte zu erben.
# current connection state and profile identity
nmcli -f GENERAL.STATE,GENERAL.CONNECTION connection show work
# the notifier unit you wrote: does it restart the deadline or resume it?
journalctl --user -u vpn-timer.service --since "-5 min" -o cat
Achten Sie auf die Zeitstempel statt auf den Wortlaut. Ein Hinweis, der mit der Startzeit der vorigen Sitzung ankommt, hat das falsche Objekt gebunden, und ein Hinweis, der zweimal für eine Frist ankommt, bedeutet, dass das Gesendet-Kennzeichen nie gespeichert wurde.
Ruhezustand, Neuverbindung und verpasste Zustellung
Der Ruhezustand bricht beide naiven Entwürfe. Ein monotoner Countdown hält an, während die Maschine schläft, eine Frist nach Wanduhr läuft weiter, und ein Timer, der während des Ruhezustands auslöst, wird verspätet oder gar nicht zugestellt. Entscheiden Sie, welches Verhalten Ihre Anforderung braucht, versetzen Sie die Maschine dann über die Schwelle in den Ruhezustand und bestätigen Sie es.
Die Zustellung verdient dieselbe Sorgfalt. Wenn der Hinweis nicht angezeigt werden kann, reihen Sie ihn ein, und prüfen Sie erneut, ob die Zielsitzung noch existiert, bevor Sie ihn endgültig zeigen; sonst wird der Benutzer vor einer Verbindung gewarnt, die bereits beendet ist. Erzwungene Trennung und Erneuerung von Anmeldedaten bleiben außerhalb dieses Weges, denn eine Erinnerung, die stillschweigend das Schicksal der Verbindung ändert, ist eine Richtlinienentscheidung im Gewand eines Hinweises.