Προσθέσατε ένα όνομα στο /etc/hosts, συνδεθήκατε στο VPN και περιμένατε η εγγραφή να εμφανιστεί για όλους. Δεν συμβαίνει αυτό, και η έκπληξη συνήθως έρχεται με ένα δεύτερο σύμπτωμα: το όνομα επιλύεται στον υπολογιστή σας και αποτυγχάνει σε έναν συνάδελφο, που μοιάζει με χαλασμένη υπηρεσία DNS του VPN και στην πραγματικότητα είναι το αρχείο hosts που κάνει ακριβώς αυτό για το οποίο σχεδιάστηκε. Ένα αρχείο hosts είναι τοπική ρύθμιση επίλυσης ονομάτων, όχι ενημέρωση ζώνης, και τίποτα σε μια κανονική σύνδεση VPN δεν το ανεβάζει.

Το hosts είναι τοπική παράκαμψη, όχι ενημέρωση ζώνης

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

Γι’ αυτό η αποτυχία είναι ασύμμετρη. Ο πελάτης σας παίρνει απάντηση από το αρχείο. Ένας άλλος πελάτης ρωτά τον διακομιστή DNS του VPN, ο οποίος δεν επιστρέφει τίποτα, και η εφαρμογή αναφέρει ότι το όνομα δεν υπάρχει. Και οι δύο υπολογιστές συμπεριφέρονται σωστά· μόνο ο ένας έχει μια παράκαμψη που ο άλλος δεν έχει δει ποτέ.

Δύο εντολές, δύο διαφορετικά συστατικά

Ο γρηγορότερος τρόπος να σταματήσετε τη συζήτηση είναι να κάνετε τη διαφορά ορατή σε δύο εντολές, και οι δύο εκτελούμενες στον πελάτη που έχει την καταχώριση hosts:

getent ahosts build.corp.example
dig @10.40.0.53 build.corp.example A

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

Η σειρά είναι ρυθμίσιμη, και αξίζει να την ελέγξετε πριν συμπεράνετε οτιδήποτε για μια συγκεκριμένη διανομή. Δείτε τη γραμμή hosts: στο /etc/nsswitch.conf· το hosts: files dns συμβουλεύεται πρώτα τα αρχεία. Μην αντιγράψετε αυτό το παράδειγμα πάνω σε μια λειτουργική ρύθμιση μόνο για να αλλάξετε τη σειρά, γιατί τα πραγματικά συστήματα συχνά απαριθμούν πρόσθετες πηγές και υπό όρους καταχωρίσεις υπηρεσιών που το παράδειγμα δεν περιέχει.

Το systemd-resolved θολώνει τη δοκιμή

Σε ένα σύστημα που χρησιμοποιεί systemd-resolved, το τοπικό stub εξυπηρετεί επίσης ονόματα από τη βάση δεδομένων hosts. Επομένως το ερώτημα στο 127.0.0.53 δεν είναι ανεξάρτητη δοκιμή του απομακρυσμένου διακομιστή, παρόλο που μοιάζει με ερώτημα DNS και συμπεριφέρεται σαν ένα. Μπορείτε να επιβεβαιώσετε τι γνωρίζει ο resolver και ποιους διακομιστές θα ρωτούσε με:

resolvectl query build.corp.example
resolvectl status

Η έξοδος status ονομάζει τους διακομιστές DNS ανά σύνδεσμο, και έτσι ανακαλύπτετε αν ο σύνδεσμος VPN έλαβε καθόλου resolver. Αυτό το ερώτημα είναι ξεχωριστό από την καταχώριση hosts και είναι αυτό που αξίζει να τεθεί όταν ένα ιδιωτικό όνομα αποτυγχάνει για κάθε χρήστη και όχι για έναν.

Οι εφαρμογές μπορούν να προσθέσουν άλλο ένα επίπεδο. Ένα πρόγραμμα περιήγησης με τη δική του ρύθμιση DNS-over-HTTPS, ένα container με τη δική του ρύθμιση resolver ή ένα περιβάλλον εκτέλεσης που αποθηκεύει προσωρινά αναζητήσεις για όλη τη διάρκεια ζωής της διεργασίας μπορούν καθένα να απαντήσει διαφορετικά από το σύστημα. Δοκιμάστε την εφαρμογή που σας ενδιαφέρει αντί να υποθέσετε ότι μία εντολή περιγράφει κάθε πρόγραμμα στον υπολογιστή.

Τι μοιράζεται πραγματικά ένα όνομα μέσω του VPN

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

Η διανομή αρχείων hosts είναι μια νόμιμη εναλλακτική, και είναι διαχείριση τελικών σημείων και όχι υπηρεσία ονομάτων. Αν την επιλέξετε, το αρχείο πρέπει να αναπτυχθεί, να εκδοθεί και να αφαιρεθεί από ό,τι διαχειρίζεται τον στόλο, και έτσι πρέπει να περιγραφεί στον σχεδιασμό. Το «το VPN το αναλαμβάνει» δεν είναι περιγραφή αυτής της διαδικασίας.

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

Ένα όνομα που επιλύεται δεν είναι διαδρομή

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

Έτσι, όταν η αναφορά λέει «το όνομα επιλύεται αλλά η υπηρεσία δεν είναι προσβάσιμη», συγκρίνετε την αναζήτηση του συστήματος με ένα ρητό ερώτημα στον διακομιστή DNS του VPN και μετά ελέγξτε τη διεύθυνση που λάβατε με αυτή που χρησιμοποιεί πραγματικά η υπηρεσία. Η αναφορά του systemd-resolved τεκμηριώνει τις τοπικές πηγές που συμβουλεύεται, και αυτός είναι ο χάρτης που χρειάζεστε για αυτή τη σύγκριση.

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

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