Τι πραγματικά διατηρούν τα persist-tun και persist-key στο OpenVPN
Και οι δύο επιλογές καλύπτουν μια ήπια επανεκκίνηση μέσα σε μια ζωντανή διεργασία. Δεν διατηρούν τη διεπαφή μετά από μια διακοπή και δεν αποτελούν πολιτική αποκλεισμού της κίνησης.
Η διακοπή της υπηρεσίας αφαιρεί τη διεπαφή ακόμη και με το persist-tun ρυθμισμένο. Αυτή είναι η επιλογή που λειτουργεί όπως τεκμηριώνεται, όχι μια αποτυχία. Η επιλογή περιγράφει μία διαδρομή επανεκκίνησης μέσα σε μια διεργασία που εκτελείται, και το systemctl stop δεν είναι αυτή η διαδρομή.
Διαβάστε τα δύο ονόματα μαζί και ο σχεδιασμός γίνεται σαφής. Το ένα κρατά έναν περιγραφέα, το άλλο κρατά υλικό κλειδιού, και τα δύο υπάρχουν εξαιτίας αυτού που συμβαίνει μετά την απόρριψη των προνομίων.
Οι δύο πόροι και η επανεκκίνηση στην οποία ανήκουν
OpenVPN σηματοδοτεί τη δική του επανεκκίνηση σε δύο συνηθισμένες καταστάσεις. Ένα ρητό SIGUSR1 το κάνει, και ένα ping-restart που προκαλείται από έναν νεκρό ομότιμο κάνει το ίδιο. Και τα δύο αφήνουν τη διεργασία ζωντανή και εκτελούν ξανά τη ρύθμιση της σύνδεσης, και εκεί οι επιλογές κερδίζουν τη θέση τους.
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
Μόνο η σειρά της ήπιας επανεκκίνησης είναι αυτό που αλλάζουν αυτές οι δύο επιλογές, και η εργασία που παραλείπουν είναι το ακριβό μέρος σε έναν πολυάσχολο σύνδεσμο. Το άνοιγμα μιας συσκευής ξανά γκρεμίζει τις διευθύνσεις και τις διαδρομές που είναι συνδεδεμένες με αυτήν, και η ανακατασκευή τους μπορεί να ρίξει πακέτα που ήταν εν κινήσει όταν άρχισε η επανεκκίνηση. Μια διακοπή καταστρέφει τα ίδια αντικείμενα χωρίς καμία επιλογή να τα διατηρήσει.
Γιατί υπάρχουν καθόλου αυτές οι επιλογές
Ένας σκληρυμένος διακομιστής OpenVPN ξεκινά συνήθως ως root, ανοίγει τα κλειδιά και τη συσκευή του και μετά πέφτει σε έναν χρήστη χωρίς προνόμια. Μετά από αυτή την πτώση, ορισμένες λειτουργίες απλώς χάνονται. Η ανάγνωση ενός αρχείου κλειδιού με λειτουργία 0600, η δημιουργία μιας διεπαφής δικτύου ή η αλλαγή διαδρομών μπορούν όλα να απορριφθούν.
Χωρίς τις επιλογές persist, ένας ομότιμος που σωπαίνει αρκετά ώστε να προκαλέσει ping-restart θα επέβαλλε ακριβώς αυτές τις λειτουργίες. Η επανασύνδεση θα αποτύγχανε ακόμα κι αν τίποτα στη διαμόρφωση δεν είχε αλλάξει. Η διεργασία θα φαινόταν να πεθαίνει χωρίς λόγο, και το αρχείο καταγραφής θα έδειχνε σφάλμα δικαιωμάτων αντί για σφάλμα δικτύου.
Με αυτές, η ήπια επανεκκίνηση επαναχρησιμοποιεί ό,τι έχει ήδη αποκτήσει η φάση με προνόμια. Δεν υπάρχει μαγεία και η διεργασία δεν επιβιώνει τίποτα. Η απόκτηση πόρων απλώς αναβάλλεται.
Διαβάστε το πρώτο σφάλμα, όχι το τελευταίο
Όταν μια επανεκκίνηση αποτύχει, διαβάστε το πρώτο σφάλμα αντί για το τελευταίο. Ένα προστατευμένο κλειδί, ένα αρχείο auth, ένα ioctl διεπαφής και ένα εξωτερικό hook είναι τέσσερις διαφορετικοί πόροι. Το να κρατήσετε έναν δεν λέει τίποτα για την πρόσβαση στους άλλους. Ένα hook που καλεί ένα εργαλείο τείχους προστασίας εξακολουθεί να χρειάζεται τα προνόμια που απαιτεί αυτό το εργαλείο.
Τα hooks έχουν τον δικό τους διακόπτη. Το εγχειρίδιο του OpenVPN συνδυάζει τις επιλογές persist με το up-restart, το οποίο αποφασίζει αν τα σενάρια up και down εκτελούνται ξανά μετά από μια επανεκκίνηση. Μια διεπαφή που έμεινε πάνω επομένως δεν σας λέει τίποτα για το αν ανανεώθηκε η ενσωμάτωση του resolver σας.
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
Αυτό το ζεύγος εντολών χωρίζει τους δύο τρόπους αποτυχίας σε δευτερόλεπτα. Μια διεπαφή που υπάρχει με διαδρομές που λείπουν είναι πρόβλημα hook ή διαδρομής. Μια διεπαφή που εξαφανίστηκε σημαίνει ότι η διεργασία πράγματι τελείωσε.
Μια διατηρημένη διεπαφή δεν είναι kill switch
Αν η απαίτηση είναι η κίνηση να μην αφήνει ποτέ το τούνελ, μια διατηρημένη συσκευή δεν το παρέχει. Οι διαδρομές για την άλλη οικογένεια διευθύνσεων, μια δεύτερη προεπιλεγμένη διαδρομή και η περίπτωση όπου η διεργασία τερματίζεται πλήρως παραμένουν όλες εκτός του πεδίου της επιλογής.
Χειριστείτε τις δύο απαιτήσεις ξεχωριστά. Το να κρατάτε το αντικείμενο του τούνελ ανάμεσα στις επανασυνδέσεις είναι διευκόλυνση για τον δαίμονα. Ο αποκλεισμός της εξόδου όταν το τούνελ είναι κάτω είναι πολιτική τείχους προστασίας με τους δικούς της κανόνες και τη δική της δοκιμή. Η συγχώνευσή τους παράγει μια διαμόρφωση που φαίνεται αμυντική και συμπεριφέρεται σαν επανασύνδεση με την καλύτερη προσπάθεια.
Ονομάστε το συμβάν πριν το διαγνώσετε. Μια ήπια επανεκκίνηση, μια αποτυχημένη προσπάθεια σύνδεσης και μια διακοπή της υπηρεσίας είναι τρία συμβάντα με τρεις συμπεριφορές, και μόνο το πρώτο είναι αυτό που περιγράφουν αυτές οι επιλογές.