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

Διαβάστε τη σειρά των μπλοκ πριν από τις διευθύνσεις

Κάθε καταχώριση ανοίγει με resolver #N και απαριθμεί nameserver[0], μερικές φορές if_index, μια γραμμή flags, reach και, όταν το μπλοκ δεν είναι απλή προεπιλογή, ένα domain και μια λίστα search domain. Ο resolver νούμερο 1 χωρίς τομέα είναι η προεπιλογή που χειρίζεται δημόσια ονόματα. Ό,τι φέρει Scoped στις σημαίες του είναι δεσμευμένο στη διεπαφή που ονομάζει το if_index, και ό,τι σημειώνεται με Supplemental ισχύει μόνο για τους τομείς που απαριθμούνται κάτω από αυτό.

Η επιλογή είναι αντιστοίχιση καταλήξεων. Για ένα όνομα όπως intranet.corp.example, το macOS προτιμά τον resolver του οποίου η καταχώριση domain είναι η μεγαλύτερη ταιριαστή κατάληξη, οπότε ένα μπλοκ με domain : corp.example κερδίζει την προεπιλογή ακόμη και όταν βρίσκεται πολύ χαμηλά στην έξοδο. Το order λύνει τις ισοπαλίες μεταξύ τομέων ίδιου μήκους. Μια πρώτη ματιά σπάνια χρειάζεται περισσότερα: ολόκληρη την έξοδο όταν θέλετε να διαβάσετε ένα μπλοκ από άκρη σε άκρη, τις πρώτες γραμμές για να μάθετε τη σειρά των μπλοκ και ένα φιλτραρισμένο πέρασμα που τυπώνει τις κεφαλίδες των μπλοκ δίπλα στις γραμμές πεδίων. Τα μπλοκ με εύρος εμφανίζονται κάτω από τη δική τους επικεφαλίδα και διαβάζονται σαν συνέχεια της λίστας από πάνω τους, γι’ αυτό κρατήστε μια κεφαλίδα στο οπτικό σας πεδίο όποτε παραθέτετε την έξοδο.

scutil --dns
scutil --dns | sed -n '1,45p'
scutil --dns | grep -nE '^resolver #|^DNS configuration'
scutil --dns | grep -nE 'resolver #[0-9]+|if_index|domain|flags|nameserver'

Αντιστοιχίστε το if_index με τη διεπαφή της σήραγγας

Ένας δείκτης είναι χρήσιμος μόνο αν μπορείτε να ονομάσετε τη διεπαφή πίσω του. Το scutil --nwi απαριθμεί τις πληροφορίες δικτύου που κρατά το σύστημα, μαζί με την κύρια διεπαφή και την προσβασιμότητα, ενώ το ifconfig -l σας δίνει τα ονόματα, όπου τα utun0 έως utun9 είναι οι υποψήφιες σήραγγες που δημιουργεί συνήθως ένας πελάτης. Η Apple χρησιμοποιεί το scutil --dns ως δικό της παράδειγμα επιθεώρησης στον οδηγό ανάπτυξης, και τεκμηριώνει πώς το Network Extension μπορεί να δρομολογεί επιλεγμένους τομείς σε επιλεγμένους resolvers, που είναι ο μηχανισμός που αποκαλύπτουν αυτά τα μπλοκ με εύρος.

Ο έλεγχος που λύνει το ζήτημα είναι αν ο resolver κάθεται στη διαδρομή που εγκατέστησε η σήραγγα:

scutil --nwi
ifconfig utun4
route -n get 10.20.0.53
netstat -rn | grep -m5 utun

Αν το route -n get επιστρέφει πύλη και διεπαφή που δεν ταιριάζουν με την καταχώριση του resolver, η διεύθυνση μπορεί να είναι απολύτως σωστή και παρ’ όλα αυτά μη προσβάσιμη. Μια διαχωρισμένη σήραγγα που μεταφέρει μόνο τα εταιρικά υποδίκτυα ρίχνει τα ερωτήματα προς διακομιστή DNS έξω από αυτά, και η αποτυχία εμφανίζεται ως λήξη χρόνου, γι’ αυτό η έξοδος διαμόρφωσης συνεχίζει να φαίνεται καθαρή.

Ρωτήστε τον resolver του συστήματος και μετά τον διακομιστή

