Zusätzliche Mac-VPN-Routen brauchen einen Eigentümer, kein Anmeldeskript
Eine einmal bei der Anmeldung hinzugefügte Route ist keine Wiederverbindungsrichtlinie. Gib entfernten Präfixen einen Eigentümer und entscheide, wie sie mit dieser Verbindung erscheinen, sich ändern und verschwinden.
Ein privates Präfix über ein VPN zu erreichen ist eine Anforderung mit Laufzeit: Sie gilt, solange die Verbindung nutzbar ist, und endet, wenn die Verbindung endet. Ein Anmeldeskript kann das nicht ausdrücken, denn Anmeldung und Tunnelaufbau sind verschiedene Zeitpunkte, und der Tunnel, der bei der Anmeldung existiert, ist womöglich nicht der, der eine Minute später den Verkehr trägt. Entscheidend ist zuerst nicht, welcher Befehl ausgeführt wird, sondern welche Komponente das Präfix besitzt.
Das Präfix braucht einen Eigentümer, keinen Zeitpunkt
Beginne damit, die Anforderung als Satz mit Subjekt zu formulieren: Erreiche 10.77.0.0/24 über das Office-VPN, solange diese Verbindung steht. Dieser Satz nennt das Präfix, die Verbindung und die Bedingung, und er schließt zwei beliebte Ersatzlösungen sofort aus, einen Anmelde-Hook und einen Schnittstellennamen wie ppp0 oder utun2.
Schnittstellennamen werden zur Laufzeit vergeben und sind über Wiederverbindungen hinweg nicht stabil. Ein Hook, der den Namen abgleicht, den er letzte Woche gesehen hat, feuert entweder gar nicht oder gegen die Schnittstelle eines anderen. Beide Ausgänge erscheinen als Routingfehler und nicht als die veraltete Annahme, die sie sind. Derselbe Einwand gilt für jedes Skript, das an einem Namen hängt, der nur existiert, solange ein bestimmter Tunnel steht.
Nutze eine unterstützte Quelle der Routenabsicht
Das Gateway, ein verwaltetes Profil oder der dokumentierte Routenmechanismus des besitzenden Clients ist der richtige Ort, sofern dieser Mechanismus die Anforderung ausdrücken kann. Welcher davon gilt, hängt vom Protokoll und vom Anbieter ab, und die Schlüssel wandern nicht zwischen ihnen, ein Wert, der ein Profil für OpenVPN konfiguriert, sagt nichts über den nativen L2TP- oder IKEv2-Client aus.
| Mechanism | Can carry extra prefixes | Who owns the lifetime |
|---|---|---|
| Gateway-pushed routes | Often, if the gateway is configured for it | The connection |
| Managed profile settings | Depends on the client and profile format | The profile |
| Provider tunnel settings | Yes, as included and excluded routes | The provider process |
| Manual command | Yes, once | Nobody |
Für Entwickler von Paket-Tunneln legen Apples IPv4-Tunneleinstellungen ein- und ausgeschlossene Routen ausdrücklich offen, und IPv6 hat sein Gegenstück. Das sind APIs, die der Provider nutzt, kein Beleg dafür, dass jedes native VPN-Bedienfeld einem Administrator eine freie Routenliste anbietet. Kann die aktuelle Kombination die benötigten Präfixe nicht ausdrücken, ist der nächste Schritt ein unterstützter Konfigurationsweg des Betreibers und keine andere App, die in der Hoffnung installiert wird, sie verhalte sich besser.
Die Laufzeit umfasst das Aufräumen
Manchmal ist ein externer Helfer wirklich nötig, und dann ist »die Route hinzufügen« der kleinste Teil seiner Aufgabe. Er muss wissen, welcher Verbindung er dient und welche Schnittstelle diese Verbindung nutzt, warten, bis der relevante Netzwerkzustand sich beruhigt hat, bei zweimaligem Lauf idempotent bleiben, und nichts aufräumen, was er nicht selbst installiert hat.
Der letzte Teilsatz ist der schmerzhafte. Ein Helfer, der jede Route zum Büropräfix löscht, wird früher oder später eine Route löschen, die er nicht hinzugefügt hat. Der daraus folgende Ausfall wird dem VPN-Client angelastet, weil der Client der Teil ist, den der Nutzer sieht. Vorher zu entscheiden, was ein Helfer besitzt, ist billiger, als hinterher zu erklären, warum ein lokales Subnetz nicht mehr antwortet.
Das Wettrennen bei der Wiederverbindung
Betrachte eine schnelle Wiederverbindung. Sitzung A bricht ab, Sitzung B kommt hoch und installiert ihre Route, dann läuft endlich das verzögerte Aufräumen von A. Räumt es Routen nach Präfix ab, nimmt es den gültigen Zustand von B mit, und die Verbindung, die vor einer Sekunde noch funktionierte, routet nun ins Leere.
Das ist ein Eigentümer-Wettlauf, und ein Schlaf im Skript ändert nur, welche Seite ihn gewinnt. Die Lösung ist, das Aufräumen an Identität zu binden: Vergleiche die Schnittstelle und Sitzung, die der Helfer installiert hat, mit den aktuell gültigen und entferne nur bei Übereinstimmung.
Was zu testen ist und was eine Route nicht kann
Die Abnahme muss vier Übergänge abdecken: die erste Verbindung, eine Wiederverbindung auf eine andere Schnittstelle, einen fehlgeschlagenen Verbindungsversuch und das abschließende Trennen. Lies nach jedem davon die Route, die das System tatsächlich für eine Adresse auf der Gegenseite gewählt hat, und nicht die, die du erwartet hast.
route -n get 10.77.0.5
netstat -rn -f inet
Nimm die unangenehmen Fälle im selben Durchgang mit: IPv6, wo es nötig ist, ein lokales Präfix, das das entfernte überlappt, und die Route zum öffentlichen VPN-Endpunkt selbst, die bestehen bleiben muss, solange der Tunnel steht. Dann schreibe auf, was eine Route nicht ist. Sie wählt Pakete aus; sie erteilt keine Berechtigung auf der Gegenseite und sie schafft keinen Rückweg, und das bleiben getrennte Anforderungen mit getrennten Eigentümern.
Das gewünschte Ergebnis ist ein Präfix, das seinem unterstützten Verbindungseigentümer durch jeden Übergang folgt, und kein Befehl, der zufällig einmal auf der Maschine gelungen ist, auf der er geschrieben wurde.