Η σήραγγα είναι κάτω, αλλά το μηχάνημα εξακολουθεί να συμπεριφέρεται σαν να είναι πάνω: μια αναζήτηση κρέμεται μέχρι να λήξει το χρονικό όριο, και μια διαδρομή δείχνει σε μια διεπαφή που δεν υπάρχει πια. Αυτή είναι η υπογραφή μιας διεργασίας openconnect που πέθανε χωρίς να εκτελέσει τον βοηθό αποσύνδεσής της. Η κατάσταση δικτύου που δημιούργησε είναι ακόμη εγκατεστημένη, και τίποτα άλλο στο σύστημα δεν ξέρει πώς να την αφαιρέσει.

Περπατήστε το μηχάνημα με τη σειρά που δημιουργήθηκε η κατάσταση: διεργασία, ζεύξη, διαδρομή, resolver. Κάθε βήμα σάς λέει αν ο πελάτης έφυγε πραγματικά ή απλώς αποσπάστηκε από το τερματικό σας, και αυτή η διάκριση καθορίζει αν θα επιδιορθώσετε κάτι καθόλου.

Ξεκινήστε από τη διεργασία, όχι από τη διαμόρφωση

Ανοίξτε ένα τερματικό και ρωτήστε τι τρέχει ακόμη πριν αγγίξετε μια διαδρομή. pgrep -a openconnect παραθέτει κάθε στιγμιότυπο με τα ορίσματά του, που δείχνει το αρχείο pid και το σενάριο που του δόθηκε. Μια διεργασία που δεν περιμένατε εξηγεί τη σήραγγα-φάντασμα ταχύτερα από οποιοδήποτε αρχείο καταγραφής.

Αν δεν τρέχει τίποτα, κοιτάξτε τη ζεύξη. ip link show tun0 σας λέει αν η διεπαφή επιβίωσε, και ip route show dev tun0 παραθέτει διαδρομές που είναι ακόμη δεσμευμένες σε αυτήν. Στη συνέχεια ελέγξτε τον resolver με resolvectl status. Καταγράψτε και τις τρεις εξόδους πριν τις αλλάξετε, γιατί αυτή η καταγραφή είναι ο τρόπος να ξεχωρίσετε αργότερα μια παρωχημένη εγγραφή από μια νέα.

Μια διεπαφή που έχει φύγει συνήθως παίρνει τις διαδρομές της μαζί της. Διαδρομές που επιβιώνουν της ζεύξης συνήθως σημαίνουν ότι η διεργασία είναι ακόμη ζωντανή ή ότι ένας δεύτερος πελάτης κατέχει τη συσκευή.

Το σενάριο βοηθός είναι αυτό που αναιρεί τις αλλαγές

Το openconnect δεν αφαιρεί το ίδιο τη διεπαφή, τις διαδρομές ή τις εγγραφές resolver. Καλεί έναν εξωτερικό βοηθό, /etc/vpnc/vpnc-script σε μια upstream έκδοση και /usr/share/vpnc-scripts/vpnc-script στα πακέτα Debian και Ubuntu, επιλεγμένο με -s. Το ίδιο σενάριο που σηκώνει τη σήραγγα είναι αυτό που τη διαλύει.

Αν η διεργασία εξέλθει χωρίς να καλέσει αυτόν τον βοηθό, η κατάσταση μένει. Το εγχειρίδιο του OpenConnect είναι ρητό ότι η δρομολόγηση και η υπηρεσία ονομάτων δεν θα λειτουργήσουν σωστά χωρίς το σενάριο, και περιγράφει τον βοηθό ως το συστατικό που αποσυναρμολογεί την κατάσταση της διεπαφής κατά την έξοδο. Γι’ αυτό η διαδρομή έχει σημασία όταν εκκινείτε τον πελάτη με -s.