Τρία εργαλεία απαντούν σε τρία διαφορετικά ερωτήματα, και η σύγχυσή τους παράγει τα περισσότερα λάθος συμπεράσματα σε αυτόν τον χώρο. Το dscacheutil -q host -a name περνά από τον ίδιο resolver συστήματος που χρησιμοποιούν οι συνηθισμένες εφαρμογές, οπότε ισχύουν τα μπλοκ με εύρος και τα συμπληρωματικά. Το dig χωρίς όρισμα διακομιστή διαβάζει το /etc/resolv.conf, που δεν είναι η πηγή αλήθειας για επίλυση με εύρος στο macOS, και παραλείπει εντελώς τους κανόνες ανά τομέα. Το dig @address φτάνει ακριβώς σε έναν διακομιστή και δεν σας λέει τίποτα για την επιλογή.

dscacheutil -q host -a name intranet.corp.example
dig intranet.corp.example
dig @10.20.0.53 intranet.corp.example
nslookup intranet.corp.example

Όταν η πρώτη εντολή απαντά και η δεύτερη επιστρέφει NXDOMAIN, βρήκατε τον διαχωρισμό που ψάχνατε και τίποτα δεν είναι χαλασμένο. Όταν η πρώτη λήγει σε χρόνο ενώ το dig @10.20.0.53 απαντά, ο resolver δουλεύει αλλά δεν είναι προσβάσιμος στη διαδρομή που διάλεξε η σήραγγα, οπότε το επόμενο βήμα είναι το route -n get και όχι μια αλλαγή στις ρυθμίσεις DNS. Κρατήστε τα ιδιωτικά ονόματα έξω από ό,τι επικολλάτε σε ένα δελτίο ή σε μια κοινόχρηστη σημείωση.

Τι δεν μπορεί να σας δείξει η έξοδος

Αρκετά στρώματα κάθονται πάνω ή δίπλα στη λίστα των resolvers, και καθένα μπορεί να στείλει ένα ερώτημα κάπου που η έξοδος δεν αναφέρει ποτέ. Ένας περιηγητής με ενεργό ασφαλές DNS μπορεί να επιλύει μέσω του δικού του κρυπτογραφημένου καναλιού, οπότε μια σελίδα που φορτώνει ενώ το dscacheutil λήγει σε χρόνο δεν είναι αντίφαση. Ένας διαμεσολαβητής DNS που εγκαθιστά λογισμικό ασφαλείας τρέχει ως πάροχος Network Extension και προωθεί ο ίδιος τα ερωτήματα, και το scutil --dns δείχνει τι διαμορφώθηκε και όχι τη διεύθυνση ανάντη που χρησιμοποίησε τελικά ο διαμεσολαβητής. Οι τομείς αναζήτησης προσθέτουν μια τρίτη πτυχή: σε ένα μη πλήρες όνομα προσαρτάται κάθε καταγεγραμμένη κατάληξη με σειρά, οπότε το μπλοκ που απάντησε μπορεί να είναι ένα που ποτέ δεν υποψιαστήκατε.

Οι παλιές απαντήσεις είναι το φθηνότερο πράγμα που αποκλείεται και το πιο συχνά παραλειπόμενο:

sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
scutil --dns | head -20

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

Ένας σύντομος οδηγός για πριν και μετά

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

scutil --dns > ~/dns-before.txt
# connect the VPN, then:
scutil --dns > ~/dns-after.txt
diff -u ~/dns-before.txt ~/dns-after.txt
dscacheutil -q host -a name intranet.corp.example

Διαβάστε τη διαφορά ανά μπλοκ και όχι ανά γραμμή. Ένας νέος resolver με εύρος που φέρει τον δείκτη διεπαφής της σήραγγας και μια καταχώριση domain για την ιδιωτική κατάληξη είναι η αναμενόμενη μορφή. Ένας νέος προεπιλεγμένος resolver που δείχνει σε δημόσια διεύθυνση είναι ένα εύρημα που αξίζει να τεθεί σε όποιον κατέχει το προφίλ του πελάτη. Μετά επαναλάβετε την αναζήτηση μέσα στην εφαρμογή που απέτυχε πραγματικά, όχι μόνο στο κέλυφος, και σημειώστε τη διεπαφή από το route -n get δίπλα στο αποτέλεσμα.

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

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

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