--reconnect-timeout απαντά σε ένα στενό ερώτημα: μετά την πτώση της σήραγγας, πόσο καιρό αυτή η διεργασία-πελάτης συνεχίζει να προσπαθεί πριν τα παρατήσει και τερματιστεί. Η σελίδα εγχειριδίου του OpenConnect καταγράφει αυτή την επιλογή με τεκμηριωμένη προεπιλογή 300 δευτερολέπτων για επαναλήψεις που ακολουθούν απώλεια ζεύξης ή ομότιμο που σταμάτησε να απαντά, και ο αριθμός είναι προθεσμία για έναν πελάτη σε λειτουργία, όχι απόδειξη ότι το VPN παραμένει προσβάσιμο. Δεν είναι επίσης πολιτική διατήρησης της διεργασίας ζωντανής, και εκεί αρχίζει το μεγαλύτερο μέρος της σύγχυσης.

Η σύγχυση μεγαλώνει όταν από πάνω κάθεται δεύτερος μηχανισμός. Ένας επόπτης που επανεκκινεί τον πελάτη, ένας ανιχνευτής που κάνει ping στην πύλη και το ενσωματωμένο παράθυρο επαναλήψεων μπορούν όλοι να αντιδράσουν σε μία αστοχία, και το περιστατικό παράγει τότε τρία χρονοδιαγράμματα που κανείς δεν μπορεί να συμβιβάσει.

Τι πραγματικά περιορίζει το παράθυρο επανασύνδεσης

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

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

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

Οι επανεκκινήσεις του επόπτη και οι επαναλήψεις του πελάτη είναι δύο επίπεδα

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

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

sudo openconnect --background --pid-file=/run/openconnect/vpn.pid \
  --reconnect-timeout=180 \
  --user=<account> https://vpn.example.edu

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

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

Πώς να μην προλάβει η παράδοση τον βρόχο επαναλήψεων

Η ασυνόδευτη ανάκαμψη εξαρτάται από διαπιστευτήρια που ανανεώνονται χωρίς παρουσία ατόμου. Ένα κλειδοθήκη που ξεκλειδώνει μόνο μέσα σε διαδραστική συνεδρία επιφάνειας εργασίας, ή ένα token που απαιτεί πάντα πληκτρολογημένο κωδικό, θα αφήσει τον πελάτη κολλημένο στο στάδιο αυθεντικοποίησης μόλις επιστρέψει η διαδρομή. Τακτοποιήστε αυτή τη ροή πριν επιμηκύνετε το παράθυρο, γιατί ένα μακρύτερο παράθυρο δίνει απλώς στην ίδια μπλοκαρισμένη προτροπή περισσότερο χρόνο να αποτύχει.

Η επαλήθευση του διακομιστή δεν πρέπει να χαλαρώνει για να μειωθούν οι προτροπές. Το pin ή το άγκιστρο εμπιστοσύνης που επικυρώνει την πύλη είναι αυτό που κάνει ασφαλή μια αυτόματη επανασύνδεση, και η απενεργοποίησή του για να αποφευχθεί μια ερώτηση πιστοποιητικού ανταλλάσσει μια ορατή διακοπή με μια αόρατη. Κρατήστε την επαληθευμένη ταυτότητα και διορθώστε την προτροπή· ένας πελάτης πρόθυμος να συνδεθεί με οποιαδήποτε πύλη είναι χειρότερος από έναν που σταματά και περιμένει.

Ούτε η παρουσία της διεπαφής είναι σήμα υγείας. Μια συσκευή σήραγγας μπορεί να υπάρχει με νεκρή συνεδρία από πίσω, και μια διεργασία εκκίνησης μπορεί να υπάρχει χωρίς καθόλου σήραγγα. Καμία από αυτές τις παρατηρήσεις δεν αντέχει σε ένα πραγματικό αίτημα. Η υγεία πρέπει να προέρχεται από αυτό που χρειάζεται ο χρήστης, όπως ένα αίτημα που διασχίζει τη σήραγγα προς μια γνωστή εσωτερική υπηρεσία.

Τι να επαληθεύσετε κατά τη διάρκεια και μετά από μια διακοπή

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

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

curl -sS --max-time 5 -o /dev/null -w '%{http_code}\n' https://intranet.example.internal/health
cat /run/openconnect/vpn.pid
ps -o pid,etime,cmd -p "$(cat /run/openconnect/vpn.pid)"

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

Για τη σκόπιμη διακοπή, το URL υγείας πρέπει να παραμένει μη προσβάσιμο και η διεργασία πρέπει να παραμένει κάτω. Στη συνέχεια κλείστε τον βρόχο από την πλευρά της εφαρμογής: το ίδιο αίτημα πρέπει να αποτυγχάνει όσο λείπει η σήραγγα και να πετυχαίνει αφού επιστρέψει, από τη διεύθυνση προέλευσης που περιμένει η πολιτική σας. Ένα πράσινο εικονίδιο σήραγγας δεν είναι απόδειξη, αλλά ένα ολοκληρωμένο αίτημα είναι.

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