Η επανεκκίνηση του πελάτη VPN αποδεικνύει μόνο ότι η σήραγγα επέστρεψε. Δεν λέει τίποτα για το proxy που έλαβε εντολή να βγει μέσα από αυτήν. Το Squid, το tinyproxy και οι περισσότεροι άλλοι προωθητές κρατούν την τοπική διεύθυνση προέλευσης που απέκτησαν κατά την εκκίνηση, μέχρι κάτι να τους αναγκάσει να επαναφορτώσουν. Όταν μια επανασύνδεση δώσει νέα διεύθυνση σήραγγας, ο προωθητής είτε αποτυγχάνει σε κάθε εξερχόμενη σύνδεση είτε αρχίζει να βγαίνει μέσω της συνηθισμένης διαδρομής σας.

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

Ξεκινήστε από τον listener, όχι από τη σήραγγα

Τρεις διευθύνσεις παίζουν, και μια επανασύνδεση μετακινεί μόνο μερικές από αυτές. Ο listener είναι εκεί όπου δείχνει το πρόγραμμα περιήγησής σας, συνήθως 127.0.0.1 ή μια διεύθυνση LAN, και δεν τον νοιάζει που άλλαξε η σήραγγα. Η εξερχόμενη τοπική προέλευση είναι αυτό που ζητά ο προωθητής από τον πυρήνα όταν καλεί το επόμενο hop, και είναι δεσμευμένη στη συσκευή της σήραγγας. Η δημόσια έξοδος είναι αυτό που καταγράφει ένας διακομιστής ιστού, και μπορεί να είναι μια μεταφρασμένη διεύθυνση αρκετά hops μακριά.

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

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

Τέσσερις έλεγχοι πριν επεξεργαστείτε οτιδήποτε

Περάστε τους με τη σειρά. Ο πρώτος έλεγχος που αποτυγχάνει είναι το σημείο όπου σταματάτε, γιατί οι επόμενοι προϋποθέτουν ότι ισχύουν οι προηγούμενοι.

  1. Επιβεβαιώστε ότι η σήραγγα σε χρήση είναι το προφίλ γύρω από το οποίο χτίστηκε το proxy, όχι ένα δεύτερο προφίλ που συνδέθηκε μόνο του.
  2. Εκτυπώστε τη διεύθυνση που βρίσκεται τώρα σε αυτή τη συσκευή και συγκρίνετέ την με τη διεύθυνση στη ρύθμιση που εκτελείται.
  3. Ρωτήστε τον προωθητή ποια προέλευση απέκτησε, αντί για το τι ισχυρίζεται το αρχείο στον δίσκο.
  4. Επιβεβαιώστε ότι η κίνηση από τον προωθητή υπόκειται πραγματικά στην πολιτική δρομολόγησης και τείχους προστασίας που περιμένετε.

Η διεύθυνση της συσκευής είναι εύκολη: το ip -4 addr show dev tun0 εκτυπώνει την τρέχουσα, και το ip -4 route get 1.1.1.1 δείχνει ποια διεπαφή θα διάλεγε ο πυρήνας για αυτόν τον προορισμό. Ένας προωθητής που δεσμεύει ακριβή διεύθυνση αποτυγχάνει ηχηρά όταν η διεύθυνση εξαφανιστεί. Ένας προωθητής που δεσμεύει συσκευή, ή πέφτει πίσω στην προεπιλεγμένη προέλευση, συνεχίζει να δουλεύει και διαρρέει, και αυτό είναι το ήσυχο αποτέλεσμα.

Ταιριάξτε την τεκμηρίωση με την έκδοση που εκτελείτε, όχι με το πρώτο αποτέλεσμα αναζήτησης. Η οδηγία εξερχόμενης διεύθυνσης του Squid τεκμηριώνεται για v7 και παλαιότερα, και η τεκμηρίωση v8 λέει καθαρά ότι η οδηγία δεν είναι διαθέσιμη εκεί, οπότε ένα σενάριο χτισμένο γύρω της δεν επιβιώνει αυτού του ορίου (δείτε την αναφορά Squid tcp_outgoing_address). Επαληθεύστε με τον parser του ίδιου του προϊόντος πριν επαναφορτωθεί οτιδήποτε: το squid -k parse αναφέρει σφάλματα και τερματίζει χωρίς να αγγίξει τη διεργασία που εκτελείται.

Αριθμήστε κάθε σήραγγα και πετάξτε τις παρωχημένες αλλαγές

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

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

Οι ανοιχτές υποδοχές δεν θα ακολουθήσουν τη νέα διεύθυνση

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

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

Αποδείξτε τη νέα έξοδο με φρέσκο αίτημα

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

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

squid -k parse
sudo squid -k reconfigure
curl -x http://127.0.0.1:3128 -sS -o /dev/null -w '%{http_code} %{remote_ip}\n' https://example.com

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

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