Je iPhone v VPN? Kaj lahko aplikacija iOS v resnici vidi
V iOS SDK ni ene same zastavice VPN. Aplikacija lahko opazuje le svojo konfiguracijo, obvestilo o stanju in omejen posnetek proxyja, nič več.
Vprašajte aplikacijo iOS, ali je telefon v VPN, in pošten odgovor je, da tega ne more vedeti v smislu, ki ga imate v mislih. SDK ne izpostavlja nobene zastavice za «naprava je v tunelu», zasebni vmesniki, ki bi se temu lahko približali, pa so zaprti za objavljene aplikacije. Opazujete lahko lastno konfiguracijo aplikacije, stanje, povezano z njo, in eno ali dve posredni namigi iz omrežnega sklada. Vsaka odgovarja na drugo vprašanje, in večina pokvarjenih preverjanj izhaja iz tega, da eno od njih vzamemo za celoten odgovor.
Mit o eni sami zastavici VPN
Prepričanje je, da nekje v SDK obstaja lastnost, ki poroča, ali je naprava v tunelu, tako kot zastavica dosegljivosti poroča, ali gostitelj odgovarja. Takšne javne lastnosti ni. In tudi če bi bila, sta «tunel obstaja» in «moj promet ga uporablja» različni trditvi, in za večino aplikacij šteje le druga.
Prav ta vrzel je razlog, da knjižnice, ki oglašujejo enovrstični detektor VPN, običajno berejo nekaj krhkega, na primer ime vmesnika ali ključ proxyja, in to predstavijo kot sodbo.
Naložite nastavitve, preden zaupate nil
Skupni primerek upravitelja obstaja takoj, ko ga zahtevate, vendar njegova lastnost protokola ostane nil, dokler se povratni klic nalaganja ne zaključi. Zato nil protokol pomeni «še ni naloženo» vsaj tako pogosto kot «ni nameščeno». Berite znotraj bloka dokončanja in šele nato odločite: obstoječi objekt protokola z vklopljeno zastavico omogočanja je videz «nameščeno».
Drugi signal je na objektu povezave: neveljavno stanje, ki ga sistem sporoči, ko ta aplikacija nima nameščene konfiguracije. Neveljavno stanje skupaj z nil protokolom po zaključenem nalaganju je resnična odsotnost, ne tekma s časom.
Spremembe povezave prihajajo kot obvestila
Upravljalniki, predani v load in save, poročajo, kaj se je zgodilo s konfiguracijo, ne kaj počne tunel. Čakanje, da se eden od njih sproži ob povezavi, je tekma, ki se nikoli ne razreši. Namesto tega spremljajte obvestilo o spremembi stanja in preberite trenutno vrednost objekta povezave, ko prispe.
Ko je konfiguracija nameščena, stanje povezave preide kratko zaporedje: prekinjeno, povezovanje, povezano, ponovno potrjevanje, prekinjanje. «Povezano» opisuje tunel in ne strežnika za njim, zato ni dokaz, da promet teče. On-demand lahko dvigne tunel tudi medtem ko je aplikacija ustavljena, in takrat obvestilo prispe, preden imate kaj posodobiti.
Omejen posnetek proxyja je namig, ne sodba
CFNetwork lahko aplikaciji preda trenutne sistemske nastavitve proxyja, in znotraj tega rezultata je omejen slovar s ključem po imenu vmesnika. Ime, ki se začne s tun, utun, ppp, ipsec ali tap, je namig, da tunel obstaja. Ostaja posnetek tega, kar ta aplikacija vidi, ne izjava o tem, kam potujejo paketi.
Ponudniki se ne strinjajo glede poimenovanja, zato manjkajoča predpona ničesar ne dokazuje, in prisoten vmesnik lahko obstaja, ne da bi prenašal promet. Dosegljivost je še šibkejša: uspešna zahteva na zasebni naslov pokaže, da je pot za to zahtevo v tistem trenutku delovala, ne da je VPN nameščen.
Simulator si izposodi Mac, druge aplikacije pa ostanejo nevidne
Simulator nima lastnega omrežnega sklada; vsaka povezava, ki jo vzpostavi, je Macova. VPN, ki teče na gostiteljskem Macu, torej že velja za simulirano aplikacijo, nastavitve simulatorja samega pa ne pokažejo ničesar. Če se je tunel dvignil po zagonu simulatorja, ga je običajno hitreje znova zagnati kot razhroščevati aplikacijo. Gostitelj na nestandardnih vratih potrebuje ta vrata v URL-ju ali lokalno posredovanje, kot je socat TCP-LISTEN:12345,fork TCP:host:12345.
Javni API-ji ne bodo naštevali profilov VPN, ki pripadajo drugim aplikacijam ali konfiguracijskim profilom. Za eno znano aplikacijo je prenosni trik preizkus sheme URL prek canOpenURL, in od iOS 9 mora biti poizvedovana shema deklarirana v vašem Info.plist; če jo izpustite, klic vrne false. OpenVPN Connect se odziva na openvpn://, kar ga naredi dober primer in slab splošni detektor.
Združite tri opažanja in povejte, kaj pomenijo
V praksi zložite tri rezultate: konfiguracijo, ki se je naložila in je omogočena, stanje povezave, ki ni neveljavno, in zahtevo na naslov, dosegljiv le skozi tunel. Vsak zase zavaja; skupaj povedo, kaj aplikacija lahko ve, in ne, kaj uporabnik domneva.
Rezultat zapišite kot tri vrstice v diagnostiki, ne kot en boolean. Ko uporabnik pravi, da je VPN izklopljen, vaša aplikacija pa se ne strinja, tri vrstice pokažejo, katero opažanje je odstopilo, in to je razlika med zahtevkom za podporo, na katerega lahko ukrepate, in tistim, ki se konča z «pri meni dela».