Kysy iOS-sovellukselta, onko puhelin VPN:ssä, ja rehellinen vastaus on, ettei se voi tietää sitä sillä tavalla kuin tarkoitat. SDK ei tarjoa lippua «laite on tunnelissa», ja yksityiset rajapinnat, jotka voisivat lähestyä sitä, ovat suljettuja julkaistavilta sovelluksilta. Voit havainnoida sovelluksesi omaa määritystä, siihen liittyvää tilaa ja yhtä tai kahta epäsuoraa vihjettä verkkopinosta. Jokainen vastaa eri kysymykseen, ja useimmat rikkinäiset tarkistukset syntyvät siitä, että yksi niistä otetaan koko vastaukseksi.

Yhden VPN-lipun myytti

Uskomus on, että jossain SDK:ssa on ominaisuus, joka kertoo, onko laite tunnelissa, samoin kuin tavoitettavuuslippu kertoo, vastaako isäntä. Sellaista julkista ominaisuutta ei ole. Vaikka olisikin, «tunneli on olemassa» ja «liikenteeni käyttää sitä» ovat eri väitteitä, ja useimmille sovelluksille vain jälkimmäinen merkitsee.

Juuri tämä aukko on syy siihen, miksi yhden rivin VPN-tunnistinta mainostavat kirjastot lukevat yleensä jotain haurasta, kuten rajapinnan nimen tai proxy-avaimen, ja esittävät sen tuomiona.

Lataa asetukset ennen kuin luotat niliin

Jaettu hallintaolio on olemassa heti kun pyydät sitä, mutta sen protokollaominaisuus pysyy nilinä, kunnes latauksen callback päättyy. Niinpä nil-protokolla tarkoittaa «ei vielä ladattu» ainakin yhtä usein kuin «ei asennettu». Tee lukeminen valmistumislohkon sisällä ja päätä vasta sitten: olemassa oleva protokollaolio, jonka käyttöönottolippu on päällä, näyttää «asennetulta».

Toinen signaali on yhteysoliossa: virheellinen tila, jonka järjestelmä ilmoittaa, kun tällä sovelluksella ei ole asennettua määritystä. Virheellinen tila yhdessä nil-protokollan kanssa täydellisen latauksen jälkeen on todellinen puuttuminen, ei ajoituskilpailu.

Yhteyden muutokset tulevat ilmoituksina

Loadille ja savelle annetut käsittelijät ilmoittavat, mitä määritykselle tapahtui, eivät sitä, mitä tunneli tekee. Yhden niistä odottaminen yhteyden muodostuksen yhteydessä on kilpailu, joka ei koskaan ratkea. Seuraa sen sijaan tilanmuutosilmoitusta ja lue yhteysolion nykyinen arvo, kun se saapuu.

Kun määritys on asennettu, yhteystila käy läpi lyhyen sarjan: katkaistu, yhdistää, yhdistetty, vahvistaa uudelleen, katkaisee. «Yhdistetty» kuvaa tunnelia eikä sen takana olevaa palvelinta, joten se ei ole todiste liikenteen kulkemisesta. On-demand voi myös nostaa tunnelin, kun sovellus on keskeytetty, ja silloin ilmoitus saapuu ennen kuin sinulla on mitään päivitettävää.

Rajattu proxy-hetkikuva on vihje, ei tuomio

CFNetwork voi antaa sovellukselle järjestelmän nykyiset proxy-asetukset, ja tuloksen sisällä on rajattu sanakirja, jonka avain on rajapinnan nimi. Nimen näkeminen, joka alkaa kirjaimilla tun, utun, ppp, ipsec tai tap, on vihje tunnelin olemassaolosta. Se on edelleen hetkikuva siitä, mitä tämä sovellus voi nähdä, ei väite siitä, minne paketit matkaavat.

Palveluntarjoajat eivät ole yksimielisiä nimeämisestä, joten puuttuva etuliite ei todista mitään, ja olemassa oleva rajapinta voi olla kuljettamatta liikennettä. Tavoitettavuus on vielä heikompaa: onnistunut pyyntö yksityiseen osoitteeseen osoittaa, että reitti toimi kyseiselle pyynnölle sillä hetkellä, ei että VPN on asennettu.

Simulaattori lainaa Macia, ja muut sovellukset jäävät näkymättömiksi

Simulaattorilla ei ole omaa verkkopinoa; jokainen sen tekemä yhteys on Macin. Siksi isäntä-Macissa toimiva VPN on jo voimassa simuloidulle sovellukselle, eikä simulaattorin omat asetukset näytä mitään. Jos tunneli nousi simulaattorin käynnistymisen jälkeen, sen uudelleenkäynnistys on yleensä nopeampaa kuin sovelluksen virheenjäljitys. Isäntä, joka on ei-standardiportissa, tarvitsee sen portin URL:iin tai paikallisen edelleenohjauksen kuten socat TCP-LISTEN:12345,fork TCP:host:12345.

Julkiset API:t eivät luettele VPN-profiileja, jotka kuuluvat muille sovelluksille tai määritysprofiileille. Yhdelle tunnetulle sovellukselle kannettava temppu on URL-skeeman kokeilu canOpenURL:n kautta, ja iOS 9:stä lähtien kysytyn skeeman on oltava ilmoitettu Info.plistissäsi; jos jätät sen pois, kutsu palauttaa false. OpenVPN Connect vastaa openvpn://:aan, mikä tekee siitä hyvän esimerkin ja huonon yleisen tunnistimen.

Yhdistä kolme havaintoa ja kerro, mitä ne tarkoittavat

Pinoa käytännössä kolme tulosta: määritys, joka latasi ja on käytössä, yhteystila, joka ei ole virheellinen, ja pyyntö osoitteeseen, joka on tavoitettavissa vain tunnelin kautta. Kukin yksin johtaa harhaan; yhdessä ne kertovat, mitä sovellus voi tietää, eivät sitä, mitä käyttäjä olettaa.

Kirjoita tulos diagnostiikkaasi kolmena rivinä, älä yhtenä booleanina. Kun käyttäjä sanoo VPN:n olevan pois päältä ja sovelluksesi on eri mieltä, kolme riviä näyttävät, mikä havainto poikkesi, ja se on ero sellaisen tukipyynnön välillä, jolle voit tehdä jotain, ja sellaisen, joka päättyy sanoihin «minulla se toimii».

Aiheeseen liittyvät artikkelit