Pitajte iOS aplikaciju je li telefon na VPN-u i iskren odgovor je da to ne može znati onako kako vi mislite. SDK ne nudi nikakav flag za «uređaj je u tunelu», a privatna sučelja koja bi mu se mogla približiti zatvorena su za aplikacije koje se objavljuju. Možete promatrati vlastitu konfiguraciju aplikacije, stanje vezano za nju i jedan ili dva posredna nagovještaja iz mrežnog stacka. Svaki odgovara na drugo pitanje, a većina pokvarenih provjera dolazi od toga da se jedan od njih uzme kao cijeli odgovor.

Mit o jednom VPN flagu

Uvjerenje je da negdje u SDK-u postoji svojstvo koje javlja je li uređaj u tunelu, kao što flag dostupnosti javlja odgovara li host. Takvo javno svojstvo ne postoji. Čak i da postoji, «tunel postoji» i «moj promet ga koristi» su različite tvrdnje, a većini aplikacija važna je samo druga.

Zbog te praznine biblioteke koje reklamiraju detektor VPN-a u jednom redu obično čitaju nešto krhko, poput naziva sučelja ili proxy ključa, i predstavljaju to kao presudu.

Učitajte postavke prije nego povjerujete nilu

Dijeljena instanca upravitelja postoji čim je zatražite, ali njeno svojstvo protokola ostaje nil dok se ne završi load callback. Zato nil protokol znači «još nije učitano» barem jednako često kao «nije instalirano». Obavite čitanje unutar completion bloka i tek onda odlučite: protokol objekt koji postoji, s uključenim enable flagom, tako izgleda «instalirano».

Drugi signal je na connection objektu: nevažeće stanje, koje sistem javlja kada ova aplikacija nema instaliranu konfiguraciju. Nevažeći status zajedno s nil protokolom nakon završenog učitavanja prava je odsutnost, a ne trka s vremenom.

Promjene veze dolaze kao obavještenja

Rukovatelji predani u load i save javljaju šta se dogodilo s konfiguracijom, a ne šta tunel radi. Čekanje da se jedan od njih aktivira pri spajanju je trka koja se nikad ne razriješi. Umjesto toga pratite obavještenje o promjeni statusa i pročitajte trenutnu vrijednost connection objekta kad stigne.

Kad je konfiguracija instalirana, stanje veze prolazi kratak niz: prekinuto, povezivanje, povezano, ponovno potvrđivanje, prekidanje. «Povezano» opisuje tunel, a ne server iza njega, pa nije dokaz da promet teče. On-demand može podići tunel i dok je aplikacija suspendirana, a tada obavještenje stigne prije nego što imate šta ažurirati.

Ograničeni proxy snimak je nagovještaj, ne presuda

CFNetwork može aplikaciji dati trenutne sistemske proxy postavke, a unutar tog rezultata je ograničen rječnik s ključem po nazivu sučelja. Naziv koji počinje s tun, utun, ppp, ipsec ili tap nagovještaj je da tunel postoji. To ostaje snimak onoga što ova aplikacija može vidjeti, a ne tvrdnja o tome kuda paketi putuju.

Provajderi se ne slažu oko imenovanja, pa prefiks koji nedostaje ništa ne dokazuje, a prisutno sučelje može postojati i bez prometa. Dostupnost je još slabija: uspješan zahtjev na privatnu adresu pokazuje da je put radio za taj zahtjev u tom trenutku, a ne da je VPN instaliran.

Simulator posuđuje Mac, a druge aplikacije ostaju nevidljive

Simulator nema vlastiti mrežni stack; svaka veza koju uspostavi je Macova. Zato je VPN koji radi na host Macu već na snazi za simuliranu aplikaciju, a postavke samog simulatora ne pokazuju ništa. Ako je tunel podignut nakon pokretanja simulatora, ponovno pokretanje obično je brže od otklanjanja grešaka u aplikaciji. Host na nestandardnom portu treba taj port u URL-u ili lokalno prosljeđivanje poput socat TCP-LISTEN:12345,fork TCP:host:12345.

Javni API-ji neće nabrojati VPN profile koji pripadaju drugim aplikacijama ili konfiguracijskim profilima. Za jednu poznatu aplikaciju prenosivi trik je proba URL sheme kroz canOpenURL, a od iOS 9 tražena shema mora biti deklarisana u vašem Info.plist; izostavite je i poziv vraća false. OpenVPN Connect odgovara na openvpn://, što ga čini dobrim primjerom i lošim općim detektorom.

Kombinirajte tri opažanja i recite šta znače

U praksi složite tri rezultata: konfiguraciju koja se učitala i uključena je, stanje veze koje nije nevažeće i zahtjev na adresu dostupnu samo kroz tunel. Svako pojedinačno obmanjuje; zajedno kazuju šta aplikacija može znati, a ne šta korisnik pretpostavlja.

Zapišite rezultat kao tri reda u dijagnostici, a ne kao jedan boolean. Kad korisnik kaže da je VPN isključen, a vaša aplikacija se ne slaže, tri reda pokazuju koje je opažanje odstupilo, i to je razlika između zahtjeva za podršku na koji možete djelovati i onog koji završi s «radi kod mene».

Povezani članci