iOS VPN API-ji: NEVPNManager, davalac tunela ili profil?
Odaberite API prema transportu na kojem morate govoriti, pa dokažite da tunel prenosi saobraćaj: redoslijed čuvanja, učitavanja i pokretanja, ovlaštenja davaoca i pravila na zahtjev.
Tri različita proizvoda odgovaraju na ime VPN na iOS-u i ne dijele isti API. Lični VPN radi na ugrađenim sistemskim transportima IPsec i IKEv2. Prilagođeni tunel pokreće vaš vlastiti protokol unutar mrežnog proširenja. A konfiguracijski profil konfiguriše bilo koji od njih i može dodati ponašanje na zahtjev. Biranje prema transportu na kojem morate govoriti brže je od biranja prema onom tutorijalu koji se prvi kompajlirao.
Izvršite provjere ispod redom, jer svaki korak pretpostavlja da je prethodni proizveo valjanu konfiguraciju.
Korak 1: odaberite prema transportu
Ako je server IKEv2 ili IPsec u Cisco stilu, NEVPNManager je dovoljan i sistemski transporti dolaze besplatno. Ako server govori OpenVPN, WireGuard ili bilo šta drugo, NEVPNManager ne može pomoći: u njemu nema kuke za protokol treće strane. Taj slučaj traži NETunnelProviderManager s davalcem paketnog tunela koji implementira protokol. Profil samo distribuira konfiguraciju i ne može dodati transport koji operativni sistem nema.
PPTP nije meta na savremenim sistemima. IPsec sa zajedničkom tajnom još očekuje ime grupe u remoteIdentifier, stavku privjeska ključeva koja drži tajnu i proširenu autentifikaciju kada server traži korisničko ime. Svaki dio koji nedostaje ispoljava se kao ista opća greška konfiguracije, pa ih dodajte sve prije nego što budete tražili grešku bilo gdje drugdje.
Korak 2: poštujte redoslijed čuvanja, učitavanja, pokretanja
NEVPNManager piše u postavke, čita ih natrag i tek onda pokreće. Popunite objekte protokola i menadžera, pozovite saveToPreferences, pozovite loadFromPreferences i pozovite startVPNTunnel iz rukovaoca završetka učitavanja. Pokretanje prije nego što se učitavanje vrati daje grešku nevaljane konfiguracije, kod 1 u NEVPNErrorDomain, na konfiguraciji koja je inače ispravna.
Oblik je dovoljno kratak da se drži na jednom mjestu:
manager.protocolConfiguration = proto
manager.isEnabled = true
manager.saveToPreferences { }
manager.loadFromPreferences { manager.connection.startVPNTunnel() }
startVPNTunnel se vraća kada je zahtjev prihvaćen, a ne kada je tunel podignut. Posmatrajte NEVPNStatusDidChange i čitajte connection.status za stvarno stanje. Aplikacija koja pretpostavlja uspjeh na mjestu poziva prijavljuje povezan VPN dok proširenje još pregovara. Stanje povezivanja je na trenutak normalno; stanje koje ga nikada ne napusti jeste kvar vrijedan zapisa.
Korak 3: dajte procesu davaoca ono što mu treba
Prilagođeni transport radi u odvojenom procesu sa vlastitim identifikatorom paketa i vlastitim ovlaštenjem. I aplikacija-kontejner i davalac trebaju ovlaštenje mrežnog proširenja u vrijeme potpisivanja, a build s Developer ID-om izvan App Store-a svejedno ga mora nositi u profilu za omogućavanje. Ovlaštenje koje nedostaje izgleda kao greška protokola jer se proširenje jednostavno ne pokreće.
Nema javnog deskriptora soketa za posudbu. NEPacketTunnelProvider vam daje NEPacketTunnelFlow s read, write i cancel, a kod koji poseže za privatnim putanjama ključeva lomi se između izdanja. Davalac nastavlja raditi dok je aplikacija u pozadini, pa kontejneru za to ne treba pozadinski režim.
Korak 4: rad na zahtjev je skup pravila, a ne prekidač
isOnDemandEnabled samo priprema pravila; NEOnDemandRuleConnect i njegova braća odlučuju kada se tunel podiže. Pravilo procjene veze s probnim URL-om vrijedi onoliko koliko vrijedi taj URL. Ako proba odgovori bez tunela, pravilo zaključi da je privatna mreža već dostupna i nikada se ne poveže, pa ga usmjerite na nešto što odgovara samo iznutra.
Stalni rad je odvojeno obećanje. Traži nadzirani uređaj i upravljani profil, a korisnik bez nadzora može ukloniti profil kad god poželi. Ne isporučujte dizajn koji zavisi od stalnog rada osim ako je flota pod nadzorom.
Korak 5: dokažite putanju, a ne oznaku
Skeniranje za tun, tap, ppp ili ipsec interfejsima dokazuje da je VPN konfigurisan, a ne da ga je vaš zahtjev koristio. NWPathMonitor s usesInterfaceType(.other) kaže da je virtuelni interfejs dostupan, a rukovalac održivosti može testirati jedan host. Ni jedno ni drugo ne dokazuje izlaznu putanju, pa ih spojite sa zahtjevom ka resursu do kojeg samo tunel može doći. Imena interfejsa su dijagnostička pomoć, nikada kapija na koju bi aplikacijska logika trebala granati.
Za terensku provjeru uporedite javnu adresu sa tunelom i bez njega i dohvatite stranicu dostupnu samo iznutra. Poziv statusa može prijaviti povezanost dok davalac pregovara, pa pustite da odluči rezultat resursa, a status tretirajte kao potkrepljujući dokaz.