Ποιο σήμα φτάνει σε αυτή τη διαδρομή άλλαξε μεταξύ εκδόσεων. Το εγχειρίδιο της 7.06 αντιμετωπίζει το SIGTERM ως άμεση έξοδο που παραλείπει το σενάριο. Οι τρέχουσες εκδόσεις τεκμηριώνουν τα INT και TERM ως καθαρό σταμάτημα, όπου η συνεδρία αποσυνδέεται και ο βοηθός εκτελείται. Διαβάστε την ενότητα SIGNALS του δυαδικού που έχετε πραγματικά αντί να υποθέτετε οποιαδήποτε από τις δύο συμπεριφορές.

man openconnect | sed -n '/^SIGNALS/,/^LIMITATIONS/p'

Στείλτε το σήμα που τεκμηριώνει η έκδοσή σας

Όταν ξέρετε το σήμα, σταματήστε τη διεργασία με βάση το pid και όχι με βάση το μοτίβο.

pgrep -a openconnect
sudo kill -INT "$(cat /var/run/openconnect.pid)"

Στη συνέχεια επαναλάβετε τους τρεις ελέγχους από την πρώτη ενότητα αντί να εμπιστεύεστε την κατάσταση εξόδου. ip link show tun0 θα έπρεπε να αποτύχει, ip route show dev tun0 δεν θα έπρεπε να εκτυπώσει τίποτα, και resolvectl status δεν θα έπρεπε πλέον να παραθέτει τη ζεύξη VPN.

Το SIGHUP δεν είναι κουμπί διακοπής: αποσυνδέει, εκτελεί το σενάριο και αφήνει τη συνεδρία επαναλήψιμη με --cookie. Το SIGUSR2 επιβάλλει άμεση επανασύνδεση. Το SIGKILL παραλείπει εντελώς τον καθαρισμό, που είναι ακριβώς η κατάσταση για την οποία μιλά αυτό το άρθρο.

Επιδιορθώστε τον resolver χωρίς να αντικαταστήσετε το resolv.conf

Στα περισσότερα συστήματα Ubuntu /etc/resolv.conf είναι συμβολικός δεσμός μέσα στο systemd-resolved, όχι αρχείο που θα πρέπει να επεξεργαστείτε. Η αντικατάστασή του σπάει την επίλυση ονομάτων για κάθε δίκτυο, όχι μόνο για το VPN. Αφαιρέστε αντ’ αυτού την καταχώριση της σήραγγας:

resolvectl revert tun0
resolvectl query example.com

Αν το σύστημα χρησιμοποιεί resolvconf αντί για systemd-resolved, η εγγραφή ανά διεπαφή παραμένει μέχρι να της ειπωθεί να αφήσει τη ζεύξη, και resolvconf -d tun0 είναι η ισοδύναμη ενέργεια. Ελέγξτε ποιος resolver χρησιμοποιείται πριν επιλέξετε την εντολή.

Μια αναζήτηση που εξακολουθεί να στοχεύει διακομιστή πίσω από τη νεκρή ζεύξη κρέμεται μέχρι να λήξει το χρονικό όριο, και αυτή η καθυστέρηση μοιάζει με χαλασμένο διακομιστή DNS παρά με εναπομείνασα διαδρομή.

Κάντε την επόμενη αποσύνδεση βαρετή

Κρατήστε τη διαδρομή του αρχείου pid ίδια στην εκκίνηση και στον τερματισμό περνώντας --pid-file κάθε φορά, ή εκτελέστε το openconnect κάτω από μια μονάδα της οποίας το KillSignal ταιριάζει με το σήμα που τεκμηριώνει η έκδοσή σας. Η δοκιμή πρώτα στο προσκήνιο σάς δείχνει τα μηνύματα τερματισμού που εκτυπώνει ο βοηθός.

Συνδεθείτε, αποσυνδεθείτε και εκτελέστε τους τρεις ελέγχους μία φορά. Μια καθαρή έξοδος δεν αφήνει ζεύξη VPN, διαδρομή VPN ή εγγραφή resolver VPN. Αν ένα από τα τρία επιβιώσει, ξέρετε πλέον ποιο συστατικό απέτυχε να καθαρίσει. Η επόμενη έρευνα ξεκινά τότε από αυτή την απάντηση και όχι από μια κρεμασμένη αναζήτηση.

Σχετικά άρθρα