Ρωτήστε μια εφαρμογή iOS αν το τηλέφωνο είναι σε VPN και η ειλικρινής απάντηση είναι ότι δεν μπορεί να το ξέρει με τον τρόπο που εννοείτε. Το SDK δεν εκθέτει κανένα flag για «η συσκευή είναι σε σήραγγα», και οι ιδιωτικές διεπαφές που θα μπορούσαν να το προσεγγίσουν είναι κλειστές για εφαρμογές που διανέμονται. Μπορείτε να παρατηρήσετε τη διαμόρφωση της ίδιας της εφαρμογής σας, την κατάσταση που είναι συνδεδεμένη με αυτήν, και μία ή δύο έμμεσες ενδείξεις από τη στοίβα δικτύου. Κάθε μία απαντά σε διαφορετική ερώτηση, και οι περισσότεροι χαλασμένοι έλεγχοι προκύπτουν από το να θεωρήσετε κάποια από αυτές ολόκληρη την απάντηση.

Ο μύθος του ενιαίου flag VPN

Η πεποίθηση είναι ότι κάπου στο SDK υπάρχει μια ιδιότητα που αναφέρει αν η συσκευή είναι σε σήραγγα, όπως ένα flag προσβασιμότητας αναφέρει αν ένας κεντρικός υπολογιστής απαντά. Τέτοια δημόσια ιδιότητα δεν υπάρχει. Ακόμη κι αν υπήρχε, το «υπάρχει σήραγγα» και το «η κίνησή μου τη χρησιμοποιεί» είναι διαφορετικοί ισχυρισμοί, και για τις περισσότερες εφαρμογές μετράει μόνο ο δεύτερος.

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

Φορτώστε τις προτιμήσεις πριν εμπιστευτείτε ένα nil

Το κοινό στιγμιότυπο του διαχειριστή υπάρχει μόλις το ζητήσετε, αλλά η ιδιότητα πρωτοκόλλου του παραμένει nil μέχρι να ολοκληρωθεί το callback φόρτωσης. Άρα ένα nil πρωτόκολλο σημαίνει «δεν έχει φορτωθεί ακόμη» τουλάχιστον όσο συχνά σημαίνει «δεν είναι εγκατεστημένο». Κάντε την ανάγνωση μέσα στο block ολοκλήρωσης και μόνο τότε αποφασίστε: ένα αντικείμενο πρωτοκόλλου που υπάρχει, με το flag ενεργοποίησης ανοιχτό, είναι το πώς μοιάζει το «εγκατεστημένο».

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

Οι αλλαγές σύνδεσης φτάνουν ως ειδοποιήσεις

Οι χειριστές που περνούν στα load και save αναφέρουν τι συνέβη στη διαμόρφωση, όχι τι κάνει η σήραγγα. Το να περιμένετε να ενεργοποιηθεί ένας από αυτούς κατά τη σύνδεση είναι κούρσα που δεν λύνεται ποτέ. Παρακολουθήστε αντί αυτού την ειδοποίηση αλλαγής κατάστασης και διαβάστε την τρέχουσα τιμή του αντικειμένου σύνδεσης όταν φτάσει.

Μόλις εγκατασταθεί μια διαμόρφωση, η κατάσταση σύνδεσης περνά μια σύντομη ακολουθία: αποσυνδεδεμένο, συνδέεται, συνδεδεμένο, επαναβεβαίωση, αποσυνδέεται. Το «συνδεδεμένο» περιγράφει τη σήραγγα και όχι τον διακομιστή πίσω της, άρα δεν αποδεικνύει ότι ρέει κίνηση. Το On-demand μπορεί επίσης να σηκώσει σήραγγα ενώ η εφαρμογή είναι σε αναστολή, και τότε η ειδοποίηση φτάνει πριν έχετε κάτι να ενημερώσετε.

Το περιορισμένο στιγμιότυπο proxy είναι ένδειξη, όχι ετυμηγορία

Το CFNetwork μπορεί να δώσει στην εφαρμογή τις τρέχουσες ρυθμίσεις proxy του συστήματος, και μέσα σε αυτό το αποτέλεσμα υπάρχει ένα περιορισμένο λεξικό με κλειδί το όνομα διεπαφής. Το να δείτε όνομα που αρχίζει με tun, utun, ppp, ipsec ή tap είναι ένδειξη ότι υπάρχει σήραγγα. Παραμένει στιγμιότυπο του τι μπορεί να δει αυτή η εφαρμογή, όχι δήλωση για το πού ταξιδεύουν τα πακέτα.

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

Ο προσομοιωτής δανείζεται το Mac, και οι άλλες εφαρμογές μένουν αόρατες

Ο προσομοιωτής δεν έχει δική του στοίβα δικτύου· κάθε σύνδεση που κάνει είναι του Mac. Άρα ένα VPN που τρέχει στο Mac-ξενιστή ισχύει ήδη για την προσομοιωμένη εφαρμογή, και οι ρυθμίσεις του ίδιου του προσομοιωτή δεν δείχνουν τίποτα. Αν η σήραγγα σηκώθηκε αφού ξεκίνησε ο προσομοιωτής, η επανεκκίνησή του είναι συνήθως ταχύτερη από την αποσφαλμάτωση της εφαρμογής. Ένας ξενιστής σε μη τυπική θύρα χρειάζεται αυτή τη θύρα στο URL, ή μια τοπική προώθηση όπως socat TCP-LISTEN:12345,fork TCP:host:12345.

Τα δημόσια API δεν θα απαριθμήσουν προφίλ VPN που ανήκουν σε άλλες εφαρμογές ή σε προφίλ διαμόρφωσης. Για μια γνωστή εφαρμογή, ο φορητός τρόπος είναι ο έλεγχος σχήματος URL μέσω canOpenURL, και από το iOS 9 το σχήμα που ερωτάται πρέπει να δηλώνεται στο Info.plist σας· αν το παραλείψετε, η κλήση επιστρέφει false. Το OpenVPN Connect απαντά στο openvpn://, που το κάνει καλό παράδειγμα και κακό γενικό ανιχνευτή.

Συνδυάστε τρεις παρατηρήσεις και πείτε τι σημαίνουν

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

Γράψτε το αποτέλεσμα ως τρεις γραμμές στα διαγνωστικά σας, όχι ως ένα boolean. Όταν ένας χρήστης λέει ότι το VPN είναι κλειστό ενώ η εφαρμογή σας διαφωνεί, οι τρεις γραμμές δείχνουν ποια παρατήρηση απέκλινε, και αυτή είναι η διαφορά ανάμεσα σε ένα δελτίο υποστήριξης στο οποίο μπορείτε να ενεργήσετε και σε ένα που τελειώνει με «σε μένα δουλεύει».

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