Γιατί μια εφαρμογή δεν μπορεί να ενεργοποιήσει ένα αποθηκευμένο προφίλ VPN σε Android ή iOS
Η κατασκευή δικού σας τούνελ και η ενεργοποίηση αποθηκευμένου προφίλ είναι δύο διαφορετικές δουλειές. Συγκρίνετε τι επιτρέπουν πραγματικά τα Android, iOS και η επιφάνεια εργασίας σε μια εφαρμογή.
Δύο πολύ διαφορετικές δουλειές καταχωρούνται κάτω από τον όρο προγραμματιστικό VPN, και μόνο η μία από αυτές είναι διαθέσιμη σε μια συνηθισμένη εφαρμογή σε οποιαδήποτε από τις δύο κινητές πλατφόρμες. Η πρώτη είναι η ενεργοποίηση ενός προφίλ που ο χρήστης έχει ήδη αποθηκεύσει· η δεύτερη είναι η κατασκευή ενός τούνελ μέσα στη δική σας διεργασία. Το Android σας δίνει τη δεύτερη μέσω του VpnService και το iOS σας δίνει τη δεύτερη μέσω της άδειας Network Extension, ενώ η πρώτη παραμένει στο σύστημα, σε έναν ιδιοκτήτη συσκευής ή σε έναν διακομιστή MDM. Το να καταλάβετε ποια χρειάζεστε πραγματικά συνήθως κάνει το έργο μικρότερο.
Δύο δουλειές με το ίδιο όνομα
Η ενεργοποίηση αποθηκευμένου προφίλ σημαίνει να πείτε σε ένα υπάρχον τούνελ να σηκωθεί: ένας κεντρικός υπολογιστής, ένα διαπιστευτήριο, ένα πρωτόκολλο, όλα ήδη ρυθμισμένα κάπου που ο χρήστης μπορεί να δει. Η κατασκευή τούνελ σημαίνει ότι ο κώδικάς σας κατέχει τη διεπαφή, τον βρόχο πακέτων και το πρωτόκολλο. Μοιάζουν σε ένα backlog προϊόντος και δεν μοιράζονται σχεδόν καθόλου υλοποίηση.
Καμία από τις δύο κινητές πλατφόρμες δεν εκθέτει την πρώτη σε εφαρμογή SDK. Μια σύνδεση που εμφανίζεται χωρίς ο χρήστης να κάνει τίποτα δεν ξεχωρίζει από κακόβουλο λογισμικό, γι’ αυτό και τα δύο συστήματα βάζουν μια πύλη συγκατάθεσης μπροστά από κάθε εφαρμογή που μεταφέρει κίνηση.
Android: μια πύλη συγκατάθεσης και κανένα API προφίλ
VpnService υπάρχει από το Android 4.0 και επιτρέπει σε μια εφαρμογή να δημιουργήσει διεπαφή tun και μετά να διαβάζει και να γράφει πακέτα. Η υπηρεσία πρέπει να δηλωθεί με BIND_VPN_SERVICE, και το VpnService.prepare() παράγει τον διάλογο συστήματος που ζητά από τον χρήστη να το επιτρέψει. Το δείγμα της πλατφόρμας, ToyVpn, είναι η σαφέστερη δήλωση της προβλεπόμενης μορφής: ο κώδικάς σας κατέχει τη διεπαφή και ό,τι ρέει μέσα από αυτήν.
Αυτό που δεν κάνει είναι να προσθέτει μια καταχώριση στην οθόνη ρυθμίσεων VPN του συστήματος. Δεν υπάρχει δημόσιο API γι’ αυτό, και η εφαρμογή Ρυθμίσεις κρατά τα προφίλ της σε ένα χώρο αποθήκευσης που μια συνηθισμένη εφαρμογή δεν φτάνει. Κλήσεις στις κρυφές κλάσεις από μια κανονική εφαρμογή παράγουν προφίλ που το σύστημα δεν εμφανίζει ποτέ, γι’ αυτό κώδικας που φαινόταν να δουλεύει σε μια έκδοση σταματά σιωπηλά να δουλεύει στην επόμενη.
Η διαχειριζόμενη διαδρομή είναι ξεχωριστή. Ένας ιδιοκτήτης συσκευής ή προφίλ μπορεί να ορίσει ένα πακέτο VPN πάντα ενεργό μέσω των API πολιτικής συσκευής, και ένα εταιρικό εργαλείο μπορεί να στείλει ένα προφίλ που ο χρήστης εγκρίνει στη συνέχεια. Αυτή είναι εξουσία διαχείρισης συσκευής, όχι άδεια που ζητά μια εφαρμογή κατά την εγκατάσταση. Αν ο πελάτης σας είναι οργανισμός, αυτή είναι η διαδρομή για την οποία πρέπει να σχεδιάσετε· αν ο πελάτης σας είναι άτομο που εγκαθιστά από κατάστημα, δεν είναι καθόλου διαθέσιμη.
iOS: η άδεια είναι το όριο
Το iOS μοιράζει την ίδια δουλειά διαφορετικά. Ένας πελάτης VPN υλοποιεί πάροχο τούνελ πακέτων ή πληρεξούσιο εφαρμογής στο πλαίσιο Network Extension, και η αντίστοιχη άδεια πρέπει να χορηγηθεί στον λογαριασμό προγραμματιστή. Μια προσωπική διαμόρφωση VPN μέσω του NEVPNManager υπάρχει για την απλούστερη περίπτωση, και εξακολουθεί να τρέχει μέσα στο ίδιο μοντέλο αδειών. Η Apple τεκμηριώνει ολόκληρη την επιφάνεια στην αναφορά του Network Extension, που αξίζει να διαβάσετε πριν ορίσετε το εύρος της δουλειάς.
Δεν υπάρχει υποστηριζόμενος τρόπος να ανοίξετε την οθόνη ρυθμίσεων VPN, να διαβάσετε τις αποθηκευμένες διαμορφώσεις του χρήστη ή να ξεκινήσετε μία από αυτές. Αυτό που μπορεί να κάνει ένας πελάτης είναι να στείλει ένα προφίλ διαμόρφωσης για να εγκαταστήσει ο χρήστης και μετά να χρησιμοποιήσει το τούνελ που προκύπτει μέσω συνηθισμένων κλήσεων δικτύου. Η σήραγγα ανά εφαρμογή ανατίθεται από διακομιστή MDM μέσω κανόνα κατά απαίτηση, δεν την επιλέγει η εφαρμογή κατά τον χρόνο εκτέλεσης.
Ένας πελάτης VPN από μεγάλο προμηθευτή δεν είναι απόδειξη ότι ο λογαριασμός σας μπορεί να στείλει το ίδιο πράγμα. Αυτές οι άδειες ζητούνται ανά λογαριασμό προγραμματιστή και ελέγχονται, άρα ο κίνδυνος χρονοδιαγράμματος βρίσκεται στην Apple, όχι στο σχέδιο sprint σας.
Η επιφάνεια εργασίας φτάνει πιο μακριά, αλλά η ιδιοκτησία μένει ίδια
Τα Windows είναι η επιτρεπτική περίπτωση. Το Add-VpnConnection δημιουργεί μια καταχώριση τηλεφωνικού καταλόγου από μια αναβαθμισμένη συνεδρία PowerShell, και το rasdial τη συνδέει ή την αποσυνδέει από ένα σενάριο. Μια εφαρμογή μπορεί επίσης να οδηγήσει έναν πελάτη προμηθευτή μέσω της τεκμηριωμένης γραμμής εντολών του. Η δημιουργία του προφίλ παραμένει διοικητική ενέργεια, επειδή η καταχώριση ζει σε χώρο αποθήκευσης για ολόκληρο το μηχάνημα.
Το macOS συμπεριφέρεται το ίδιο με άλλα εργαλεία. Το scutil --nc start και το stop λειτουργούν σε υπηρεσίες που υπάρχουν ήδη, ενώ η δημιουργία μιας είναι έργο διαχείρισης συστήματος. Το να κατέχετε τη διεργασία σε ένα φορητό υπολογιστή δεν σας κάνει ιδιοκτήτη της διαμόρφωσης.
Τι να φτιάξετε αντ’ αυτού
Αν η πραγματική απαίτηση είναι η εφαρμογή σας να φτάνει ένα εσωτερικό API, το τούνελ που ήδη τρέχει ο χρήστης αρκεί. Στείλτε κανονικά αιτήματα HTTPS, αφήστε το σύστημα να διαλέξει τη διαδρομή, και σταματήστε να προσπαθείτε να ελέγξετε το τούνελ. Αν η απαίτηση είναι μόνο η κίνηση της εφαρμογής σας να χρησιμοποιεί το τούνελ, ζητήστε VPN ανά εφαρμογή μέσω του καναλιού διαχείρισης, ή τερματίστε το TLS μέσα στην εφαρμογή απέναντι σε μια υπηρεσία προσβάσιμη χωρίς αυτό.
Τα κρυφά API δεν είναι μια σύντομη διαδρομή που αξίζει. Αλλάζουν μεταξύ εκδόσεων, αποτυγχάνουν στην αξιολόγηση εφαρμογών, και οι αστοχίες που παράγουν φαίνονται σε όποιον κληρονομήσει τον κώδικα σαν συνηθισμένες αστοχίες δικτύου. Η σύγκριση δεν είναι Android εναντίον iOS· είναι το να κατέχεις ένα τούνελ εναντίον του να ζητάς από την πλατφόρμα να δρομολογεί την κίνηση, και μόνο το πρώτο είναι δικό σας να το φτιάξετε.