Παίρνετε ένα κέλυφος στη συσκευή, διαβάζετε το /etc/resolv.conf ή ξεθάβετε μια παλιά τιμή net.dns1, και παίρνετε μία διεύθυνση. Η εφαρμογή μπροστά σας επιλύει μέσω κάτι εντελώς άλλου. Σε τρέχουσα έκδοση του Android ο resolver είναι ανά δίκτυο: το σύστημα κρατά πολιτική για κάθε Network και την εφαρμόζει στο socket που έκανε το αίτημα. Το αρχείο και η παλιά ιδιότητα είναι κατάλοιπα, και κανένα από τα δύο δεν περιγράφει τη διαδρομή που ακολούθησε πραγματικά το ερώτημά σας.

Αυτό το κενό φαίνεται κατά την ανάπτυξη split-tunnel και Private DNS, όπου δύο εφαρμογές στο ίδιο τηλέφωνο μπορούν νόμιμα να βλέπουν διαφορετικές απαντήσεις. Αυτός ο οδηγός ξεκινά από την εσφαλμένη ή απούσα επίλυση και πηγαίνει προς τα πίσω στη διαμόρφωση που της ανήκει.

Ο resolver ανήκει σε δίκτυο, όχι στη συσκευή

Η επίλυση ονομάτων στο Android 9 και νεότερο περνά μέσα από resolver συστήματος που βασίζεται στο Network στο οποίο είναι δεσμευμένο ένα socket. Κάθε δίκτυο φέρει τα δικά του LinkProperties, και αυτές οι ιδιότητες περιέχουν τη λίστα διακομιστών DNS, τους τομείς αναζήτησης και την κατάσταση Private DNS μόνο για εκείνο το δίκτυο. Τίποτα σε αυτό το μοντέλο δεν αντιστοιχεί σε μία λίστα για όλη τη συσκευή που θα μπορούσατε να διαβάσετε από αρχείο.

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

Διαβάστε το στιγμιότυπο μέσα από την επηρεαζόμενη εφαρμογή

Ρωτήστε την ίδια την εφαρμογή. Μια μέθοδος που έχει Context και την κανονική άδεια android.permission.ACCESS_NETWORK_STATE μπορεί να διαβάσει το στιγμιότυπο χωρίς να αγγίξει ιδιότητες συστήματος:

val cm = getSystemService(ConnectivityManager::class.java) ?: return
val network = cm.activeNetwork
val links = network?.let { cm.getLinkProperties(it) }

val dnsServers = links?.dnsServers
val privateDnsActive = links?.isPrivateDnsActive
val privateDnsName = links?.privateDnsServerName

Το activeNetwork είναι το προεπιλεγμένο δίκτυο της διεργασίας σας, όχι το μοναδικό δίκτυο στη συσκευή, και μπορεί να είναι null όταν ο καλών δεν έχει χρησιμοποιήσιμο προεπιλεγμένο. Ένα αποκλεισμένο προεπιλεγμένο VPN είναι η συνηθισμένη αιτία. Το isPrivateDnsActive σας λέει αν τα ερωτήματα σε εκείνο το δίκτυο περνούν μέσω TLS προς έναν ονομασμένο resolver, κάτι που αλλάζει το τι θα σας δείξει ένα απλό ανιχνευτικό UDP 53. Η επιφάνεια API τεκμηριώνεται στο LinkProperties, και κάθε τιμή της είναι στιγμιότυπο διαμόρφωσης και όχι απόδειξη ότι ένα συγκεκριμένο ερώτημα έφτασε σε έναν συγκεκριμένο διακομιστή.

Όταν το προεπιλεγμένο δίκτυο δεν είναι αυτό που κάνει τη δουλειά

Το στιγμιότυπο απαντά μόνο για το προεπιλεγμένο δίκτυο. Μια εφαρμογή μπορεί να δεσμεύσει τη διεργασία της ή ένα μόνο socket σε άλλο δίκτυο, και τότε η επίλυση ακολουθεί αυτή την επιλογή ενώ τα διαγνωστικά σας συνεχίζουν να αναφέρουν το προεπιλεγμένο. Ένας περιηγητής που φέρνει τον δικό του resolver DNS-over-HTTPS δεν συμβουλεύεται καθόλου τη λίστα του συστήματος, οπότε οι απαντήσεις του δεν λένε τίποτα για την υπόλοιπη συσκευή. Μια εφαρμογή προφίλ εργασίας εκτελείται κάτω από ξεχωριστό χρήστη με δική της πολιτική. Ελέγξτε τη δέσμευση πριν κατηγορήσετε τους διακομιστές.

Η ενσωμάτωση VPN είναι το άλλο μισό. Το να λαμβάνετε μια γραμμή dhcp-option DNS σε προφίλ OpenVPN και το να καταχωρείτε αυτή τη διεύθυνση στο δίκτυο VPN του Android είναι δύο ξεχωριστά βήματα, και μια διαδρομή που λείπει προς τον διακομιστή αποτυγχάνει τόσο αθόρυβα όσο μια λανθασμένη διεύθυνση. Από μηχάνημα ανάπτυξης, το adb shell dumpsys connectivity εκτυπώνει τις ίδιες ιδιότητες ζεύξης ανά δίκτυο όταν το επιτρέπει η έκδοση, κάτι που επιβεβαιώνει τη λίστα χωρίς να γράψετε κώδικα.

Συγκρίνετε τη διαμόρφωση με μία επίλυση που σας επιτρέπεται

Επιλέξτε ένα όνομα που πρέπει να επιλυθεί μέσα στον ιδιωτικό χώρο ονομάτων και ένα δημόσιο όνομα, και σημειώστε και τα δύο αποτελέσματα δίπλα στο στιγμιότυπο: δίκτυο, διαμορφωμένοι διακομιστές, κατάσταση Private DNS και το ακριβές κείμενο του σφάλματος. Ένα άμεσο ερώτημα σε ονομασμένο διακομιστή αποδεικνύει ότι αυτός ο διακομιστής σας απαντά· δεν αποδεικνύει ότι η συνήθης επίλυση της εφαρμογής τον επέλεξε. Μια απάντηση από κρυφή μνήμη δεν είναι φρέσκο τεστ, γι’ αυτό καθαρίστε την κρυφή μνήμη ή χρησιμοποιήστε ένα όνομα που κανείς δεν ρώτησε σήμερα.

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

Διορθώστε το επίπεδο στο οποίο ανήκει η αναντιστοιχία

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

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

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

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