Παράλειψη του VPN του σπιτιού με systemd ExecCondition
Η σκόπιμη παράλειψη και μια χαλασμένη εντολή προετοιμασίας είναι διαφορετικά αποτελέσματα. Ορίστε τους κωδικούς εξόδου του βοηθού και μετά δοκιμάστε τη μετάβαση μεταξύ δικτύων.
Το VPN του οικιακού δικτύου δεν έχει τίποτα να κάνει όταν το φορητό είναι ήδη σε αυτό το δίκτυο. Η δελεαστική συντόμευση είναι μια εντολή προετοιμασίας που βγαίνει με μη μηδενικό κωδικό· αυτό αποτυγχάνει τη μονάδα και κάνει κάθε πίνακα ελέγχου να φαίνεται χαλασμένος. Το systemd έχει μια οδηγία για ακριβώς αυτό το είδος απόφασης, και διαχωρίζει μια σκόπιμη παράλειψη από ένα πραγματικό σφάλμα. Το να γίνει σωστά αφορά κυρίως το να γράψετε τι σημαίνει κάθε κωδικός εξόδου.
Γιατί μια αποτυχημένη προϋπόθεση είναι λάθος μορφή
Το ExecStartPre θεωρεί μια μη μηδενική έξοδο ως αποτυχία εκκίνησης, που είναι σωστό για μια εντολή που προετοιμάζει την υπηρεσία. Η χρήση της ως συνθήκης κάνει μια απόφαση πολιτικής δυσδιάκριτη από μια χαλασμένη εξάρτηση. Το ExecCondition υπάρχει ώστε μια μονάδα να μπορεί να αρνηθεί να ξεκινήσει χωρίς να σημαδευτεί ως αποτυχημένη.
Αυτή η διάκριση μετράει στις τρεις τα ξημερώματα, όταν κανείς δεν θέλει να διαλογοποιήσει μια κόκκινη μονάδα που συμπεριφερόταν όπως σχεδιάστηκε. Μια αποτυχημένη μονάδα κρύβει επίσης τα πραγματικά σφάλματα ανάμεσα στα σκόπιμα.
Γράψτε πρώτα το συμβόλαιο κωδικών εξόδου
Γράψτε το συμβόλαιο πριν από το σκριπτ. Έξοδος μηδέν σημαίνει συνέχεια, έξοδος ένα σημαίνει παράλειψη των υπόλοιπων εντολών εκκίνησης, και έξοδος 255 σημαίνει ότι η ίδια η συνθήκη δεν μπόρεσε να εκτελεστεί. Κωδικοί μεταξύ δύο και 254 συνήθως σημαίνουν επίσης παράλειψη, κάτι που ξεχνιέται εύκολα όταν ένας βοηθός επιστρέφει έναν τυχαίο κωδικό σφάλματος. Το drop-in παρακάτω συνδέει τον βοηθό με το πραγματικό όνομα της μονάδας.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnΕλέγξτε την ενεργή μονάδα για κληρονομημένες ρυθμίσεις SuccessExitStatus ή stop-post πριν υποθέσετε την προεπιλεγμένη σημασιολογία. Μετά δοκιμάστε σκόπιμα καθένα από τα τρία αποτελέσματα.
Μια ένδειξη δικτύου δεν είναι απόδειξη τοποθεσίας
Μια προσβάσιμη διεύθυνση δρομολογητή ή μια γνωστή MAC μπορεί να υποδείξει το σωστό δίκτυο, και καμία από τις δύο δεν το αποδεικνύει. Ένα άλλο δίκτυο μπορεί να επαναχρησιμοποιήσει την ίδια διεύθυνση, τα δεδομένα ARP μπορεί να είναι παλιά, και τα αναγνωριστικά μπορούν να μιμηθούν. Αντιμετωπίστε τον έλεγχο ως βελτιστοποίηση συνεπή με την πολιτική, όχι ως αποτέλεσμα ταυτοποίησης.
Αποφασίστε εκ των προτέρων τι σημαίνει αβεβαιότητα. Η εκκίνηση του VPN όταν δεν είστε σίγουροι είναι ασφαλής για έναν πελάτη που απλώς θα αποτύγχανε να συνδεθεί· η παράλειψή του όταν δεν είστε σίγουροι δεν είναι. Κάντε τον έλεγχο περιορισμένο, και διαβάστε την ενεργή διεπαφή αντί να υποθέτετε την πρώτη στη λίστα. Ένας έλεγχος που κολλάει είναι χειρότερος από έναν που απαντά όχι, επειδή η μονάδα τον περιμένει.
Καταγράψτε αυτές τις υποθέσεις δίπλα στο αρχείο της μονάδας ώστε ο επόμενος να ξέρει τι πιστεύει ο βοηθός. Ένα σχόλιο στην κορυφή του σκριπτ είναι το φθηνότερο μέρος για να τις κρατήσετε.
Χειριστείτε τη μετάβαση μεταξύ δικτύων
Η συνθήκη εκτελείται όταν ξεκινά η υπηρεσία, και δεν επαναξιολογείται αργότερα. Μια μονάδα που παραλείφθηκε μένει παραλειμμένη αφού το φορητό μετακινηθεί σε μια καφετέρια, και μια ενεργή σήραγγα μένει όρθια αφού το φορητό επιστρέψει στο σπίτι. Συνδέστε τον κύκλο ζωής της αλλαγής δικτύου με την απόφαση εκκίνησης και διακοπής μέσω ξεχωριστού μηχανισμού.
systemctl cat home-vpn.serviceΔοκιμάστε τέσσερις περιπτώσεις: εκκίνηση στο σπίτι, εκκίνηση εκτός, έναν έλεγχο που δεν μπορεί να εκτελεστεί, και μια μετάβαση μεταξύ δικτύων ενώ η μονάδα είναι ενεργή. Κρατήστε τον λόγο παράλειψης ορατό στο ημερολόγιο ώστε μια σκόπιμη απόφαση να μην μοιάζει ποτέ με αποτυχία ταυτοποίησης. Η αναφορά υπηρεσίας τεκμηριώνει τη σημασιολογία εξόδου και την ελάχιστη έκδοση.