Dlaczego aplikacja nie może włączyć zapisanego profilu VPN na Androidzie lub iOS
Zbudowanie własnego tunelu i włączenie zapisanego profilu to dwa różne zadania. Porównaj, czego Android, iOS i pulpit naprawdę pozwalają aplikacji.
Dwa bardzo różne zadania trafiają pod nazwę programowego VPN, a tylko jedno z nich jest dostępne dla zwykłej aplikacji na którejkolwiek z dwóch platform mobilnych. Pierwsze to włączenie profilu, który użytkownik już zapisał; drugie to zbudowanie tunelu we własnym procesie. Android daje drugie przez VpnService, a iOS daje drugie przez uprawnienie Network Extension, podczas gdy pierwsze zostaje przy systemie, właścicielu urządzenia lub serwerze MDM. Ustalanie, którego naprawdę potrzebujesz, zwykle zmniejsza projekt.
Dwa zadania o tej samej nazwie
Aktywowanie zapisanego profilu oznacza powiedzenie istniejącemu tunelowi, żeby się podniósł: host, poświadczenie, protokół, wszystko już skonfigurowane w miejscu, które użytkownik może zobaczyć. Zbudowanie tunelu oznacza, że twój kod posiada interfejs, pętlę pakietów i protokół. W backlogu produktu wyglądają podobnie i prawie nie dzielą implementacji.
Żadna z platform mobilnych nie udostępnia pierwszego aplikacji SDK. Połączenie, które pojawia się bez żadnego działania użytkownika, jest nieodróżnialne od złośliwego oprogramowania, więc oba systemy stawiają bramę zgody przed każdą aplikacją przenoszącą ruch.
Android: brama zgody i żadnego API profilu
VpnService istnieje od Androida 4.0 i pozwala aplikacji utworzyć interfejs tun, a następnie czytać i zapisywać pakiety. Usługa musi być zadeklarowana z BIND_VPN_SERVICE, a VpnService.prepare() tworzy systemowe okno, które prosi użytkownika o zgodę. Przykład platformy, ToyVpn, jest najjaśniejszym stwierdzeniem zamierzonego kształtu: twój kod posiada interfejs i wszystko, co przez niego przepływa.
Czego nie robi, to dodawanie wpisu na ekran ustawień VPN systemu. Nie ma na to publicznego API, a aplikacja Ustawienia trzyma swoje profile w magazynie, do którego zwykła aplikacja nie dotrze. Wywołania ukrytych klas ze zwykłej aplikacji tworzą profile, których system nigdy nie wymienia, dlatego kod, który wydawał się działać w jednej kompilacji, po cichu przestaje działać w następnej.
Ścieżka zarządzana jest osobna. Właściciel urządzenia lub profilu może wyznaczyć pakiet VPN zawsze włączony przez API zasad urządzenia, a narzędzie korporacyjne może wysłać profil, który użytkownik następnie zatwierdza. To uprawnienie zarządzania urządzeniem, a nie zgoda, o którą aplikacja prosi przy instalacji. Jeśli twoim klientem jest organizacja, to jest ścieżka, którą trzeba zaplanować; jeśli twoim klientem jest osoba instalująca ze sklepu, nie jest ona w ogóle dostępna.
iOS: uprawnienie jest granicą
iOS dzieli tę samą pracę inaczej. Klient VPN implementuje dostawcę tunelu pakietów lub proxy aplikacji w ramach Network Extension, a odpowiednie uprawnienie musi zostać przyznane kontu dewelopera. Osobista konfiguracja VPN przez NEVPNManager istnieje dla prostszego przypadku i nadal działa w tym samym modelu uprawnień. Apple dokumentuje całą powierzchnię w dokumentacji Network Extension, którą warto przeczytać, zanim określisz zakres pracy.
Nie ma wspieranego sposobu otwarcia ekranu ustawień VPN, odczytania zapisanych konfiguracji użytkownika ani uruchomienia jednej z nich. Klient może dostarczyć profil konfiguracji do zainstalowania przez użytkownika, a następnie używać powstałego tunelu przez zwykłe wywołania sieciowe. Tunelowanie dla poszczególnych aplikacji przydziela serwer MDM regułą na żądanie, a nie wybiera aplikacja w czasie działania.
Klient VPN od dużego dostawcy nie jest dowodem, że twoje konto może dostarczyć to samo. Te uprawnienia są wnioskowane dla każdego konta dewelopera i weryfikowane, więc ryzyko harmonogramu leży po stronie Apple, a nie w twoim planie sprintu.
Pulpit sięga dalej, ale własność się nie zmienia
Windows jest przypadkiem przyzwalającym. Add-VpnConnection tworzy wpis książki telefonicznej z podniesionej sesji PowerShell, a rasdial łączy lub rozłącza go ze skryptu. Aplikacja może też sterować klientem dostawcy przez jego udokumentowaną linię poleceń. Utworzenie profilu nadal jest czynnością administracyjną, bo wpis żyje w magazynie całej maszyny.
macOS zachowuje się tak samo z innymi narzędziami. scutil --nc start i stop działają na usługach, które już istnieją, a utworzenie jednej jest zadaniem administracji systemu. Posiadanie procesu na laptopie nie czyni cię właścicielem konfiguracji.
Co zbudować zamiast tego
Jeśli prawdziwym wymaganiem jest, aby aplikacja docierała do wewnętrznego API, wystarczy tunel, który użytkownik już uruchamia. Wysyłaj zwykłe żądania HTTPS, pozwól systemowi wybrać drogę, i przestań próbować kontrolować tunel. Jeśli wymaganiem jest, aby tylko ruch twojej aplikacji korzystał z tunelu, poproś o VPN dla poszczególnych aplikacji kanałem zarządzania albo zakończ TLS wewnątrz aplikacji wobec usługi dostępnej bez niego.
Ukryte API nie są skrótem, który warto brać. Zmieniają się między wydaniami, oblewają przegląd aplikacji, a awarie, które powodują, wyglądają dla tego, kto dziedziczy kod, jak zwykłe awarie sieci. Porównanie nie jest Android kontra iOS; to posiadanie tunelu kontra proszenie platformy o kierowanie ruchem, i tylko pierwsze jest twoje do zbudowania.