Το AnyConnect πέφτει όταν κλείνει ένα τερματικό: έλεγχοι συνεδρίας
Ο πελάτης AnyConnect για Linux θυμάται τις συνεδρίες σύνδεσης που ήταν ανοιχτές κατά τη σύνδεση και ρίχνει το τούνελ όταν κλείσει μία από αυτές. Ελέγξτε τη σειρά πριν ξαναγράψετε το utmp.
Το τούνελ είναι ενεργό, κλείνετε ένα εφεδρικό τερματικό και το VPN πέφτει χωρίς ούτε ένα πάτημα πλήκτρου στον πελάτη. Στον πελάτη AnyConnect για Linux η αναφερόμενη αιτία είναι η λογιστική των συνεδριών και όχι η δρομολόγηση: ο πελάτης καταγράφει ποιες συνεδρίες σύνδεσης υπήρχαν όταν σηκώθηκε το τούνελ και θεωρεί το τέλος οποιασδήποτε από αυτές λόγο για να το γκρεμίσει. Οι έλεγχοι παρακάτω εκτελούνται με σειρά και ο πρώτος που αποτυγχάνει σας λέει αν κοιτάτε καθόλου αυτή τη συμπεριφορά. Τίποτε στη συνηθισμένη έξοδο του πελάτη δεν αναφέρει τερματικό, γι' αυτό το πρώτο ένστικτο, να κατηγορήσετε τον concentrator, είναι συνήθως χαμένος κόπος.
Μην ξεκινήσετε επεξεργάζοντας αρχεία συστήματος. Κάθε βήμα είτε εξηγεί την πτώση είτε αφαιρεί έναν υποψήφιο, και τα φθηνά βήματα έρχονται πρώτα.
Ξεχωρίστε μια πτώση συνεδρίας από μια πτώση του υποκείμενου δικτύου
Επανασυνδεθείτε αμέσως μετά την αποσύνδεση. Ένα τούνελ που επιστρέφει μέσα σε δευτερόλεπτα, στο ίδιο δίκτυο, χωρίς νέα διαπιστευτήρια, δείχνει τοπικό έναυσμα όπως μια κλειστή συνεδρία και όχι νεκρό uplink, περιαγωγή Wi-Fi ή χρονικό όριο αδράνειας στον concentrator. Ένα τούνελ που κολλάει στο Connecting ή αποτυγχάνει μέχρι να αλλάξετε δίκτυο είναι άλλο άρθρο.
Σημειώστε τι ήταν ανοιχτό όταν σηκώθηκε το τούνελ: το τερματικό από το οποίο εκτελέσατε τον πελάτη, οποιοδήποτε δεύτερο κέλυφος, τη γραφική σύνδεση και οποιαδήποτε συνεδρία SSH από άλλο μηχάνημα. Θα χρειαστείτε αυτή τη λίστα σε λίγο, και η ανακατασκευή της από μνήμης μετά την επόμενη πτώση δεν είναι αξιόπιστη.
Ελέγξτε τι κατέγραψε ο πελάτης κατά τη σύνδεση
Ο πελάτης δεν εξετάζει γονικές διεργασίες ή ιδιοκτησία τερματικού. Παίρνει ένα στιγμιότυπο του συνόλου των συνεδριών σύνδεσης που υπήρχαν κατά τη σύνδεση και συγκρίνει αυτό το σύνολο αργότερα· όταν ένα μέλος εξαφανιστεί, η σύγκριση αποτυγχάνει και το τούνελ φεύγει μαζί του. Γι' αυτό το κλείσιμο του παραθύρου από το οποίο συνδεθήκατε μπορεί να είναι ακίνδυνο, ενώ το κλείσιμο ενός άσχετου εφεδρικού τερματικού σκοτώνει τη σύνδεση: αυτό που μετράει είναι αν εκείνη η συνεδρία ήταν στο αρχικό σύνολο. Ο έλεγχος είναι σύγκριση συνόλων και όχι μέτρημα, γι' αυτό η αντικατάσταση μιας συνεδρίας μπορεί να είναι εξίσου μοιραία με την απώλεια μιας.
Καταγράψτε τι μπορούσε να δει ο πελάτης πριν αλλάξετε οτιδήποτε:
who
w
last -n 10
sudo ls -l /run/utmpΚάθε γραμμή από το who είναι μια εγγραφή διεργασίας χρήστη στο utmp. Αν η συνεδρία σας εμφανίζεται δύο φορές, μία για τη γραφική σύνδεση και μία για το τερματικό, και οι δύο εγγραφές υπήρχαν κατά τη σύνδεση και οι δύο είναι υποψήφιες.
Αφαιρέστε μόνο τη δική σας εγγραφή από το utmp
Η δημοσιευμένη λύση κάνει τη συνεδρία που πρόκειται να χρησιμοποιήσετε αόρατη στο utmp πριν ξεκινήσει ο πελάτης. Ένα μικρό πρόγραμμα σε C διατρέχει το getutent(), βρίσκει την εγγραφή της οποίας το ut_line ισούται με το TTY της τυπικής εισόδου και έπειτα ξαναγράφει αυτή την εγγραφή. Η σειρά είναι σκόπιμη: setutent(), διαβάστε την εγγραφή, αντιγράψτε το ut_id της, θέστε το ut_type σε DEAD_PROCESS, καθαρίστε τα πεδία χρήστη και γραμμής, γράψτε την πίσω με το pututline() και μετά endutent().
Μεταγλωττίστε το και μετά εκτελέστε το ως root από το κέλυφος που θα ξεκινήσει τον πελάτη:
sudo ./utmpremove && /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.eduΔύο τρόποι αποτυχίας εξηγούν τις περισσότερες αναφορές ότι το εργαλείο δεν κάνει τίποτε. Δρα στο TTY που είναι συνδεδεμένο στην τυπική είσοδο, οπότε η εκτέλεση από σενάριο ή εργασία cron χωρίς τερματικό δεν του αφήνει τίποτε να ταιριάξει. Και το /run/utmp δεν είναι εγγράψιμο από απλούς χρήστες, οπότε μια εκτέλεση χωρίς root αποτυγχάνει σιωπηλά αν δεν ελέγξετε την κατάσταση εξόδου.
Επιβεβαιώστε ότι το τούνελ επιβιώνει του κλεισίματος
Δοκιμάστε τον μηχανισμό αντί να τον υποθέσετε. Συνδεθείτε από μια συνεδρία που σκοπεύετε να κρατήσετε, ανοίξτε δεύτερο τερματικό, κλείστε το δεύτερο και μετά επιβεβαιώστε ότι το τούνελ είναι ακόμη ενεργό με το vpn state και μια ματιά στη λίστα διεπαφών. Αν το τούνελ επιβιώσει, το έναυσμα ήταν συγκεκριμένος τύπος συνεδρίας και όχι κάθε συνεδρία, και βρήκατε τη συνεδρία που πρέπει να μείνει ανοιχτή.
Αν πέφτει ακόμη, η συνεδρία που παρακολουθούνταν ήταν αλλού, συνήθως η γραφική σύνδεση που γέννησε το τερματικό σας, και η αφαίρεση μιας εγγραφής TTY δεν θα βοηθήσει. Επαναλάβετε την παρατήρηση με την πλήρη λίστα από το πρώτο βήμα αντί να προσθέτετε περισσότερη χειρουργική.
Πότε η επανεγγραφή του utmp είναι η λάθος απάντηση
Το utmp είναι κοινή λογιστική, όχι ιδιωτικός πίνακας. Η επανεγγραφή της εγγραφής μιας συνεδρίας που είναι ακόμη ζωντανή κάνει τα who, w και ορισμένα εργαλεία ελέγχου να την αναφέρουν λιγότερο από το πραγματικό, και ένα πρόγραμμα που αργότερα κλείνει την ίδια εγγραφή μπορεί να αποτύχει εντελώς. Κρατήστε το εργαλείο περιορισμένο στη δική σας συνεδρία, κρατήστε αντίγραφο του αρχικού αρχείου και μην το μετατρέψετε σε υπηρεσία εκκίνησης που αφαιρεί κάθε εγγραφή.
Αν ο οργανισμός σας συλλέγει λογιστική συνεδριών για συμμόρφωση, η λύση συγκρούεται με αυτή την απαίτηση και η υποστηριζόμενη απάντηση είναι άλλη έκδοση πελάτη ή διαφορετική μέθοδος πρόσβασης, όχι ένα utmp με μπάλωμα. Για τους περισσότερους, η λιγότερο επεμβατική διόρθωση είναι απλώς να ξεκινούν τον πελάτη από μια συνεδρία που θα μείνει ανοιχτή όλη μέρα και να αφήνουν εκείνο το παράθυρο ήσυχο.
Πριν κλείσετε το αίτημα, καταγράψτε ποια συνεδρία παρακολουθούσε ο πελάτης όταν σηκώθηκε το τούνελ. Αυτή η μία γραμμή είναι που μετατρέπει μια μυστηριώδη αποσύνδεση σε αναπαραγώγιμη συνθήκη για τον επόμενο άνθρωπο στο μηχάνημα.