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

Δώστε σε κάθε προφίλ τη δική του τοπική θύρα

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

Local Port 0

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

Τα αρχεία προφίλ περιέχουν διαπιστευτήρια, οπότε τα δικαιώματα ανήκουν στον σχεδιασμό και όχι στις δουλειές του σπιτιού. Ένα αρχείο αναγνώσιμο από όλους κάτω από το /etc/vpnc δίνει το ομαδικό μυστικό σε κάθε τοπικό χρήστη. Κρατήστε τη λειτουργία στο 0600 με ιδιοκτήτη το root και αφήστε τα σενάρια να διαβάζουν το αρχείο ως root αντί να αντιγράφουν μυστικά σε ορίσματα. Γι’ αυτό άλλωστε ένα σενάριο ελέγχου δεν πρέπει ποτέ να γράφει το περιεχόμενο του αρχείου σε καταγραφή.

Ελέγξτε μία υπηρεσία ανά προφίλ, όχι τη διεύθυνση της σήραγγας

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

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

#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
  /usr/sbin/vpnc-connect ops.conf
fi

Αποθηκεύστε το ως /usr/local/bin/ensure-vpn-ops.sh, κάντε το εκτελέσιμο και επαναλάβετε για κάθε προφίλ αλλάζοντας μόνο τον στόχο του ελέγχου και το όνομα ρύθμισης. Ένας έλεγχος που απαντά σε ερώτηση πρωτοκόλλου επιβιώνει από πύλες που ρίχνουν την ηχώ ενώ ακόμη προωθούν τις υπηρεσίες που νοιάζουν τους χρήστες.

Αλυσοδέστε τους ελέγχους ώστε να μην παραβγαίνουν ποτέ

Το έτοιμο σενάριο επανασύνδεσης μπορεί να καλεί τους ελέγχους σας διαδοχικά, και η διαδοχή είναι όλο το νόημα. Δύο κλήσεις vpnc-connect που τρέχουν μαζί ξαναγράφουν τον πίνακα δρομολόγησης με σειρά που κανείς δεν ελέγχει, και έτσι ένα υγιές προφίλ χάνει τη διαδρομή του.

Κρατήστε τις κλήσεις στο προσκήνιο, προσθέστε μια σύντομη καθυστέρηση σταθεροποίησης για την υποκείμενη διεπαφή και προγραμματίστε την αλυσίδα από τον πίνακα cron του root, αφού μόνο ο root μπορεί να ξαναγράψει τις διαδρομές της σήραγγας:

#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.sh

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

Παρακολουθήστε την καταγραφή και μετά σπάστε μία επίτηδες

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

Μετά σπάστε επίτηδες μια σήραγγα και δείτε τι συμβαίνει. Σταματήστε ένα μόνο προφίλ και επιβεβαιώστε ποιες διεργασίες και διαδρομές υπάρχουν ακόμη:

pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.log

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

Τι δεν πρέπει να κάνει ο φύλακας

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

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

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