Εκκίνηση αποθηκευμένου Mac VPN από το τερματικό με scutil --nc
Χρησιμοποιήστε το scutil --nc για να ξεκινήσετε, να επιθεωρήσετε και να σταματήσετε μια αποθηκευμένη υπηρεσία macOS VPN, κρατήστε τα διαπιστευτήρια έξω από το argv και αποδείξτε ότι η κίνηση χρησιμοποιεί πραγματικά το τούνελ.
Έχετε μια αποθηκευμένη υπηρεσία VPN στις Ρυθμίσεις συστήματος και θέλετε το τερματικό να την εκκινήσει. Στο macOS η υποστηριζόμενη διαδρομή είναι scutil --nc, αλλά μόνο για υπηρεσίες που ανήκουν στον ίδιο τον διαχειριστή συνδέσεων δικτύου του συστήματος. Η γραμμή μενού δεν είναι API: οι πελάτες τρίτων έχουν συνήθως τη δική τους αυτοματοποίηση, και ένα προφίλ που αποστέλλεται από υπηρεσία διαχείρισης μπορεί να αρνηθεί τοπική εκκίνηση. Αυτή είναι η λίστα ελέγχου που ακολουθώ: βρείτε την ακριβή υπηρεσία, διαβάστε την κατάστασή της, ξεκινήστε την, περιμένετε να αλλάξει η κατάσταση και μετά αποδείξτε ότι η κίνηση χρησιμοποιεί πραγματικά το τούνελ. Σταματήστε στο πρώτο βήμα που δεν συμφωνεί, γιατί κάθε επόμενη εντολή υποθέτει ότι η προηγούμενη πέτυχε.
Βρείτε την υπηρεσία πριν προσπαθήσετε να την ξεκινήσετε
Ξεκινήστε από το απόθεμα και όχι από το όνομα προφίλ που θυμάστε:
scutil --nc help
scutil --nc list
Κάθε γραμμή συνδυάζει μια κατάσταση με ένα αναγνωριστικό υπηρεσίας, έναν τύπο και ένα όνομα εμφάνισης. Το αναγνωριστικό είναι η τιμή για σενάρια, γιατί τα ονόματα εμφάνισης επαναλαμβάνονται και μπορούν να αλλάξουν. Το εγχειρίδιο scutil της Apple τεκμηριώνει τη λειτουργία σύνδεσης δικτύου, ενώ το εγκατεστημένο --nc help είναι η έγκυρη λίστα υποεντολών σε εκείνο το Mac· μην υποθέσετε ότι μια σημαία από παλαιότερο οδηγό υπάρχει ακόμη στην έκδοση macOS σας.
Μια κενή λίστα είναι αποτέλεσμα, όχι σφάλμα. Μια υπηρεσία που δημιουργήθηκε από πελάτη προμηθευτή ή προφίλ διαχείρισης μπορεί να είναι ενεργή ενώ είναι αόρατη εδώ, ή ορατή με τύπο που ο εγγενής ελεγκτής δεν μπορεί να οδηγήσει. Σε αυτή την περίπτωση, χρησιμοποιήστε το εργαλείο του προμηθευτή ή την τεκμηρίωση του προφίλ. Η δημιουργία παράλληλου εγγενούς προφίλ μόνο για να έχετε κάτι να ξεκινήσετε είναι κακή ανταλλαγή.
Διαβάστε την τρέχουσα κατάσταση και επιβεβαιώστε τον επιλογέα
Ρωτήστε την υπηρεσία πριν την ξεκινήσετε, ώστε να ξέρετε τι πρέπει να αλλάξει μια επιτυχημένη εκκίνηση:
scutil --nc status "Office VPN"
Αν δύο υπηρεσίες μοιράζονται ένα όνομα εμφάνισης, το όνομα είναι διφορούμενο. Περάστε το αναγνωριστικό αντ’ αυτού· η εντολή δέχεται και τα δύο, αλλά μόνο το αναγνωριστικό εγγυάται την επιλογή μίας υπηρεσίας. Ελέγξτε ότι η λέξη κατάστασης είναι μία που αναγνωρίζετε — συνήθως Connected, Disconnected, Connecting ή Disconnecting — πριν την αναλύσετε σε σενάριο. Ελέγξτε επίσης αν το προφίλ διαχειρίζεται, γιατί μια κλειδωμένη διαμόρφωση μπορεί να δεχτεί την εντολή και να την αγνοήσει ή να ζητήσει επιβεβαίωση.
Αυτή η κλήση κατάστασης είναι φθηνή, οπότε χρησιμοποιήστε την ως φύλακα στην αυτοματοποίηση: ξεκινήστε μόνο όταν η κατάσταση είναι Disconnected και μη θεωρείτε το Connecting αποτυχία. Αν η υπηρεσία είναι ήδη Connected, παραλείψτε την εκκίνηση αντί να διακόψετε ένα λειτουργικό τούνελ.
Ξεκινήστε τη σύνδεση και περιμένετε να σταθεροποιηθεί η κατάσταση
Το αίτημα εκκίνησης είναι ασύγχρονο. Η εντολή επιστρέφει όταν γίνει δεκτό το αίτημα, όχι όταν ολοκληρωθεί ο έλεγχος ταυτότητας ή εγκατασταθούν οι διαδρομές. Εκτελέστε την, μετά ελέγχετε την κατάσταση με περιορισμένη αναμονή και σταματήστε αν η υπηρεσία επιστρέψει σε Disconnected:
scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
state=$(scutil --nc status "Office VPN" | head -n 1)
[ "$state" = "Connected" ] && break
[ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
sleep 2
n=$((n + 1))
done
Μια κατάσταση Connecting που δεν επιλύεται ποτέ δείχνει συνήθως διαπιστευτήρια, MFA ή τον διακομιστή, όχι το scutil. Η εντολή δεν μπορεί να παρέχει διαδραστική σύνδεση, οπότε ένα προφίλ που περιμένει token ή κλειδί υλικού θα μείνει σε Connecting και τελικά θα επιστρέψει. Διαβάστε τη λέξη κατάστασης πριν προσθέσετε επαναλήψεις· ένας βρόχος απέναντι σε προτροπή ελέγχου ταυτότητας δεν μπορεί να πετύχει.
Μη θεωρείτε την κατάσταση εξόδου του κελύφους ως ετοιμότητα. Το χρήσιμο σήμα είναι η συμβολοσειρά κατάστασης, ακολουθούμενη από απόδειξη ότι το τούνελ μεταφέρει κίνηση. Μια εντολή εκκίνησης που επιστρέφει ήσυχα μπορεί να σας αφήσει με σύνδεση που δεν επαληθεύεται ποτέ.
Αποδείξτε ότι το τούνελ μεταφέρει κίνηση, όχι μόνο ότι λέει Connected
Το Connected περιγράφει τη σύνδεση, όχι την απόφαση δρομολόγησης. Οι εγγενείς υπηρεσίες PPP και IKEv2 δημιουργούν διεπαφή ppp ή utun και εγκαθιστούν διαδρομές, ενώ ένα διαχωρισμένο τούνελ αφήνει σκόπιμα την προεπιλεγμένη διαδρομή ανέπαφη. Επιθεωρήστε τις διεπαφές και τις δύο οικογένειες διευθύνσεων:
ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns
Βρείτε τη διεπαφή που δημιούργησε η υπηρεσία αντί να μαντέψετε έναν αριθμό, μετά ρωτήστε τον πίνακα δρομολόγησης ποια διεπαφή χρησιμοποιεί ένας συγκεκριμένος προορισμός: route -n get 10.0.0.10, με έναν εσωτερικό κεντρικό υπολογιστή στη θέση του. Αν αναφέρει τη φυσική διεπαφή, το τούνελ είναι ενεργό αλλά δεν μεταφέρει αυτή τη ροή. Ελέγξτε τις διαδρομές διαχωρισμένου τούνελ, τη σειρά του επιλυτή και οποιονδήποτε τοπικό κανόνα τείχους προστασίας που επιτρέπει τη διεπαφή του τούνελ αλλά όχι τη διεργασία.
Η επίλυση ονομάτων είναι το συνηθισμένο ψευδές αρνητικό. Τα εσωτερικά ονόματα μπορούν να επιλυθούν μέσω του λάθος επιλυτή ενώ το τούνελ είναι απολύτως υγιές, κάτι που μοιάζει με βλάβη VPN και δεν είναι. Το scutil --dns δείχνει τη σειρά που θα χρησιμοποιήσει το macOS· μετά από αλλαγή επιλυτή, καθαρίστε την προσωρινή μνήμη με dscacheutil -flushcache και sudo killall -HUP mDNSResponder.
Κρατήστε τα διαπιστευτήρια και τα προνόμια έξω από τη γραμμή εντολών
Μη βάζετε ποτέ κωδικό πρόσβασης, προκοινόχρηστο κλειδί ή token στα ορίσματα. Τα ορίσματα είναι ορατά στις λίστες διεργασιών και καταλήγουν στο ιστορικό του κελύφους, και ένα αντιγραμμένο αρχείο υποστήριξης μπορεί να τα διαρρεύσει. Η ίδια η διαχείριση διαπιστευτηρίων του προφίλ — είτε στοιχείο Keychain, είτε προτροπή συστήματος, είτε ροή ελέγχου ταυτότητας του πελάτη — είναι το σωστό μέρος για μυστικά.
Η εκτέλεση της εντολής με sudo δεν κάνει μια διαδραστική σύνδεση χωρίς επιτήρηση. Αλλάζει τον πραγματικό χρήστη, όχι τη διαθεσιμότητα μιας προτροπής GUI, ενός token υλικού ή του Keychain σύνδεσης. Ένα LaunchAgent μπορεί να ξεκινήσει μια υπηρεσία αφού συνδεθεί ο χρήστης και ξεκλειδωθεί το Keychain· ένα LaunchDaemon συνήθως δεν φτάνει αυτά τα τμήματα της συνεδρίας χρήστη. Αν ένας οργανισμός διαχειρίζεται την υπηρεσία, οι κανόνες κύκλου ζωής του υπερισχύουν οποιουδήποτε τοπικού σεναρίου.
Σταματήστε την υπηρεσία και επαληθεύστε ότι έμεινε σταματημένη
Σταματήστε με τον ίδιο επιλογέα που χρησιμοποιήσατε για εκκίνηση, μετά διαβάστε ξανά την κατάσταση αντί να υποθέσετε ότι το τούνελ έφυγε:
scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"
Μια διακοπή που επιστρέφει σε Disconnected αφήνει ακόμη ένα πράγμα για έλεγχο: αν το προφίλ είναι ρυθμισμένο για σύνδεση κατ’ απαίτηση, κάτι που μπορεί να το επαναφέρει χωρίς το σενάριό σας. Αν άλλος πελάτης κατέχει διαδρομές στο ίδιο Mac, αυτές οι διαδρομές μπορούν να επιβιώσουν από μια εγγενή διακοπή. Ελέγξτε ξανά τη διαδρομή πριν συμπεράνετε ότι το μηχάνημα είναι εκτός VPN.
Για ένα περιτύλιγμα που εκτελείτε με το χέρι, κρατήστε τη σειρά σταθερή: λίστα, κατάσταση, εκκίνηση, έλεγχος, δοκιμή διαδρομής, διακοπή, επαλήθευση. Μην αναλύετε το φιλικό όνομα από ελεύθερη έξοδο όταν το αναγνωριστικό είναι διαθέσιμο, και μη θεωρείτε την έξοδο της εντολής εκκίνησης ως ετοιμότητα. Ο διαχειριστής συνδέσεων αναφέρει κατάσταση· η απόδειξή σας είναι η κατάσταση συν μια διαδρομή που δείχνει στο τούνελ.