Η επεξεργασία του resolv.conf δεν διορθώνει το DNS μετά την αποσύνδεση του VPN
Ένας νεκρός resolver της σήραγγας στην κορυφή της λίστας κοστίζει ένα timeout ανά αναζήτηση. Ελέγξτε ποιος κατέχει το αρχείο, επαναφέρετε την κατάσταση του συνδέσμου και σταματήστε να επεξεργάζεστε παραγόμενα δεδομένα.
Αποσυνδέετε το VPN, το ping 1.1.1.1 ακόμη απαντά και κάθε αναζήτηση ονόματος κρέμεται πριν η σελίδα τελικά τα παρατήσει. Έπειτα το cat /etc/resolv.conf δείχνει έναν διακομιστή ονομάτων που υπήρξε ποτέ μόνο μέσα στη σήραγγα, συνήθως πρώτο στη λίστα. Η διαγραφή αυτής της γραμμής φαίνεται να το διορθώνει για περίπου δέκα λεπτά, ώσπου μια αναστολή, μια περιαγωγή Wi-Fi ή μια επανεκκίνηση να την επαναφέρει. Το αρχείο που επεξεργαστήκατε δεν είναι η ρύθμιση; είναι μια απεικόνιση της κατάστασης του συνδέσμου που ανήκει σε άλλο στοιχείο.
Γιατί μία παλιά εγγραφή κοστίζει δευτερόλεπτα ανά αναζήτηση
Ο resolver του glibc διατρέχει τη λίστα διακομιστών ονομάτων με σειρά και περιμένει να περάσει ένα timeout πριν δοκιμάσει τον επόμενο, και resolv.conf(5) περιορίζει αυτή τη λίστα σε τρεις εγγραφές. Βάλτε έναν resolver από την πλευρά της σήραγγας, όπως το 10.8.0.1, στην κορυφή αφού χαθεί η σήραγγα, και κάθε αναζήτηση πληρώνει το timeout πριν πέσει σε έναν διακομιστή που απαντά. Γι’ αυτό το σύμπτωμα μοιάζει με νεκρή σύνδεση και όχι με σφάλμα DNS: τα προγράμματα περιήγησης μπλοκάρουν, ξεμένουν από χρόνο και μερικές φορές σερβίρουν μια διεύθυνση από την προσωρινή μνήμη που αργότερα παλιώνει.
Αυτό εξηγεί επίσης γιατί το παράπονο φτάνει ως «το διαδίκτυο είναι χαλασμένο». Ένα ping σε μια διεύθυνση IP αποδεικνύει ότι ο σύνδεσμος είναι εντάξει, κάτι που κάνει τη βλάβη να μοιάζει με της εφαρμογής. Η λίστα resolver είναι το πρώτο πράγμα που διαβάζεται και το τελευταίο που επεξεργάζεται.
Ο μύθος: το resolv.conf είναι αρχείο ρυθμίσεων
Ρωτήστε τι είναι πραγματικά η διαδρομή πριν την αλλάξετε:
ls -l /etc/resolv.conf
readlink -f /etc/resolv.conf
Σε έναν κεντρικό υπολογιστή με systemd-resolved είναι ένας συμβολικός σύνδεσμος προς ένα αρχείο stub που δείχνει στο 127.0.0.53, και οι πραγματικοί διακομιστές ζουν στην κατάσταση ανά σύνδεσμο που εκτυπώνει το resolvectl. Σε έναν κεντρικό υπολογιστή με NetworkManager μπορεί να είναι ένα αρχείο που γράφει ο NetworkManager από την ενεργή σύνδεση. Σε ορισμένους πελάτες κατασκευαστών είναι ένα απλό αρχείο που ξαναγράφεται στη θέση του κατά τη σύνδεση και, αν είστε άτυχοι, δεν αποκαθίσταται ποτέ κατά την αποσύνδεση. Αυτοί είναι τρεις διαφορετικοί ιδιοκτήτες, και η χειροκίνητη επεξεργασία των δύο πρώτων είτε δεν κάνει τίποτα είτε κρατά μέχρι το επόμενο γεγονός δικτύου.
Το resolvectl status είναι η προβολή που λέει την αλήθεια: διακομιστές DNS ανά σύνδεσμο, τομείς δρομολόγησης και αν ο σύνδεσμος της σήραγγας υπάρχει ακόμη. Το resolvectl query example.com πηγαίνει παραπέρα και δείχνει ποια διεπαφή απάντησε. Χρησιμοποιήστε και τα δύο πριν αγγίξετε ένα αρχείο, και έχετε κατά νου ότι ένα πρόγραμμα περιήγησης με δικό του ασφαλές DNS τα αγνοεί όλα.
Βρείτε τον ιδιοκτήτη πριν επεξεργαστείτε οτιδήποτε
Τρία στοιχεία συνήθως ανταγωνίζονται για την ίδια ρύθμιση: το systemd-resolved, ο NetworkManager και ό,τι εγκατέστησε ο πελάτης VPN. Προσδιορίστε πρώτα το ζωντανό:
systemctl is-active systemd-resolved
nmcli connection show --active
ps aux | grep -E "openvpn|wg-quick|vpn"
Αν το resolved είναι ενεργό και ο συμβολικός σύνδεσμος δείχνει στο stub του, το καθολικό αρχείο είναι παραγόμενο και η επεξεργασία σας είναι διακοσμητική. Αν ο NetworkManager κατέχει τη σύνδεση, οι διακομιστές ανήκουν στο προφίλ της σύνδεσης, οπότε η διόρθωση είναι αλλαγή ιδιότητας μέσω nmcli και όχι επεξεργασία αρχείου. Αν τρέχει δαίμονας κατασκευαστή, μόνο η δική του διαδρομή αποκατάστασης επιβιώνει στην επόμενη σύνδεση.
Καθαρίστε την κατάσταση του συνδέσμου που άφησε πίσω ο πελάτης
Ένας σκοτωμένος πελάτης δεν μπορεί να εκτελέσει το άγκιστρο καθαρισμού του. Το SIGKILL δεν μπορεί να συλληφθεί καθόλου, ενώ τα SIGINT και SIGTERM μπορούν, οπότε μια σήραγγα που «απλώς σταμάτησε» μετά από αναγκαστική θανάτωση συχνά αφήνει στη θέση τους και την εγγραφή της διεπαφής και την εγγραφή του resolver. Βρείτε το συγκεκριμένο PID και στείλτε το σήμα μόνο σε εκείνο:
ps aux | grep -E "openvpn|wg-quick"
sudo kill <pid>
resolvectl revert tun0
Μην απλώσετε το χέρι για pkill -f vpn ή killall vpn πριν διαβάσετε την πλήρη λίστα αντιστοιχίσεων. Το -f αντιστοιχεί σε ολόκληρη τη γραμμή εντολών, οπότε μπορεί να τερματίσει ένα σενάριο περιτυλίγματος, μια συνεδρία επεξεργαστή ή μια άσχετη διεργασία της οποίας η διαδρομή περιέχει τη συμβολοσειρά. Το να τερματίσεις τη λάθος διεργασία στη μέση της εκτέλεσης είναι ο τρόπος με τον οποίο ένα πρόβλημα resolver γίνεται χαμένο αρχείο.
Το resolvectl revert επαναφέρει τη ρύθμιση DNS χρόνου εκτέλεσης αυτού του συνδέσμου, που είναι στενότερο από την επανεκκίνηση του resolver και πολύ στενότερο από την επεξεργασία του καθολικού αρχείου. Αν ο σύνδεσμος της σήραγγας έχει χαθεί εντελώς, το systemctl restart NetworkManager ξαναχτίζει την κατάσταση της σύνδεσης και είναι το βήμα στο οποίο τα νήματα των πηγών επιστρέφουν συνεχώς. Προσέξτε έναν διαχειριστή υπηρεσιών με Restart=always, γιατί μπορεί να επαναφέρει έναν σκοτωμένο πελάτη και τις ρυθμίσεις DNS του κατευθείαν πίσω.
Η άλλη κατεύθυνση: DNS που ωθήθηκε και δεν έφτασε ποτέ
Το κατοπτρικό είδωλο της παλιάς εγγραφής είναι μια σήραγγα χωρίς κανέναν χρησιμοποιήσιμο resolver. Μια επιλογή DNS στο προφίλ είναι αίτημα; το στοιχείο που διαχειρίζεται τη σύνδεση πρέπει να το παραδώσει στον resolver. Αν το αρχείο καταγραφής δείχνει ότι ο διακομιστής ελήφθη αλλά ο σύνδεσμος της σήραγγας δεν φέρει ρυθμίσεις DNS, λείπει η ενσωμάτωση, όχι ο διακομιστής.
Δοκιμάστε την παράδοση κάνοντάς την χειροκίνητα, κάτι που χωρίζει το «ο διακομιστής είναι λάθος» από το «κανείς δεν το εφάρμοσε»:
resolvectl dns tun0 10.10.10.10
resolvectl domain tun0 ~.
Ο τομέας δρομολόγησης που πιάνει τα πάντα στέλνει κάθε όνομα σε αυτόν τον σύνδεσμο, που είναι αυτό που θέλει ένας πελάτης πλήρους σήραγγας και αυτό που το διαχωρισμένο DNS δεν πρέπει να χρησιμοποιεί. Αυτές οι ρυθμίσεις εξαφανίζονται στην επόμενη σύνδεση. Για να τις κάνετε μόνιμες στον NetworkManager, απενεργοποιήστε το αυτόματο DNS, ορίστε τον διακομιστή στη σύνδεση και προσθέστε τον τομέα:
nmcli connection modify office ipv4.ignore-auto-dns yes
nmcli connection modify office ipv4.dns 10.10.10.10
nmcli connection modify office ipv4.dns-search "~."
Για μια εταιρική σήραγγα που πρέπει να απαντά μόνο σε εσωτερικά ονόματα, καταγράψτε αυτές τις ζώνες με αρχικό tilde αντί για το πιάσε-τα-πάντα, ώστε τα δημόσια ονόματα να συνεχίσουν να χρησιμοποιούν τον τοπικό resolver.
Λύσεις ανάγκης που γίνονται η επόμενη διακοπή
Η αντιγραφή του resolv.conf πριν από τη σύνδεση και η επαναφορά του μετά είναι νόμιμη γραμμή σε ένα runbook, και είναι λύση ανάγκης και όχι επισκευή. Αποτυγχάνει ακριβώς όταν έχει σημασία, γιατί μια κατάρρευση ή μια αναγκαστική επανεκκίνηση παραλείπει την επαναφορά. Γράψτε το ως λύση ανάγκης ώστε ο επόμενος να μη χτίσει πάνω του.
Η απενεργοποίηση του systemd-resolved και η σκληρή κωδικοποίηση δημόσιων διακομιστών είναι η άλλη δημοφιλής κίνηση. Κάνει τη σύνδεση και την αποσύνδεση προβλέψιμες και αφαιρεί το DNS ανά σύνδεσμο για κάθε άλλο δίκτυο, κάτι που σπάει το διαχωρισμένο DNS για εσωτερικά ονόματα και ακυρώνει τον σκοπό μιας σήραγγας που προορίζεται να κρατά τα ερωτήματα μέσα της. Η εγκατάσταση του resolvconf και το καρφίτσωμα δημόσιων διακομιστών κοστίζει το ίδιο με ένα επιπλέον στρώμα. Αντιμετωπίστε οποιοδήποτε από τα δύο ως διάγνωση: αν αποκαταστήσει την περιήγηση, μάθατε ότι φταίει η ενσωμάτωση του resolver, όχι ότι οι δημόσιοι διακομιστές είναι σωστοί.
Η διαρκής διόρθωση είναι ένας ιδιοκτήτης ανά στρώμα: αποφασίστε ποιο στοιχείο κατέχει το DNS του συνδέσμου της σήραγγας και ποιο το καθολικό προεπιλεγμένο, γράψτε το και αφαιρέστε τα άλλα από τη διαδρομή. Έπειτα επαληθεύστε μετά από μια αποσύνδεση με ένα όνομα που μόνο το VPN επιλύει. Αν ένα ιδιωτικό όνομα ακόμη απαντά, η εγγραφή δεν αφαιρέθηκε; αν δεν επιλύεται τίποτα, το αρχείο δείχνει σε διακομιστή που δεν υπάρχει πια. Και τα δύο φαίνονται στο resolvectl πριν ανοίξετε πρόγραμμα περιήγησης.