Διακόπτης θανάτου μετά από αλλαγή από Wi-Fi σε κινητό: τι σπάει
Ο διακόπτης θανάτου γράφεται πάνω σε ονόματα διεπαφών που αντικαθιστά μια αλλαγή δικτύου. Ελέγξτε την εξωτερική διαδρομή, τις οικογένειες διευθύνσεων και τον resolver πριν τον εμπιστευτείτε.
Τη μια στιγμή το laptop είναι στο Wi-Fi του γραφείου, την επόμενη είναι συνδεδεμένο σε τηλέφωνο, και η ένδειξη της σήραγγας είναι πάλι πράσινη πριν προλάβετε να αλλάξετε παράθυρα. Το πράσινο φως αναφέρει μόνο ότι η σήραγγα επανασυνδέθηκε· τι έκανε η πολιτική δρομολόγησης και αποκλεισμού κατά το κενό είναι άλλο ερώτημα. Αυτή η πολιτική είναι ένα σύνολο συνθηκών αντιστοίχισης που μεταγλωττίστηκαν κατά την τελευταία εγκατάσταση και ονομάζουν μια διεπαφή, μια διεύθυνση και μια οικογένεια διευθύνσεων που η μετάβαση μόλις αφαίρεσε. Η ίδια αλλαγή παράγει επομένως τρία αποτελέσματα που φαίνονται ίδια: ο αποκλεισμός συνεχίζεται, η πολιτική αποκλείει την ανάκτησή της, ή ανοίγει μια διαδρομή που τίποτα δεν καλύπτει.
Τίποτα στην οθόνη δεν ξεχωρίζει αυτές τις τρεις καταστάσεις, οπότε ρωτήστε σε ποια αναγνωριστικά ήταν καρφωμένοι οι κανόνες αντί για το τι χρώμα δείχνει η ένδειξη. Στο Linux ένας κανόνας μπορεί να ονομάζει μια διεπαφή ή ένα ipset που γεμίζει από αυτήν· στο Android μπορεί να ειπωθεί σε ένα VpnService ποια υποκείμενα δίκτυα να ακολουθεί μέσω του setUnderlyingNetworks. Κάθε σύνδεση δείχνει σε έναν δεσμό που πρόκειται να αντικατασταθεί, και κάθε μία πρέπει να επαναξιολογηθεί μετά.
Τι ξαναγράφει στην πραγματικότητα η μετάβαση
Όταν ο παλιός δεσμός εξαφανιστεί, ο πυρήνας αφαιρεί τις διευθύνσεις του, αποσύρει τις διαδρομές που περνούσαν από αυτόν και ξαναχτίζει την επιλογή διεύθυνσης προέλευσης από ό,τι απομένει. Η προεπιλεγμένη διαδρομή μετακινείται στη νέα πύλη, και ο δείκτης διεπαφής στον οποίο αναφέρονταν οι παλιοί κανόνες έχει φύγει ή ανακυκλωθεί για άλλη συσκευή. Οι resolver ανά δεσμό ανανεώνονται επίσης, αν και όχι την ίδια στιγμή με τις διαδρομές. Όλα αυτά συμβαίνουν κάτω από τον πελάτη VPN, οπότε ένας πελάτης που παρακολουθεί μόνο την κατάσταση της δικής του σήραγγας δεν βλέπει τίποτα από αυτά.
Το πρόβλημα είναι ότι ένας κανόνας κωδικοποιεί ένα συγκεκριμένο αναγνωριστικό αντί για την πρόθεση πίσω του. Ένας κανόνας που πετάει ό,τι δεν φεύγει από τη διεπαφή της σήραγγας κωδικοποιεί ένα όνομα διεπαφής· ένας κανόνας που επιτρέπει το τελικό σημείο κωδικοποιεί μια διεύθυνση που το νέο δίκτυο μπορεί να δρομολογήσει αλλού. Όταν το αναγνωριστικό εξαφανιστεί, ο κανόνας δεν γίνεται εμφανώς λάθος· είτε σταματά να αντιστοιχίζεται με οτιδήποτε είτε αρχίζει να αντιστοιχίζεται με το λάθος πράγμα.
Ξαναχτίζοντας την εξωτερική σήραγγα χωρίς να ανοίξεις τρύπα
Η εξωτερική μεταφορά ήταν δεσμευμένη στην παλιά διεύθυνση προέλευσης, οπότε πρέπει να ανοίξει μια νέα υποδοχή από τη νέα. Όταν το τελικό σημείο είναι όνομα κεντρικού υπολογιστή και όχι κυριολεκτική διεύθυνση, μια αναζήτηση πρέπει να πετύχει ενόσω ο αποκλεισμός ισχύει ακόμη. Αυτή είναι η παγίδα της σειράς: μια πολιτική αρκετά αυστηρή ώστε να πετάει τα πάντα εκτός από το τελικό σημείο θα πετάξει και την αναζήτηση που χρειάζεται για να το βρει, εκτός αν η επίλυση γίνει πριν σηκωθεί ο αποκλεισμός ή μεταφερθεί μέσα από σήραγγα που είναι ακόμη ζωντανή. Οποιαδήποτε από τις δύο σειρές μπορεί να δουλέψει, αλλά μόνο αν ο πελάτης ξέρει σε ποια σειρά βρίσκεται.
Οι πελάτες διαφέρουν εδώ με τρόπο που μετράει όταν κάνετε διάγνωση. Κάποιοι επιλύουν πρώτα και εγκαθιστούν κανόνες μετά, οπότε μια μετάβαση κοστίζει μια ορατή διακοπή και μετά ανακάμπτει μόνη της· άλλοι κρατούν τον αποκλεισμό και βασίζονται στη σήραγγα που επιβίωσε για να μεταφέρει την αναζήτηση, κάτι που αποτυγχάνει εντελώς όταν η σήραγγα πέθανε μαζί με τον δεσμό. Η προσθήκη μιας ευρείας άμεσης προεπιλογής για αποκατάσταση συνδεσιμότητας κάνει πάντα το τεστ να περνάει και αφήνει πάντα τη διαρροή που αποτρέπατε.
Μια διαδρομή που δείχνει ακόμη στην παλιά πύλη δίνει την ίδια κολλημένη ανάκτηση από άλλη αιτία, οπότε διαβάστε τον πίνακα πριν κατηγορήσετε τον πελάτη. Οι εντολές παρακάτω ονομάζουν τη διεπαφή και τη διεύθυνση προέλευσης που θα χρησιμοποιούσε πραγματικά ο πυρήνας, και αυτό ξεκαθαρίζει σε μία γραμμή αν η παλιά διαδρομή είναι ακόμη εγκατεστημένη.
ip route get 1.1.1.1
ip -6 route get 2606:4700:4700::1111Όταν ο νέος δεσμός φέρνει IPv6 και οι κανόνες όχι
Τα δίκτυα κινητής και επισκεπτών δίνουν συχνά ένα καθολικό πρόθεμα IPv6 ακόμη και όταν το ενσύρματο LAN του γραφείου δεν το έκανε ποτέ. Μια πολιτική γραμμένη μόνο ως κανόνες IPv4, η προεπιλεγμένη μορφή των περισσότερων χειροποίητων συνταγών iptables και nftables, δεν καλύπτει τίποτα από αυτά. Η σήραγγα μένει συνδεδεμένη, οι εφαρμογές με προσβασιμότητα IPv6 βγαίνουν έξω από αυτήν, και η ένδειξη δεν μπορεί να δείξει τη διαφορά επειδή η σήραγγα είναι πραγματικά πάνω. Η κατοπτρική περίπτωση είναι εξίσου συνηθισμένη: ένα σύνολο κανόνων μόνο για IPv6 δεν κάνει τίποτα σε δίκτυο που δεν προσφέρει v6.
Συγκρίνετε τι προσφέρει ο δεσμός με τι αναφέρει η πολιτική, και στις δύο πλευρές της μετάβασης. Αυτές οι εντολές εκτυπώνουν τα ίδια γεγονότα με τα οποία δουλεύει ο πελάτης:
ip -4 route show default
ip -6 route show default
sudo nft list ruleset | grep -c 'ip6 'Αν η δεύτερη εντολή εκτυπώνει προεπιλεγμένη διαδρομή ενώ η τρίτη επιστρέφει μηδέν, ο νέος δεσμός μπορεί να βγάλει το μηχάνημα έξω μέσω IPv6 χωρίς κανέναν κανόνα να το προσέχει. Τρέξτε ξανά και τις τρεις μετά την αλλαγή, γιατί ο ενδιαφέρων αριθμός είναι η διαφορά μεταξύ των δύο εκτελέσεων. Αν η δεύτερη δεν εκτυπώσει τίποτα, ισχύει η αντίστροφη περίπτωση και κάθε πολιτική βαριά σε v6 εκεί είναι απλώς διακόσμηση.
Ο resolver αλλάζει χέρια στη μέση της συνεδρίας
Στα σύγχρονα συστήματα οι resolver είναι συνδεδεμένοι με δεσμούς, οπότε ένας νέος δεσμός φτάνει με νέο σύνολο resolver και ίσως με διαφορετική όψη split-DNS. Το systemd-resolved κρατά ένα scope ανά δεσμό και επιλέγει μεταξύ τους κατά διαδρομή, ενώ το macOS διαβάζει scoped resolver από τον δυναμικό χώρο αποθήκευσης και σέβεται τη σειρά των διεπαφών. Ένας πελάτης που εγκαθιστά τον δικό του resolver συναγωνίζεται αυτόν του δεσμού, και κανόνες προτεραιότητας που κανείς δεν προσέχει αποφασίζουν τον νικητή. Τότε η επίλυση ονομάτων μπορεί να σπάσει ενώ το φιλτράρισμα πακέτων κάνει ακριβώς αυτό για το οποίο γράφτηκε.
Διαβάστε τον resolver που είναι ενεργός και όχι αυτόν που έχει ρυθμιστεί. Σε κεντρικό υπολογιστή systemd η υποεντολή status δείχνει από ποιον δεσμό ήρθε κάθε scope και αν ισχύει όνομα private-DNS:
resolvectl status --no-pager
resolvectl query intranet.example.comΑν το ερώτημα φεύγει από τον φυσικό δεσμό και όχι από τη σήραγγα, ο πελάτης έχασε τον διαγωνισμό προτεραιότητας και καμία ρύθμιση τείχους προστασίας δεν θα διορθώσει την ονοματοδοσία. Συγκρίνετε τη διαδρομή του ερωτήματος και στις δύο πλευρές της μετάβασης για να δείτε ποια μετακινήθηκε. Ένα όνομα που επιλύεται σε ιδιωτική διεύθυνση που το νέο δίκτυο δεν μπορεί να δρομολογήσει είναι τρίτη περίπτωση, και εμφανίζεται ως λήξη χρόνου και όχι ως σφάλμα.
Εξασκηθείτε στη μετάβαση και κρατήστε αρχείο
Αναπαράγετε την αλλαγή επίτηδες αντί να την περιμένετε. Σηκώστε τη σήραγγα στον πρώτο δεσμό, ξεκινήστε μια μακρόχρονη μεταφορά και μια επαναλαμβανόμενη αναζήτηση, μετά αλλάξτε τον δεσμό και δείτε ποια επιβιώνει. Σημειώστε το διάστημα ανάμεσα στην εξαφάνιση του παλιού δεσμού και στην αναφορά της σήραγγας ότι συνδέθηκε, γιατί σε αυτό το παράθυρο η πολιτική είτε κράτησε είτε όχι. Τρέξτε την ακολουθία και προς την άλλη κατεύθυνση, ώστε το αποτέλεσμα να μην είναι μονόπλευρο.
Οι εξαιρέσεις χρειάζονται δικό τους πέρασμα, γιατί μια παράκαμψη που δικαιολογήθηκε στο παλιό δίκτυο δεν δικαιολογείται αυτόματα στο νέο. Ένας εκτυπωτής, ένα NAS ή μια captive portal στο οικιακό LAN δεν έχει αντίστοιχο στην κινητή, και η εξαίρεση που το έφτανε γίνεται κανόνας χωρίς αντίστοιχο.
Γράψτε τα ονόματα των διεπαφών, τις οικογένειες που προσφέρονται, τον resolver που ισχύει και τη διάρκεια της διακοπής για κάθε κατεύθυνση. Μια επανασύνδεση αποδεικνύει ότι η μεταφορά ανακάμπτει, όχι ότι ο αποκλεισμός κράτησε κατά το κενό, και αυτοί είναι ξεχωριστοί ισχυρισμοί για ένα δελτίο. Με αυτό το αρχείο η επόμενη μετάβαση συγκρίνεται με γνωστή κατάσταση και όχι με τη μνήμη.