Δοκιμή εναλλαγής: επιβιώνει μια εδραιωμένη ροή TCP;
Μια εφεδρική έξοδος μπορεί να δέχεται κάθε νέα σύνδεση και παρόλα αυτά να σπάει τη μεταφορά που ήδη τρέχει. Δοκιμάστε και τα δύο αποτελέσματα και κρατήστε την περίπτωση επιστροφής στο σχέδιο.
Δύο αποτελέσματα κρύβονται μέσα στη φράση ότι το εφεδρικό λειτουργεί. Ένα νέο αίτημα πετυχαίνει, κι αυτό είναι αποκατάσταση. Μια μεταφορά που ήδη βρίσκεται σε εξέλιξη συνεχίζεται, κι αυτό είναι συνέχεια. Είναι διαφορετικές υποσχέσεις, και τα περισσότερα σχέδια εναλλαγής παρέχουν την πρώτη ενώ η δεύτερη λήγει σιωπηρά. Αποφασίστε ποια χρειάζεστε πριν επιλέξετε μηχανισμό, και γράψτε τη δοκιμή ώστε να μπορεί να τις ξεχωρίσει.
Δύο αποτελέσματα που μοιάζουν με μία επιτυχία
Φανταστείτε έναν πελάτη στο 10.90.0.42 με σύνδεση προς το 198.51.100.20:443. Η κύρια έξοδος το μεταφράζει σε μία δημόσια διεύθυνση και θύρα, και η εφεδρική έξοδος το μεταφράζει σε άλλη. Η εσωτερική διεύθυνση του πελάτη δεν αλλάζει ποτέ, γι' αυτό οι άνθρωποι περιμένουν ότι η σύνδεση θα επιβιώσει.
Ο διακομιστής δεν βλέπει εσωτερική διεύθυνση. Βλέπει το μεταφρασμένο τελικό σημείο, και αυτό το σημείο είναι διαφορετικό μετά την εναλλαγή.
Έτσι η παλιά ροή λήγει ενώ μια νέα σύνδεση στην ίδια υπηρεσία λειτουργεί αμέσως. Και οι δύο παρατηρήσεις ισχύουν ταυτόχρονα.
Τι βλέπει ο διακομιστής όταν αλλάζει η έξοδος
Μια σύνδεση TCP αναγνωρίζεται από την τετράδα της, και η αλλαγή της διεύθυνσης ή της θύρας προέλευσης δημιουργεί διαφορετική σύνδεση από την πλευρά του υποδοχέα που λαμβάνει. Πακέτα που φτάνουν από νέα προέλευση σε σύνδεση που ο διακομιστής δεν γνωρίζει απορρίπτονται ή απαντώνται με επαναφορά. Τίποτα στη διεύθυνση του πελάτη VPN δεν διατηρεί τη συσχέτιση μέσα από αυτή την αλλαγή.
Η εναλλαγή με κατάσταση υπάρχει ακριβώς για να το αποφεύγει, και λειτουργεί ανταλλάσσοντας κατάσταση μετάφρασης και κατάσταση συνδέσεων ανάμεσα στις συσκευές προώθησης. Είναι χαρακτηριστικό του ζεύγους, όχι της σήραγγας, και πρέπει να σχεδιαστεί και να δοκιμαστεί αντί να υποτεθεί.
Ελέγξτε αν το ζεύγος κρατά πραγματικά κατάσταση πριν υποσχεθείτε συνέχεια σε οποιονδήποτε. Οι εντολές παρακάτω δείχνουν την τρέχουσα κατάσταση και στις δύο πλευρές.
conntrack -L -d 198.51.100.20 2>/dev/null | head
ss -tin dst 198.51.100.20
tcpdump -ni any host 198.51.100.20 -c 10Γιατί η ίδια δημόσια διεύθυνση δεν αρκεί
Το να κρατήσετε μία δημόσια διεύθυνση και στις δύο διαδρομές είναι καλή αρχή, γιατί τότε ο διακομιστής βλέπει το ίδιο τελικό σημείο προέλευσης. Από μόνο του όμως δεν αρκεί. Η συσκευή προώθησης χρειάζεται ακόμη την κατάσταση μετάφρασης, την κατάσταση του τείχους προστασίας και μια χρησιμοποιήσιμη διαδρομή επιστροφής, και αυτά πρέπει να υπάρχουν στη συσκευή που μεταφέρει την κίνηση μετά την εναλλαγή.
Το RFC 3022 περιγράφει τη μετάφραση διευθύνσεων και θεωρεί την ανταλλαγή κατάστασης ανάμεσα στις συσκευές μετάφρασης μέρος ενός εφεδρικού σχεδίου. Μια πλωτή διεύθυνση ή ένα αντιγραμμένο προφίλ μετακινεί τη διαμόρφωση χωρίς να μετακινεί την κατάσταση.
Γι' αυτό μια δοκιμή που κάνει μόνο ping μέσα από το εφεδρικό αποδεικνύει ελάχιστα. Το ping δεν έχει κατάσταση σύνδεσης για να χάσει.
Αποφασίστε πόσο ισχυρή είναι η απαίτηση
Αν οι χρήστες μπορούν να επανασυνδεθούν μετά από αστοχία, το σχέδιο είναι σχέδιο αποκατάστασης και η δοκιμή αποδοχής είναι ένα νέο αίτημα. Αν μια μεταφορά αρχείου πρέπει να επιβιώσει, το σχέδιο χρειάζεται συγχρονισμό κατάστασης και πολύ προσεκτικότερη δοκιμή. Αν μια απομακρυσμένη συνεδρία πρέπει να επιβιώσει, η απαίτηση είναι ακόμη ισχυρότερη και μπορεί να χρειάζεται μηχανισμό σε επίπεδο εφαρμογής αντί για επίπεδο δικτύου.
Γράψτε την απαίτηση ως πρόταση με μετρήσιμο αποτέλεσμα, για παράδειγμα η μεταφόρτωση ολοκληρώνεται χωρίς επανεκκίνηση ή ο χειριστής επανασυνδέεται μέσα σε ένα λεπτό. Έπειτα επιλέξτε τον φθηνότερο μηχανισμό που την ικανοποιεί, και αυτός είναι συχνά το σχέδιο αποκατάστασης.
Πείτε ρητά τι συμβαίνει όταν επιστρέφει η κύρια διαδρομή, γιατί μια αυτόματη επιστροφή μπορεί να διακόψει σύνδεση που μόλις είχε ανακάμψει στο εφεδρικό. Αυτή η περίπτωση ανήκει στο σχέδιο δοκιμών, όχι σε υποσημείωση.
Ελέγξτε την παλιά ροή και το νέο αίτημα
Ξεκινήστε μια ακίνδυνη μακρά μεταφορά μέσα από την κύρια διαδρομή, έπειτα ένα ξεχωριστό νέο αίτημα στην ίδια υπηρεσία. Καταγράψτε το πλαίσιο της εφαρμογής, την παρατηρούμενη διεύθυνση εξόδου και την ώρα. Διακόψτε την κύρια διαδρομή με εγκεκριμένο τρόπο και συνεχίστε να παρακολουθείτε την αρχική μεταφορά ενώ στέλνετε το νέο αίτημα μέσα από το εφεδρικό.
Αναφέρετε τρεις τιμές: αν η παλιά ροή συνεχίστηκε, επαναφέρθηκε ή έληξε· πότε λειτούργησε για πρώτη φορά η νέα λειτουργία· και αν η επιστροφή διέκοψε κάτι. Αυτές οι τρεις γραμμές είναι το αρχείο αποδοχής.
ss -tin dst 198.51.100.20
curl -sS -o /dev/null -w '%{http_code} %{time_total}\n' https://198.51.100.20/
tcpdump -ni any port 443 -c 20Αν το φορτίο εργασίας γράφει δεδομένα, μην επαναλαμβάνετε στα τυφλά μια αβέβαιη λειτουργία μετά από λήξη χρόνου. Η εγγραφή μπορεί να έφτασε πριν χαθεί η απάντηση. Ρωτήστε την εφαρμογή για το αποτέλεσμα, ή επαναλάβετε μόνο όπου η λειτουργία είναι αδύναμη ως προς την επανάληψη. Έπειτα γράψτε τη δήλωση αποδοχής σε τρία μέρη: οι νέες λειτουργίες ανακάμπτουν σύμφωνα με την πολιτική εξόδου, οι υπάρχουσες ροές έχουν την τεκμηριωμένη συμπεριφορά διακοπής, και η εφαρμογή συνεχίζει με ασφάλεια. Αυτή η δήλωση είναι ελέγξιμη και ειλικρινής για το τι δεν υπόσχεται το σχέδιο.