Εφαρμογή Android αρνείται να λειτουργήσει μέσω VPN: ποιο επίπεδο αποφασίζει
Μια εφαρμογή μπορεί να απορρίψει το VPN λόγω τοπικού ελέγχου μεταφοράς, κανόνα διευθύνσεων στην πλευρά του διακομιστή ή δικής της πολιτικής. Ξεχωρίστε τις τρεις περιπτώσεις πριν αλλάξετε εξόδους.
Όταν μια εφαρμογή Android σταματά να λειτουργεί τη στιγμή που σηκώνεται το τούνελ, τρία διαφορετικά πράγματα μπορεί να ευθύνονται, και παράγουν αποτυχίες που μοιάζουν μεταξύ τους. Η εφαρμογή μπορεί να διαβάσει την κατάσταση δικτύου του ίδιου του τηλεφώνου και να αρνηθεί τοπικά. Ο διακομιστής μπορεί να ταξινομήσει τη διεύθυνση από την οποία φτάνετε και να την απορρίψει. Ή η άρνηση μπορεί να μην έχει καμία σχέση με το VPN. Η σειρά παρακάτω συλλέγει στοιχεία πριν αλλάξει οτιδήποτε, γιατί η αλλαγή εξόδου είναι το πιο ακριβό βήμα και αυτό που λιγότερο πιθανό είναι να βοηθήσει αν ο έλεγχος είναι τοπικός.
Βήμα 1: βρείτε πότε αρνείται η εφαρμογή
Ο χρόνος είναι ο πρώτος διαχωριστικός παράγοντας. Καθαρίστε τον buffer καταγραφής, αναπαράγετε την αποτυχία και δείτε τι έκανε η εφαρμογή πριν παραπονεθεί:
adb logcat -c
# reproduce the failure in the app
adb logcat -d | grep -iE 'vpn|network|connect|http' | tail -60
Αν η εφαρμογή αρνείται πριν επιχειρηθεί οποιοδήποτε εξερχόμενο αίτημα, βλέπετε τοπική απόφαση. Αν συνδέεται, στέλνει κάτι και μετά δείχνει σφάλμα, η απόρριψη ήρθε από την άλλη πλευρά. Αν η εφαρμογή αποτυγχάνει το ίδιο με κλειστό το τούνελ, το VPN δεν ήταν ποτέ η μεταβλητή.
Αντιμετωπίστε αυτόν τον χρόνο ως στοιχείο και όχι ως απόδειξη. Μια εφαρμογή μπορεί να αναπαράγει αποθηκευμένη απάντηση, και τα αιτήματα υποβάθρου μπορεί να πέτυχαν ή να απέτυχαν πριν κοιτάξετε. Σημειώστε τις χρονικές σφραγίδες του τελευταίου επιτυχημένου αιτήματος και του σφάλματος, όχι μόνο τη στιγμή που εμφανίστηκε το μήνυμα.
Βήμα 2: διαβάστε την άποψη του ίδιου του τηλεφώνου για το δίκτυο
Το Android εκθέτει την κατάσταση VPN ως δυνατότητα δικτύου, οπότε μια εφαρμογή δεν χρειάζεται κατάλογο εμπορικών παρόχων για να αντιληφθεί ότι ένα τούνελ είναι ενεργό. Ρωτά την υπηρεσία συνδεσιμότητας ποιο είναι το τρέχον δίκτυο, και η απάντηση περιλαμβάνει ένα bit μεταφοράς VPN:
val cm = context.getSystemService(ConnectivityManager::class.java)
val caps = cm.getNetworkCapabilities(cm.activeNetwork)
val onVpn = caps?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) == true
Αυτός ο έλεγχος είναι τοπικός και φθηνός, και εξηγεί μια ολόκληρη κατηγορία αναφορών του τύπου «αυτή η εφαρμογή δεν λειτουργεί μέσω VPN» χωρίς καμία απομακρυσμένη ταξινόμηση. Το τι μπορεί να δει η εφαρμογή εξαρτάται ακόμη από το δικό της δικτυακό πλαίσιο, οπότε μην υποθέτετε ότι κάθε εφαρμογή εξετάζει κάθε προφίλ στη συσκευή.
Από σταθμό εργασίας μπορείτε να δείτε την ίδια κατάσταση σε συσκευή δοκιμής με adb shell dumpsys connectivity και ψάχνοντας την καταχώριση δικτύου VPN. Συγκρίνετε μια εκτέλεση με το τούνελ ανοιχτό με μια εκτέλεση με κλειστό, και κρατήστε και τις δύο εξόδους.
Βήμα 3: διαβάστε τι βλέπει πραγματικά ο διακομιστής
Ο άλλος παρατηρητής είναι η υπηρεσία. Βλέπει τη διεύθυνση προέλευσης που φτάνει, και μπορεί να δράσει με βάση τη διεύθυνση, το δίκτυο φιλοξενίας πίσω της, την περιοχή, τον πάροχο ή σήματα συνδεδεμένα με τον λογαριασμό και τη συσκευή. Κανένα από αυτά δεν είναι μοναδική ταυτότητα, και η κοινόχρηστη διευθυνσιοδότηση κάνει τους παράπλευρους αποκλεισμούς φυσιολογικούς: μια περιορισμένη διεύθυνση μπορεί να βγάλει άσχετους χρήστες πίσω από την ίδια μετάφραση.
Πάρτε τη διεύθυνση από την ίδια διαδρομή που χρησιμοποιεί η εφαρμογή, όχι από πρόγραμμα περιήγησης σε φορητό υπολογιστή. Στο τηλέφωνο, ένα απλό αίτημα σε υπηρεσία ηχούς διεύθυνσης δείχνει τι λαμβάνει η απομακρυσμένη πλευρά, και η σύγκριση με αίτημα μέσω κινητής δείχνει αν η διεύθυνση άλλαξε καθόλου.
Αν η εφαρμογή λειτουργεί μέσω κινητής και αποτυγχάνει μέσω του τούνελ με τον ίδιο λογαριασμό, η απόρριψη βρίσκεται στο απομακρυσμένο άκρο ή στην πολιτική της ίδιας της εφαρμογής. Αν αποτυγχάνει και στα δύο, το VPN δεν είναι ο διαχωριστικός παράγοντας και θα πρέπει να σταματήσετε να δοκιμάζετε τελικά σημεία.
Βήμα 4: αντιστοιχίστε τα στοιχεία σε μία από τρεις ετυμηγορίες
Τρεις συνδυασμοί καλύπτουν σχεδόν κάθε αναφορά. Άρνηση χωρίς καμία εξερχόμενη προσπάθεια ενώ ένα τούνελ είναι ενεργό δείχνει τοπικό έλεγχο μεταφοράς. Αίτημα που βγαίνει και επιστρέφει με σφάλμα, λήξη χρόνου σε συγκεκριμένο κεντρικό υπολογιστή ή μήνυμα περιοχής δείχνει την απομακρυσμένη πλευρά. Αποτυχία που επαναλαμβάνεται μέσω κινητής χωρίς τούνελ δείχνει τον λογαριασμό, την έκδοση της εφαρμογής ή την πολιτική της ίδιας της υπηρεσίας, και καμία αλλαγή VPN δεν θα τη μετακινήσει.
Γράψτε την ετυμηγορία μαζί με το στοιχείο που την παρήγαγε. Η αξία αυτού του βήματος είναι ότι σταματά τον βρόχο όπου κάποιος αλλάζει κόμβους εξόδου τέσσερις φορές για να διορθώσει έναν έλεγχο που εκτελείται στην ίδια τη συσκευή.
Κρατά επίσης τους ισχυρισμούς έντιμους. Η αυτοφιλοξενία αλλάζει το τελικό σημείο και την έξοδό του στο διαδίκτυο· δεν κάνει το Android να ξεχάσει ότι ένα δίκτυο VPN είναι ενεργό, και δεν εγγυάται την αποδοχή από υπηρεσία που ταξινομεί διευθύνσεις. Ένα τοπικό φίλτρο μπορεί να ενεργοποιηθεί σε δικό σας δίκτυο VPN εξίσου εύκολα όσο σε εμπορικό.
Βήμα 5: ακολουθήστε την υποστηριζόμενη διαδρομή και επαληθεύστε την
Ξεκινήστε από την τεκμηριωμένη πολιτική του προϊόντος και τον υπεύθυνο υποστήριξής του. Στείλτε την έκδοση του πελάτη, το ακριβές μήνυμα και ένα στενό παράθυρο αποτυχίας· μην στέλνετε πλήρεις καταγραφές κίνησης ή διαπιστευτήρια μόνο για να αποδείξετε ότι υπάρχει σφάλμα.
Αν η υπηρεσία επιτρέπει άμεση πρόσβαση και η πολιτική της συσκευής το επιτρέπει, τότε ο αποκλεισμός ανά εφαρμογή είναι ο υποστηριζόμενος μηχανισμός, και αφαιρεί σκόπιμα αυτή την εφαρμογή από το τούνελ αντί να κρύβει το τούνελ. Η κίνηση της εφαρμογής φεύγει τότε από τη δική της διαδρομή, που είναι απόφαση πολιτικής την οποία κάποιος πρέπει να αναλάβει. Σε διαμόρφωση που αποκλείει χωρίς VPN, μια εξαιρούμενη εφαρμογή μπορεί απλώς να χάσει συνδεσιμότητα, οπότε δοκιμάστε αυτόν τον συνδυασμό πριν υποσχεθείτε ότι λειτουργεί.
Μετά από κάθε αλλαγή, επαναλάβετε τη δοκιμή χρόνου του πρώτου βήματος, επιβεβαιώστε ότι η εφαρμογή λειτουργεί και επιβεβαιώστε ότι κάθε άλλη εφαρμογή χρησιμοποιεί ακόμη το τούνελ. Έπειτα επαναφέρετε την προηγούμενη διαμόρφωση και ελέγξτε αν επιστρέφει η αποτυχία, γιατί μια διόρθωση που δεν μπορείτε να αναπαράγετε είναι μια σύμπτωση που θα ξανασυναντήσετε.