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

Ο μετρητής μετρά bytes, όχι παράδοση

Το Android αποδίδει κίνηση σε ένα UID και τη μετρά και προς τις δύο κατευθύνσεις, και το κάνει σε όριο διεπαφής και όχι τη στιγμή που επιτυγχάνει η αίτηση μιας εφαρμογής.

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

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

Η απόδοση ακολουθεί το UID, όχι το εικονίδιο

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

Όταν οι αριθμοί φαίνονται λάθος, συγκρίνετε το UID και όχι την ετικέτα. Το API χρήσης ερωτάται ανά UID, και adb shell dumpsys package <package> | grep userId= εκτυπώνει τον αριθμό με τον οποίο πρέπει να συγκρίνετε, άρα δύο εγγραφές με το ίδιο UID είναι η ίδια ταυτότητα από την οπτική του μετρητή.

Το χρονικό παράθυρο μπορεί να προηγείται του κανόνα σας

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

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

Η υπηρεσία VPN μπορεί να μην είναι αυτή που ρυθμίσατε

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

IPv4, IPv6 και DNS μπορούν επίσης να αποκλίνουν. Ένα φίλτρο που χειρίζεται IPv4 μπορεί να αφήσει το IPv6 ή έναν ιδιωτικό resolver DNS έξω από αυτό, ώστε μέρος της κίνησης της εφαρμογής να ακολουθεί διαδρομή που δεν περιέγραψαν ποτέ οι κανόνες σας. Ελέγξτε ποια εφαρμογή κατέχει τώρα το VPN και τι λέει η λίστα εξαιρέσεων πριν ξαναγράψετε οτιδήποτε:

adb shell settings get secure always_on_vpn_app
adb shell dumpsys connectivity
adb shell dumpsys netstats detail

Δοκιμάστε μία νέα αίτηση και καταγράψτε τέσσερα γεγονότα

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

Ένα υπερασπίσιμο συμπέρασμα ονομάζει τι απορρίφθηκε και ποια παρατήρηση το επιβεβαίωσε. Το «ο μετρητής ανέβηκε» δεν είναι εύρημα, και το «όλοι οι μετρητές χρήσης είναι ψεύτικοι» ούτε. Ένα σύνθημα για το επίπεδο OSI δεν το λύνει: η ειλικρινής απάντηση είναι ότι ο μετρητής και ο αποκλεισμός μπορούν να είναι και τα δύο σωστά ενώ περιγράφουν διαφορετικά πράγματα. Η αναφορά NetworkStatsManager του Android τεκμηριώνει πώς αυτοί οι κάδοι ερωτώνται και αποδίδονται.

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