Δύο άνθρωποι κάνουν την ίδια ερώτηση και παίρνουν ασύμβατες απαντήσεις, επειδή στέκονται σε διαφορετικά σημεία. Ο ένας έχει ανοιχτή την οθόνη ρυθμίσεων VPN του συστήματος και επεξεργάζεται μια λίστα εφαρμογών. Ο άλλος γράφει VpnService.Builder.addDisallowedApplication() σε έναν επεξεργαστή. Και οι δύο το λένε φίλτρο VPN ανά εφαρμογή. Μόνο ο ένας από αυτούς κατέχει τον έλεγχο που περιγράφει, και κανένας από τους δύο δεν μπλοκάρει τίποτα.

Ξεκίνα από την οθόνη που βλέπει ο χρήστης

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

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

Ακολούθησε το πακέτο μέσα σε ένα τούνελ

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

val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish()   // membership decided here

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

Γιατί ο αποκλεισμός έμοιαζε με μπλοκάρισμα

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

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

Τι σπάει όταν το χτίζεις μόνος σου

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

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

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

Δοκίμασέ το με μια εφαρμογή που ελέγχεις

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

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

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