Einen abhängigen Dienst an tun0.device zu hängen sieht wie ein Abonnement des Tunnels aus, ist es aber nicht. Eine Geräteeinheit spiegelt die Existenz der Schnittstelle wider, was über eine fehlgeschlagene Verbindung und die folgende Wiederverbindung hinweg wahr bleiben kann. Der Dienst handelt dann im falschen Moment oder nie, je nachdem, ob die Schnittstelle zwischendurch verschwand. Der Hook, der das Ereignis beschreibt, das Sie wirklich interessiert, ist der, den OpenVPN aufruft, nicht der, den systemd ableitet.

Entscheiden Sie, welche Bedingung der Dienst braucht, bevor Sie den Auslöser wählen, denn die drei Kandidaten sind nicht austauschbar.

Was die Geräteeinheit tatsächlich verfolgt

systemd erzeugt eine Geräteeinheit aus der Sicht des Kernels auf eine Netzwerkschnittstelle, daher wird tun0.device aktiv, wenn die Schnittstelle erscheint, und inaktiv, wenn sie entfernt wird. Mit persist-tun hält ein weicher Neustart die Schnittstelle an Ort und Stelle, sodass die Einheit nie flattert und nichts an sie Gebundenes ausgelöst wird. Selbst ohne Persistenz sagt die Einheit nichts über Routen, DNS oder ob die Gegenseite antwortet.

Das macht sie zu einem schlechten Stellvertreter für 'das VPN ist bereit'. Ein Listener, der nur die lokale Adresse braucht, kann mit der Existenz der Schnittstelle zufrieden sein, während ein Dienst, der eine Anwendung im entfernten Netz aufruft, Routen und Erreichbarkeit braucht, was die Geräteeinheit nicht ausdrücken kann.

up, route-up und up-restart bedeuten Unterschiedliches

up läuft, nachdem das TUN/TAP-Gerät geöffnet und die Schnittstelle konfiguriert wurde, was der richtige Moment für einen Listener ist, der die zugewiesene Adresse bindet. route-up läuft, nachdem Routen installiert wurden, abhängig von einer konfigurierten Routenverzögerung, und passt zu Arbeit, die die abgeschlossene Routenstufe braucht. Keines von beiden beweist, dass die entfernte Anwendung antwortet. Die Wahl zwischen ihnen ist eine Frage dessen, was der Dienst braucht, nicht dessen, welcher Hook fertiger klingt.

Mit persist-tun verwenden Neustarts das Gerät wieder, sodass up nicht erneut läuft, es sei denn, up-restart ist gesetzt. Diese Option aktiviert das up-Skript für den dokumentierten Neustart-Lebenszyklus, und seine Umgebung ist im Vergleich zu einem Erststart reduziert. Ein Skript, das die volle Umgebung annimmt, funktioniert bei der ersten Verbindung und scheitert bei der nächsten.

Die Aktion auslösen, ohne auf sie zu warten

Ein Hook, der systemctl restart synchron aufruft, kann gegen eine Einheit verklemmen, deren Reihenfolge auf den Tunnel wartet. systemctl --no-block try-restart vpn-dependent.service stellt den Auftrag in die Warteschlange und kehrt zurück, was den Hook daran hindert, die Verbindung zu blockieren, auf die er reagierte. try-restart wirkt nur auf eine laufende Einheit, während restart auch eine inaktive startet; wählen Sie bewusst statt aus Gewohnheit.

Einreihen ist keine Verifikation. Der Hook meldet Erfolg, sobald der Auftrag angenommen ist, daher muss die Prüfung im Journal der Zieleinheit oder in ihrem tatsächlichen Listener-Zustand erfolgen.

Neustartpolitik lebt in der Einheit, nicht im Hook

Eine Oneshot-Einheit mit RemainAfterExit=yes bleibt aktiv, nachdem ihr Befehl beendet ist, und eine zweite Startanfrage bewirkt nichts, weil systemd sie als bereits gestartet ansieht. Das ist eine Eigenschaft, um die herum man entwirft, kein Defekt, den man mit wiederholten Startaufrufen umgeht. Muss die Aktion pro Verbindung laufen, braucht die Einheit eine Form, die das erlaubt.

After= ordnet Einheiten, und BindsTo= bindet Lebensdauern, aber keines von beiden bedeutet 'starte dies neu, wann immer das VPN sich neu verbindet'. Eine an den Tunnel gebundene Einheit stoppt, wenn der Tunnel stoppt; sie startet sich nicht selbst neu, wenn der Tunnel zurückkehrt, es sei denn, etwas startet sie erneut.

Testen Sie drei Wiederverbindungen, nicht eine

Kaltstart, ein vollständiger Client-Neustart und eine weiche Wiederverbindung üben jeweils einen anderen Pfad. Die weiche Wiederverbindung ist die, die ein fehlendes up-restart, eine reduzierte Umgebung oder eine Geräteeinheit aufdeckt, die nie inaktiv wurde. Führen Sie alle drei aus und bestätigen Sie beide Richtungen: Der Dienst handelt, wenn der Tunnel hochkommt, und er startet bei unabhängigen Linkänderungen wie einem Wi-Fi-Roaming nicht neu.

Behalten Sie einen unabhängigen Wiederherstellungspfad, wenn der abhängige Dienst Ihren eigenen Verwaltungszugang trägt. Ein Hook, der das neu startet, worüber Sie verbunden sind, ist eine Änderung, die Sie aussperren kann.

Ähnliche Artikel