Επανεκκίνηση υπηρεσίας στο OpenVPN up: τα άγκιστρα νικούν το tun0.device
Η μονάδα συσκευής παρακολουθεί τη διεπαφή, όχι τη σύνδεση. Επιλέξτε up ή route-up για τη συνθήκη που χρειάζεται η υπηρεσία και μετά στείλτε επανεκκίνηση που δεν μπλοκάρει.
Το να συνδέσεις μια εξαρτημένη υπηρεσία με το tun0.device μοιάζει με συνδρομή στο τούνελ, και δεν είναι. Μια μονάδα συσκευής αντανακλά ότι η διεπαφή υπάρχει, κάτι που μπορεί να παραμείνει αληθινό μέσα από μια αποτυχημένη σύνδεση και την επανασύνδεση που ακολουθεί. Τότε η υπηρεσία ενεργεί τη λάθος στιγμή, ή ποτέ, ανάλογα με το αν η διεπαφή εξαφανίστηκε στο μεταξύ. Το άγκιστρο που περιγράφει το γεγονός που πραγματικά σε ενδιαφέρει είναι αυτό που καλεί το OpenVPN, όχι αυτό που συμπεραίνει το systemd.
Αποφάσισε ποια συνθήκη χρειάζεται η υπηρεσία πριν επιλέξεις το έναυσμα, γιατί οι τρεις υποψήφιοι δεν είναι εναλλάξιμοι.
Τι παρακολουθεί στην πραγματικότητα η μονάδα συσκευής
Το systemd δημιουργεί μια μονάδα συσκευής από την άποψη του πυρήνα για μια διεπαφή δικτύου, οπότε το tun0.device γίνεται ενεργό όταν εμφανίζεται η διεπαφή και ανενεργό όταν αφαιρείται. Με το persist-tun, μια ήπια επανεκκίνηση κρατά τη διεπαφή στη θέση της, οπότε η μονάδα δεν αναβοσβήνει ποτέ και τίποτα δεμένο πάνω της δεν ενεργοποιείται. Ακόμη και χωρίς επιμονή, η μονάδα δεν λέει τίποτα για διαδρομές, DNS ή αν το απομακρυσμένο άκρο απαντά.
Αυτό την κάνει κακό υποκατάστατο για το «το VPN είναι έτοιμο». Ένας ακροατής που χρειάζεται μόνο την τοπική διεύθυνση μπορεί να ικανοποιηθεί από την ύπαρξη της διεπαφής, ενώ μια υπηρεσία που καλεί μια εφαρμογή στο απομακρυσμένο δίκτυο χρειάζεται διαδρομές και προσβασιμότητα, που η μονάδα συσκευής δεν μπορεί να εκφράσει.
up, route-up και up-restart σημαίνουν διαφορετικά πράγματα
Το up εκτελείται αφού ανοίξει η συσκευή TUN/TAP και διαμορφωθεί η διεπαφή, που είναι η σωστή στιγμή για έναν ακροατή που δεσμεύει τη διεύθυνση που του ανατέθηκε. Το route-up εκτελείται αφού εγκατασταθούν οι διαδρομές, υπόκειται σε οποιαδήποτε ρυθμισμένη καθυστέρηση διαδρομής, και ταιριάζει σε εργασία που χρειάζεται ολοκληρωμένο το στάδιο των διαδρομών. Κανένα από τα δύο δεν αποδεικνύει ότι η απομακρυσμένη εφαρμογή απαντά. Η επιλογή μεταξύ τους είναι ερώτημα για το τι χρειάζεται η υπηρεσία, όχι για το ποιο άγκιστρο ακούγεται πιο ολοκληρωμένο.
Με το persist-tun, οι επανεκκινήσεις επαναχρησιμοποιούν τη συσκευή, οπότε το up δεν εκτελείται ξανά εκτός αν έχει οριστεί το up-restart. Αυτή η επιλογή ενεργοποιεί το σενάριο up για τον τεκμηριωμένο κύκλο ζωής επανεκκίνησης, και το περιβάλλον του είναι μειωμένο σε σύγκριση με μια πρώτη εκκίνηση. Ένα σενάριο που υποθέτει το πλήρες περιβάλλον λειτουργεί στην πρώτη σύνδεση και αποτυγχάνει στην επόμενη.
Στείλε την ενέργεια χωρίς να την περιμένεις
Ένα άγκιστρο που καλεί το systemctl restart σύγχρονα μπορεί να αδιεξοδωθεί απέναντι σε μια μονάδα της οποίας η σειρά περιμένει το τούνελ. Το systemctl --no-block try-restart vpn-dependent.service βάζει την εργασία σε ουρά και επιστρέφει, κάτι που εμποδίζει το άγκιστρο να μπλοκάρει τη σύνδεση στην οποία αντιδρούσε. Το try-restart δρα μόνο σε μια μονάδα που τρέχει, ενώ το restart ξεκινά και μια ανενεργή· διάλεξε σκόπιμα, όχι από συνήθεια.
Η ουρά δεν είναι επαλήθευση. Το άγκιστρο επιστρέφει επιτυχία μόλις γίνει δεκτή η εργασία, οπότε ο έλεγχος πρέπει να γίνει στο ημερολόγιο της μονάδας-στόχου ή στην πραγματική κατάσταση του ακροατή της.
Η πολιτική επανεκκίνησης ζει στη μονάδα, όχι στο άγκιστρο
Μια μονάδα oneshot με το RemainAfterExit=yes παραμένει ενεργή αφού βγει η εντολή της, και ένα δεύτερο αίτημα εκκίνησης δεν κάνει τίποτα γιατί το systemd τη θεωρεί ήδη εκκινημένη. Αυτό είναι μια ιδιότητα γύρω από την οποία σχεδιάζεις, όχι ένα ελάττωμα που παρακάμπτεται με επαναλαμβανόμενες κλήσεις εκκίνησης. Αν η ενέργεια πρέπει να τρέχει ανά σύνδεση, η μονάδα χρειάζεται μια μορφή που το επιτρέπει.
Το After= ταξινομεί μονάδες, και το BindsTo= δένει διάρκειες ζωής, αλλά κανένα από τα δύο δεν σημαίνει «επανεκκίνησέ το όποτε το VPN επανασυνδέεται». Μια μονάδα δεμένη στο τούνελ σταματά όταν σταματά το τούνελ· δεν επανεκκινεί τον εαυτό της όταν το τούνελ επιστρέφει, εκτός αν κάτι την ξεκινήσει ξανά.
Δοκίμασε τρεις επανασυνδέσεις, όχι μία
Η ψυχρή εκκίνηση, μια πλήρης επανεκκίνηση πελάτη και μια ήπια επανασύνδεση ασκούν η καθεμία διαφορετικό μονοπάτι. Η ήπια επανασύνδεση είναι αυτή που αποκαλύπτει ένα up-restart που λείπει, ένα μειωμένο περιβάλλον ή μια μονάδα συσκευής που δεν έγινε ποτέ ανενεργή. Τρέξε και τις τρεις και επιβεβαίωσε και τις δύο κατευθύνσεις: η υπηρεσία ενεργεί όταν σηκώνεται το τούνελ, και δεν επανεκκινείται σε άσχετες αλλαγές ζεύξης όπως μια περιπλάνηση Wi-Fi.
Κράτησε ένα ανεξάρτητο μονοπάτι ανάκτησης όταν η εξαρτημένη υπηρεσία φέρει τη δική σου πρόσβαση διαχείρισης. Ένα άγκιστρο που επανεκκινεί το πράγμα μέσα από το οποίο είσαι συνδεδεμένος είναι μια αλλαγή που μπορεί να σε κλειδώσει έξω.