Εξομοιωτής Android και VPN host: στιγμιότυπο DNS και εξήγηση NAT
Ο guest βρίσκεται πίσω από το NAT του εξομοιωτή και κρατά τη λίστα DNS που αντιγράφηκε κατά την εκκίνηση. Σηκώστε τη σήραγγα πριν την εκκίνηση και μετά δοκιμάστε την επίλυση μέσα από τον guest.
Όταν ο εξομοιωτής δεν φτάνει σε έναν διακομιστή build που ο browser του host ανοίγει χωρίς πρόβλημα, η χρήσιμη ερώτηση δεν είναι αν δουλεύει το VPN. Είναι ποιος από τους δύο μηχανισμούς λείπει από τον guest. Η εικονική συσκευή τρέχει τη δική της στοίβα δικτύου πίσω από το NAT του εξομοιωτή, και η λίστα επιλυτών της είναι ένα αντίγραφο που πάρθηκε στην εκκίνηση, οπότε μια σήραγγα που ανέβηκε αργότερα αλλάζει τη διαδρομή του host χωρίς να αλλάζει αυτό που ρωτά ο guest. Η κατανόηση αυτών των δύο στρωμάτων εξηγεί σχεδόν κάθε εκδοχή αυτού του προβλήματος.
Ο guest είναι ξεχωριστή στοίβα πίσω από σταθερό NAT
Το δίκτυο QEMU σε λειτουργία χρήστη τοποθετεί τον guest στο 10.0.2.15, την πύλη στο 10.0.2.2 και την υπηρεσία DNS στο 10.0.2.3 έως 10.0.2.6. Η εξερχόμενη κίνηση του guest δεν προωθείται από τον πυρήνα του host· μεταφράζεται σε υποδοχές στην πλευρά του host, μία ανά σύνδεση του guest, και αυτές οι υποδοχές βγαίνουν από τον χώρο διευθύνσεων του host. Για αυτό μια σύνδεση του guest κληρονομεί την απόφαση δρομολόγησης του host τη στιγμή που δημιουργείται, και για αυτό ο guest δεν έχει καμία καταχώριση στον πίνακα δρομολόγησης που να ονομάζει τη σήραγγά σας.
Ο ίδιος μηχανισμός δίνει στον guest μια χρήσιμη διέξοδο. Το 10.0.2.2 είναι ψευδώνυμο της διεπαφής loopback του host, οπότε μια υπηρεσία που ακούει στο 127.0.0.1 στον φορητό είναι προσβάσιμη από τον guest σε αυτή τη διεύθυνση. Ό,τι εκθέτει ο client μόνο στο loopback μπορεί να προσεγγιστεί έτσι, και αυτή είναι η βάση της διάταξης διαμεσολαβητή που περιγράφεται παρακάτω.
Αυτό που δεν μπορεί να κάνει ο guest είναι να παρατηρήσει το δίκτυο του host σαν να είναι χώρος ονομάτων πάνω του. Δεν υπάρχει γέφυρα, ούτε κοινός πίνακας δρομολόγησης ούτε κληρονομημένος επιλυτής, μόνο η υπηρεσία NAT που δέχεται τα πακέτα του και το στιγμιότυπο που πήρε ο εκκινητής όταν ξεκίνησε η εικονική συσκευή.
Το DNS είναι στιγμιότυπο, όχι ζωντανή εικόνα
Στην εκκίνηση ο εξομοιωτής διαβάζει τη λίστα επιλυτών του host και δίνει στον guest έως τέσσερις διακομιστές, εκτεθειμένους στις διευθύνσεις 10.0.2.3 έως 10.0.2.6. Αν η σήραγγα ήταν κάτω εκείνη τη στιγμή, το στιγμιότυπο περιέχει όποιον δημόσιο επιλυτή χρησιμοποιούσε ο φορητός, και ο guest συνεχίζει να τον ρωτά για όλη του τη ζωή. Τα δημόσια ονόματα επιλύονται, τα εσωτερικά αποτυγχάνουν, και κάθε σύμπτωμα δείχνει το VPN ενώ η πραγματική παρωχημένη τιμή είναι μια λίστα επιλυτών που καταγράφηκε λεπτά πριν ανέβει η σήραγγα.
Άρα η διόρθωση με σειρά δεν είναι δεισιδαιμονία. Συνδέστε πρώτα τη σήραγγα, μετά επανεκκινήστε τον εξομοιωτή, και προτιμήστε ψυχρή εκκίνηση αντί για επαναφορά στιγμιότυπου, γιατί μια εικόνα γρήγορης εκκίνησης μπορεί να επιστρέψει με την κατάσταση επιλυτή και δρομολόγησης που είχε αποθηκεύσει νωρίτερα. Αν θέλετε να δείτε τι χρησιμοποιεί τώρα ο guest, ρωτήστε τη συσκευή και όχι τον host:
adb shell dumpsys connectivity | grep -i -A2 dns
adb shell ping -c 1 build.internal.exampleΟ εξομοιωτής δέχεται επίσης ρητό επιλυτή κατά την εκκίνηση, κάτι χρήσιμο όταν ξέρετε ακριβώς ποιον διακομιστή πρέπει να χρησιμοποιεί ο guest και επικίνδυνο όταν αυτός ο διακομιστής είναι δημόσιος:
emulator -avd Pixel_API_34 -dns-server 203.0.113.53Ένας δημόσιος επιλυτής δεν έχει αντίγραφο εσωτερικής ζώνης, οπότε το καρφίτσωμα ενός μετατρέπει ένα πρόβλημα σειράς σε μόνιμη αποτυχία. Αν το προφίλ σπρώχνει ιδιωτικό DNS, αφήστε τη σήραγγα να το παρέχει και κάντε ψυχρή εκκίνηση του guest αντί να κωδικοποιήσετε σκληρά μια διεύθυνση.
Η δρομολόγηση ακολουθεί τον host τη στιγμή της σύνδεσης
Επειδή οι συνδέσεις του guest γίνονται υποδοχές του host, η απόφαση δρομολόγησης λαμβάνεται όταν δημιουργείται η υποδοχή. Σήραγγα πριν το αίτημα σημαίνει ότι το αίτημα βγαίνει μέσα από τη σήραγγα σύμφωνα με τις διαδρομές του προφίλ. Ένα προφίλ split tunnel που μεταφέρει μόνο επιλεγμένα προθέματα θα αφήσει ευχαρίστως το ιδιωτικό σας υποδίκτυο απέξω, οπότε η προσβασιμότητα του host είναι υπόθεση για τον guest, όχι αποτέλεσμα. Οι υπάρχουσες συνδέσεις του guest κρατούν τη διαδρομή με την οποία δημιουργήθηκαν, για αυτό ένας client που επανασυνδέεται δεν διορθώνει πάντα μια κολλημένη λήψη μέσα στον εξομοιωτή.
Η επαλήθευση ανήκει στη διεπαφή του host, όχι στα στατιστικά του guest:
sudo tcpdump -ni tun0 'host 203.0.113.10'Αν το αίτημα του guest εμφανίζεται στη διεπαφή της σήραγγας, η δρομολόγηση δουλεύει και το πρόβλημα είναι από πάνω. Αν εμφανίζεται στη φυσική διεπαφή, το προφίλ δεν καλύπτει αυτό το πρόθεμα, και καμία επαναδιαμόρφωση στην πλευρά του guest δεν θα το αλλάξει.
Όταν ο client προσφέρει μόνο διαμεσολαβητή loopback
Μερικοί εμπορικοί clients δεν δημιουργούν καθόλου σήραγγα συστήματος. Εκθέτουν έναν ακροατή HTTP ή SOCKS στο 127.0.0.1 και περιμένουν οι εφαρμογές να το χρησιμοποιήσουν. Ο guest δεν βλέπει άμεσα αυτή την υποδοχή, αλλά μπορεί να ειπωθεί στον εξομοιωτή να τη χρησιμοποιήσει, είτε μέσω των εκτεταμένων χειριστηρίων (Ρυθμίσεις, μετά Διαμεσολαβητής, χειροκίνητη λειτουργία, host 127.0.0.1 και η θύρα που εκτυπώνει ο client) είτε κατά την εκκίνηση:
emulator -avd Pixel_API_34 -http-proxy http://127.0.0.1:8080Αντιγράψτε τη θύρα από το παράθυρο του client· μια μαντεμένη θύρα αποτυγχάνει σιωπηλά και μοιάζει με σπασμένη σήραγγα. Να θυμάστε τι καλύπτει αυτό: μια ρύθμιση διαμεσολαβητή HTTP τη σέβονται οι εφαρμογές που γνωρίζουν διαμεσολαβητή, και οι ακατέργαστες υποδοχές την αγνοούν εντελώς. Αν το φορτίο είναι ένα εγγενές δυαδικό που ανοίγει τις δικές του συνδέσεις, η διαδρομή μέσω διαμεσολαβητή δεν ισοδυναμεί με σήραγγα και η σύγκριση πρέπει να γίνει ρητά.
Αποδείξτε το αποτέλεσμα μέσα από τον guest
Διαχωρίστε την επίλυση από τη δρομολόγηση με δύο δοκιμές στην ίδια συνεδρία. Ένα όνομα που αποτυγχάνει ενώ η αριθμητική διεύθυνση απαντά είναι πρόβλημα στιγμιότυπου DNS, και η διόρθωση είναι η σειρά ή ένας ρητός επιλυτής. Αν αποτυγχάνουν και τα δύο, δείχνει δρομολόγηση ή πολιτική, και ο επόμενος έλεγχος είναι αν η εφαρμογή τρέχει σε προφίλ εργασίας με δικούς του περιορισμούς δικτύου.
Τέλος, να ξέρετε σε ποιον guest δοκιμάζετε. Πολύ παλιές εικόνες του εξομοιωτή διανεμήθηκαν χωρίς την υποστήριξη tun που χρειάζεται ένας client VPN στην πλευρά του guest, οπότε κανένα προφίλ δεν μπορούσε να δουλέψει εκεί· οι τρέχουσες εικόνες την περιλαμβάνουν. Ένας client που αποτυγχάνει σε τρέχουσα εικόνα είναι πρόβλημα client ή προφίλ, και η ανακατασκευή της σήραγγας του host δεν θα αλλάξει το αποτέλεσμα.