Σενάριο πελάτη VPN: επιλέξτε το επίπεδο πριν από τον κωδικό
Το CLI του προμηθευτή, το rasdial, μια πρόθεση εφαρμογής ή η αυτοματοποίηση διεπαφής αποτυγχάνουν το καθένα διαφορετικά. Επιλέξτε το επίπεδο, κρατήστε το μυστικό έξω από το argv και περιμένετε κατάσταση, όχι κωδικούς εξόδου.
Τα σενάρια ξεκινούν πελάτες VPN στο επίπεδο που διάλεξε ο συγγραφέας, και αυτό το επίπεδο σπάνια είναι εκείνο που χρειαζόταν η εργασία. Η γραμμή εντολών του προμηθευτή, ο κλήτορας του λειτουργικού συστήματος και μια πρόθεση εφαρμογής κινητού επιστρέφουν όλα σε διαφορετικά σημεία της ζωής της σύνδεσης. Χειρίζονται επίσης το μυστικό διαφορετικά, και αυτή η διαφορά καθορίζει αν ο κωδικός είναι ορατός σε κάθε χρήστη του μηχανήματος. Επιλέξτε το επίπεδο πριν γράψετε την πρώτη γραμμή του σεναρίου.
Επίπεδο 1: η γραμμή εντολών του προμηθευτή
Οι περισσότεροι πελάτες επιφάνειας εργασίας παρέχουν μια γραμμή εντολών που δέχεται όνομα προφίλ και, πολύ συχνά, κωδικό. Ο παλιός πελάτης της Cisco δεχόταν ρήμα connect με ορίσματα χρήστη και κωδικού· το macOS εκθέτει την ενσωματωμένη υπηρεσία μέσω του networksetup· ο NetworkManager απαντά στο nmcli. Αυτές οι κλήσεις επιστρέφουν όταν τελειώσει η εντολή, που δεν είναι η ίδια στιγμή με εκείνη που το τούνελ γίνεται χρησιμοποιήσιμο. Διαβάστε την τεκμηρίωση του ίδιου του προμηθευτή για την έκδοση που αναπτύσσετε, γιατί αυτές οι διεπαφές αλλάζουν και μερικές αφαιρούνται εντελώς.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
Το πλεονέκτημα είναι ότι ο προμηθευτής γνωρίζει το δικό του αποθετήριο προφίλ, οπότε η κλήση χρησιμοποιεί την ίδια διαμόρφωση που θα χρησιμοποιούσε το GUI. Το μειονέκτημα είναι ότι κάθε προμηθευτής εφευρίσκει τα δικά του ρήματα, και ένα σενάριο γραμμένο για έναν πελάτη δεν μεταφέρεται σε άλλον. Θεωρήστε αυτό το επίπεδο τη συντομότερη διαδρομή όταν ο πελάτης είναι σταθερός και η έκδοση καρφιτσωμένη.
Επίπεδο 2: η δική του υπηρεσία του λειτουργικού συστήματος
Στα Windows ο κλήτορας είναι μέρος του λειτουργικού συστήματος και εργάζεται πάνω σε καταχώριση τηλεφωνικού καταλόγου αντί για το αποθετήριο προφίλ του προμηθευτή. Αυτό τον κάνει πιο φορητό μεταξύ πελατών και ευκολότερο να γραφτεί σενάριο από λογαριασμό υπηρεσίας. Σημαίνει επίσης ότι η σύνδεση μπορεί να υπάρχει σε ένα σημείο και όχι στο άλλο, κάτι που μπερδεύει όσους κοιτάζουν στη λάθος λίστα.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Χρησιμοποιήστε την επιφάνεια του PowerShell όταν πρέπει να δημιουργήσετε ή να αφαιρέσετε την καταχώριση αντί να την καλέσετε. Τα επίπεδα WMI και cmdlet εκθέτουν τα ίδια αντικείμενα με διαφορετικά ονόματα, και η αφαίρεση είναι ξεχωριστή λειτουργία από την αποσύνδεση. Ένα σενάριο που μόνο καλεί θα αφήσει παρωχημένες καταχωρίσεις μετά από μια μετεγκατάσταση. Ελέγξτε σε ποιο αποθετήριο γράφει η αυτοματοποίησή σας πριν υποσχεθείτε ότι ο καθαρισμός θα συμβεί.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
Στο macOS το αντίστοιχο είναι η λίστα υπηρεσιών δικτύου, όπου μια υπάρχουσα υπηρεσία συνδέεται με όνομα αντί να δημιουργείται επί τόπου.
Τα διαπιστευτήρια διαρρέουν σε κάθε επίπεδο, οπότε επιλέξτε το κανάλι
Ό,τι περνάτε στη γραμμή εντολών εμφανίζεται στον πίνακα διεργασιών για κάθε τοπικό χρήστη, και συνήθως επιβιώνει και στο ιστορικό του φλοιού. Η υποστηριζόμενη εναλλακτική του OpenVPN είναι να διαβάζετε το μυστικό από αρχείο με --askpass, και το ίδιο το αρχείο χρειάζεται δικαιώματα που ταιριάζουν με την εμπιστοσύνη που του δίνετε. Ένας επώνυμος σωλήνας αποφεύγει την εγγραφή του μυστικού στον δίσκο αλλά αφήνει κάθε διεργασία που μπορεί να τον ανοίξει να γράψει εκεί. Στα Windows, αποθηκεύστε το μυστικό στη διαχείριση διαπιστευτηρίων ή σε αρχείο που μόνο ο λογαριασμός υπηρεσίας μπορεί να διαβάσει, και ποτέ ως λεκτικό σε αρχείο δέσμης.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
Ο ίδιος κανόνας ισχύει για διακριτικά και κωδικούς μίας χρήσης: αν η αυτοματοποίηση τα χρειάζεται, η αυτοματοποίηση χρειάζεται κανάλι που δεν είναι όρισμα γραμμής εντολών. Περιστρέψτε το μυστικό όταν αλλάζετε τον μηχανισμό, γιατί η παλιά τιμή έχει καθίσει κάπου σε ένα αρχείο καταγραφής. Ένα σενάριο που δουλεύει και διαρρέει δεν είναι σενάριο που δουλεύει.
Περιμένετε την κατάσταση και μετά επιβλέπετε έναν μόνο ιδιοκτήτη
Κάθε μία από αυτές τις κλήσεις επιστρέφει πριν το τούνελ είναι έτοιμο, οπότε ερωτήστε την κατάσταση που εκθέτει ο πελάτης ή δοκιμάστε έναν προορισμό μέσα του με χρονικό όριο. Η αντιγραφή αρχείων ή το άνοιγμα σύνδεσης βάσης δεδομένων αμέσως μετά την κλήση σύνδεσης είναι αγώνας, και αποτυγχάνει περιοδικά με τρόπο που μοιάζει με βλάβη δικτύου.
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
Η αποσύνδεση έχει το ίδιο πρόβλημα αντίστροφα: η διεργασία μπορεί να βγει πριν φύγουν οι διαδρομές. Χρησιμοποιήστε τα άγκιστρα του πελάτη όπου υπάρχουν, όπως τα σενάρια up και down του OpenVPN ή το ExecStartPost μιας μονάδας systemd, γιατί εκτελούνται στο σημείο που πραγματικά σας ενδιαφέρει. Τα άγκιστρα εκτελούνται με τα δικαιώματα ό,τι τα κάλεσε, οπότε ένα άγκιστρο που επανεκκινεί το δίκτυο χρειάζεται ρητό κανόνα αντί για υπόθεση. Κρατήστε ακριβώς έναν ιδιοκτήτη για όλη τη ζωή της σύνδεσης.
Όταν δύο επόπτες ξεκινούν και σταματούν το ίδιο προφίλ, το αποτέλεσμα είναι ένας βρόχος επανασύνδεσης που διαβάζεται σαν διακοπή του παρόχου. Το runbook τελειώνει όταν το επίπεδο είναι τεκμηριωμένο, το μυστικό έχει κανάλι που δεν είναι argv, η συνθήκη αναμονής είναι έλεγχος κατάστασης με χρονικό όριο, και μία διεργασία κατέχει τον κύκλο ζωής.