macOS-VPN-Status im Terminal: scutil, Routen oder ein Ping
Dienststatus, Kernel-Route und eine echte Anfrage beantworten drei verschiedene Fragen. Schreiben Sie Ihr Skript gegen die Dienstkennung und prüfen Sie auch die Route.
Irgendwo in einem Deploy-Skript gibt es eine Prüfung, ob der Tunnel steht, bevor eine Kopie beginnt. Es gibt drei Antworten, und sie bedeuten nicht dasselbe: der Dienststatus, den scutil meldet, die Route, die der Kernel gewählt hat, und ob die Gegenseite tatsächlich antwortet. Sie zu vergleichen ist der Unterschied zwischen einer Prüfung, die die Kopie vorhersagt, und einer, die nur ein Protokoll schmückt.
Drei Antworten auf die Frage, ob das VPN läuft
Der Dienststatus ist ein Fakt der Steuerungsebene. macOS weiß, dass eine Konfiguration verbunden ist, weil ihr Clientprozess es gesagt hat. Die Route ist ein Fakt der Datenebene: der Kernel schickt dieses Ziel über jene Schnittstelle. Erreichbarkeit ist ein Ende-zu-Ende-Fakt, und sie kann aus Gründen scheitern, die keiner der beiden anderen sieht.
| Signal | Answers | Blind spot |
|---|---|---|
scutil --nc status | Is the service connected? | Third-party clients, wrong routes |
route -n get | Where would this go? | The peer may be down |
| A request to the far side | Does it work now? | Slow, and it changes state |
Eine nützliche Prüfung kombiniert die ersten beiden und nutzt die dritte als Bestätigung, dass die anderen beiden nicht gelogen haben. Jede für sich allein ist eine Vermutung mit Zeitstempel.
Lesen Sie die Kennung, nicht den Anzeigenamen
scutil --nc list
scutil --nc status "Office"
Die Auflistung gibt eine Zeile pro Dienst aus, und jede Zeile trägt einen Status in Klammern, gefolgt von der Dienstkennung, dem Typ und dem Anzeigenamen. Schreiben Sie das Skript gegen die Kennung, denn der Anzeigename ist das, was jemand in den Systemeinstellungen eingetippt hat, und er kann sich ohne Vorwarnung ändern. Der Statusbefehl gibt ein einzelnes Wort aus, gefolgt von Statistiken für manche Diensttypen; vergleichen Sie dieses erste Wort, statt die gesamte Ausgabe nach dem Namen zu durchsuchen, der auch anderswo auftaucht.
Das Starten eines Dienstes kann eine Autorisierungsabfrage auslösen oder rundweg abgelehnt werden, wenn das Profil verwaltet wird. Diese Ablehnung ist kein Fehler im Tunnel; sie ist eine Richtlinienaussage darüber, wer ihn hochfahren darf.
Ein Drittanbieter-Client versteckt sich vor der Liste
Eine leere Liste heißt nicht, dass es kein VPN gibt. Konfigurationen, die in den eigenen Netzwerkeinstellungen des Systems angelegt wurden, erscheinen hier; ein Herstellerclient, ein Verwaltungsprofil oder eine Drittanbieter-App kann einen aktiven Tunnel halten, den dieser Befehl nie sieht. Ihr eigenes Werkzeug ist die Autorität für ihren eigenen Dienst. scutil nach einem Client zu fragen, der sich nie bei ihm registriert hat, liefert nichts, und nichts ist nicht dieselbe Antwort wie getrennt.
Wenn die Liste leer ist, der Verkehr aber offensichtlich verschlüsselt ist, suchen Sie stattdessen die Schnittstelle: ein utun- oder ppp-Gerät mit einer Adresse im erwarteten Bereich ist ein Beleg dafür, dass etwas einen Tunnel aufgebaut hat. Das ist ein schwächeres Signal als ein Dienststatus, also kombinieren Sie es mit einer Routenprüfung, statt die Schnittstelle als Identitätsbeweis zu behandeln. Mehrere Clients können mehrere solche Schnittstellen anlegen, und nur eine davon gehört zu dem Tunnel, den Sie meinten.
Status ist nicht Routing
Ein verbundener Dienst sagt, dass der Tunnel existiert. Er sagt nicht, dass Ihr Ziel ihn benutzt. Lesen Sie die Adressen und fragen Sie dann den Kernel direkt:
ifconfig | grep -A4 utun
netstat -rn -f inet
route -n get 10.40.0.20
Ein Full-Tunnel-Client installiert eine Standardroute durch den Tunnel; ein Split-Tunnel-Client installiert bestimmte private Präfixe. Beide melden Connected, und ein Skript, das nur den Status prüft, läuft fröhlich über den falschen Pfad. Einen Tunnel zu stoppen entfernt nicht unbedingt Routen, die ein anderer Client installiert hat, und das ist ein Weg, auf dem eine Maschine gleichzeitig einen verbundenen Dienst und eine veraltete Route behält. Schauen Sie auf das Ziel, das Sie interessiert, nicht auf die gesamte Routentabelle.
Namensgebung ist ein eigenes Problem
Andere Maschinen erreichen den Mac nicht über den Namen, während seine Adresse funktioniert, und das wird als VPN-Fehler gemeldet. Der lokale Hostname, der Hostname und der DNS-Eintrag sind drei verschiedene Dinge. scutil --get LocalHostName zeigt den Bonjour-Namen; sudo scutil --set HostName mac-office setzt den Namen, den das System meldet.
Keine der beiden Einstellungen legt einen Eintrag in der Bürozone an. Wenn andere Hosts den Namen über DNS auflösen müssen, muss der Zoneninhaber ihn hinzufügen, oder das Skript sollte stattdessen die Adresse verwenden. Ein stabiler Name macht Ankündigungen konsistent; er bringt den Resolver nicht zum Antworten.
Notieren Sie die Dienstkennung und die erwartete Routenform gemeinsam im Skript und prüfen Sie beides vor der Kopie. Ein Tunnel, der steht und falsch geroutet ist, scheitert genau wie gar kein Tunnel, und die Protokollzeile mit Connected schickt die nächste Person an die falsche Stelle.