Γιατί πεθαίνει το OpenVPN όταν ξυπνά το φορητό;
Η αναστολή μπορεί να σκοτώσει τη συνεδρία OpenVPN αφήνοντας πίσω το tun0. Δοκιμάστε τη σήραγγα και μετά επανεκκινήστε τη μονάδα από άγκιστρο ύπνου του systemd, όχι τη συσκευή.
Αναστείλετε το μηχάνημα, επαναφέρετέ το και μετά ελέγξτε τρία πράγματα με αυτή τη σειρά πριν αγγίξετε οποιαδήποτε ρύθμιση: αν το tun0 υπάρχει ακόμη, αν η διαδρομή προς μια εσωτερική διεύθυνση το επιλέγει ακόμη και αν ο διακομιστής εξακολουθεί να καταγράφει αυτόν τον peer. Μια συσκευή που επιβιώνει του ύπνου ενώ η διαδρομή δείχνει αλλού είναι υπόλειμμα, όχι σήραγγα. Όταν η διαδρομή είναι σωστή και η κίνηση πεθαίνει παρόλα αυτά, το σφάλμα βρίσκεται πάνω από τη σήραγγα και η επανεκκίνηση του πελάτη δεν θα το αλλάξει. Το να αυτοματοποιήσετε μια επανεκκίνηση έχει νόημα μόνο αφού μια χειροκίνητη δοκιμή δείξει ποια από τις τρεις περιπτώσεις έχετε.
ip -br address show tun0
ip route get 10.20.0.10
journalctl -u openvpn-client@office -b --no-pager | tail -30
Αναπαράγετε την επαναφορά πριν την αυτοματοποιήσετε
Η αναστολή τερματίζει την κρυπτογραφημένη συνεδρία πιο συχνά από ό,τι αφαιρεί τη συσκευή. Η ροή UDP που κρατούσε τη σήραγγα ζωντανή σταματά, ο διακομιστής μπορεί να απορρίψει τον peer και ο πελάτης είτε το αντιλαμβάνεται και επανασυνδέεται είτε κρατά μια διεπαφή με τίποτα πίσω της. Ο έλεγχος της διεπαφής από μόνος του αποδεικνύει λίγα, επειδή μια παλιά συσκευή μοιάζει ακριβώς με μια που δουλεύει μέχρι να πρέπει τα πακέτα να περάσουν από μέσα της. Εκτελέστε την αναζήτηση διαδρομής μαζί με ένα πραγματικό αίτημα μέσα από τη σήραγγα και μετά διαβάστε το ημερολόγιο γύρω από τη στιγμή της επαναφοράς.
Αν ο πελάτης επιστρέψει μόνος του, ένα άγκιστρο προσθέτει φασαρία αντί για αξιοπιστία. Αν δεν ανακάμψει ποτέ, η αυτοματοποίηση είναι η έντιμη λύση.
Πού ζει στην πραγματικότητα ένα άγκιστρο ύπνου του systemd
Πολλοί παλαιότεροι οδηγοί δείχνουν το /etc/pm/sleep.d, έναν κατάλογο που ανήκει στο pm-utils και δεν τον συμβουλεύεται ποτέ μια αναστολή βασισμένη στο systemd. Το systemd διαβάζει άγκιστρα από το /usr/lib/systemd/system-sleep/ και το /etc/systemd/system-sleep/, περνώντας πρώτα τη φάση και δεύτερη τη λειτουργία, οπότε το pre και το post είναι οι μόνες τιμές στις οποίες διακλαδίζεται ένα άγκιστρο. Κρατήστε το τοπικό αντίγραφο κάτω από το /etc αντί να επεξεργάζεστε ένα αρχείο του πακέτου, και θυμηθείτε ότι το σενάριο εκτελείται ως root στη μέση της μετάβασης, άρα πρέπει να επιστρέφει γρήγορα.
#!/bin/sh
case "$1" in
post)
systemctl --no-block try-restart [email protected]
;;
esac
exit 0
Το try-restart αγγίζει μια μονάδα μόνο όταν είναι ήδη ενεργή, οπότε μια σήραγγα που κλείσατε επίτηδες παραμένει κλειστή σε όλη την επαναφορά. Το --no-block εμποδίζει το άγκιστρο να περιμένει όσο ο πελάτης διαπραγματεύεται, κάτι που μετράει όταν το δίκτυο δεν έχει σηκωθεί ακόμη. Μαζί, οι δύο σημαίες σημαίνουν ένα άγκιστρο που αποτυγχάνει ήσυχα αντί να κρατά ολόκληρη την ακολουθία επαναφοράς. Όταν η μονάδα είναι ήδη σταματημένη δεν συμβαίνει απολύτως τίποτα, που είναι ακριβώς το αποτέλεσμα που θέλετε εκεί.
Ανακτήστε την υπηρεσία, αφήστε το tun0 ήσυχο
Το να κατεβάσετε το tun0 με το χέρι αφήνει τον δαίμονα να επιβλέπει μια διεπαφή που δεν κατέχει πια, και η επόμενη αλλαγή κατάστασης παράγει μπερδεμένα σφάλματα. Στοχεύστε την υπηρεσία ή το προφίλ σύνδεσής της αντί για τη διεπαφή· ελέγξτε πρώτα το ακριβές όνομα της μονάδας, γιατί τα πακέτα διανομών, το OpenVPN 3 και το NetworkManager επιλέγουν διαφορετικά. Ένα προφίλ του NetworkManager επιστρέφει όταν ανακυκλωθεί αυτή η σύνδεση, άρα η μονάδα του systemd δεν είναι ο στόχος εκεί. Όποιος κι αν είναι ο μηχανισμός, θα πρέπει να είναι η ίδια ενέργεια που επαληθεύσατε με το χέρι.
Μια επανεκκίνηση επανεγκαθιστά τις διαδρομές που έσπρωξε ο πελάτης όταν συνδέθηκε. Οι περισσότερες επαναφορές το θέλουν αυτό. Ένα μηχάνημα όπου προσθέσατε δικές σας διαδρομές δεν το θέλει, οπότε ελέγξτε τις ξανά αντί να υποθέσετε ότι η ανάκτηση τις επανέφερε, και σημειώστε τις εκεί όπου η επόμενη επαναφορά μπορεί να τις βρει.
Χειριστείτε τον χρονισμό που δεν ελέγχετε
Η ασύρματη συσχέτιση και το DHCP συχνά ολοκληρώνονται αφού έχει τρέξει το άγκιστρο, οπότε μια επανεκκίνηση μπορεί να αποτύχει ενώ δεν υπάρχει ακόμη διαδρομή προς τον διακομιστή. Περιμένετε λίγο για αυτή τη διεύθυνση, δοκιμάστε μία φορά ακόμη και καταγράψτε το αποτέλεσμα.
Η επίλυση ονομάτων είναι ένας ξεχωριστός αγώνας, γιατί η στοίβα δικτύου της επιφάνειας εργασίας μπορεί να επαναφέρει το DNS αφού η σήραγγα είναι ήδη πάνω. Δοκιμάστε τις αναζητήσεις μόνες τους με το resolvectl query internal.example αντί να τις συμπεράνετε από μια διαδρομή που δουλεύει. Μια σήραγγα που δρομολογεί σωστά και δεν επιλύει τίποτα είναι πρόβλημα DNS, όχι πρόβλημα άγκιστρου.
Κρατήστε την απόφαση του άγκιστρου ορατή γράφοντας τη φάση, το όνομα της μονάδας και το αποτέλεσμα στο ημερολόγιο. Σημειώστε στις σημειώσεις του μηχανήματος ποια δοκιμή επαναφοράς τρέξατε, ώστε μια λειτουργική ανάκτηση να ξεχωρίζει από μια τυχερή. Διαλέξτε τη λιγότερο διαταρακτική ενέργεια που επαναφέρει την υπηρεσία και αφήστε έναν πελάτη που ανακάμπτει μόνος του να το κάνει. Μια πλήρης επανεκκίνηση ρίχνει τις συνεδρίες σε εξέλιξη, που είναι πραγματικό κόστος σε ένα φορητό που επαναφέρεται αρκετές φορές την ημέρα.