De ferkearde oanname is dat in VpnService-app in systeemskakelaar omdraait en dat de tillefoan fan dat stuit ôf beskerme is. Wat der echt bart, is smeller: de app freget om ynstimmen, bout in ynterface, lêst en skriuwt pakketten troch in triemdeskriptor, en jout it ynterface werom as er stopt. Der kin tagelyk mar ien sa’n tunnel libje, en it systeem kin him fuortnimme sûnder te freegjen. It measte fan it betiizjende gedrach dat minsken it protokol oanrekkenje, komt út dat eigendomsmodel.

Behannelje elke oergong yn ’e libbenssyklus as part fan it ûntwerp, net as in rânegefal.

Myt: de app set de VPN fan ’e tillefoan oan

De stream begjint mei VpnService.prepare(), dy’t in Intent weromjout dy’t de brûker akseptearje moat, en giet fierder mei establish(), dy’t dêrnei noch mislearje kin om redenen dy’t de app net beheart. It oanmeitsjen fan in twadde tunnel deaktivearret it earste ynterface en ferfangt de systeemnotifikaasje. Nearne yn dy searje hat de app in skakelaar foar it hiele apparaat; se hat de deskriptor dy’t har jûn is en de pakketten dy’t dêrop lânje. Sels de oanhâldende notifikaasje heart ta it systeem en net ta it ûntwerp fan ’e app.

Om’t it ynterface jûn wurdt ynstee fan grepen, kin in oare klant it plak op elk stuit ynnimme. De app leart dat troch in weromrop, net troch in weromjefte.

It twingend stopjen fan ’e app is om deselde reden te sjen yn it notifikaasjepaniel: it systeem meldt wat it jûn hat, net wat de app keazen hat te toanen.

Myt: ynstimmen wurdt ien kear jûn

As it systeem de tunnel oerdraacht oan in oare klant, stjoert it in ynlûktransaksje op ’e binder dy’t de basisklasse weromjout út onBind(). In app dy’t dy binder ferfangt troch syn eigen, moat de ynlûktransaksje sels trochstjoere, oars giet VpnService.onRevoke() nea ôf en bliuwt de tsjinst skriuwen yn in deskriptor dy’t net mear bestiet. De goedkarring kin ek troch de brûker weromlutsen wurde, en it systeem kin de tsjinst stopje by in werstart of in altyd-aan-ferbining.

It behanneljen dêrfan is konkreet wurk, net in logrigel: stop mei it lêzen fan de deskriptor, slút him, wiskje de ferbûn-flagge en fertel de brûker yn hokker steat er is. Beskiede dan oft de app opnij oanmeitsje, wer freegje of wachtsje moat, want yn in altyd-aan-konfiguraasje kin it systeem de tsjinst sels werombringe.

In app dy’t ynlûken as in útsûndering behannelet en net as in steat, sil melde dat er ferbûn is wylst elk pakket dat er skriuwt ferlern giet, en dat is de minst mooglike flatermodus foar in privacy-ark.

Myt: it ynterface filteret ferkear foar jo

Wat oankomt is rûch IP. Fange of filterje betsjut IP-, TCP-, UDP- en IPv6-kopteksten ûntliede, streams folgje en antwurden werom skriuwe nei de deskriptor, wat in fangapp in lyts netwurkstapel makket ynstee fan in systeemfoarsjenning. protect() bestiet sadat de eigen transport-socket fan ’e app syn tunnel foarby giet ynstee fan himsels te fangen, en it jout in booleaanske wearde werom dy’t in kontrôle fertsjinnet op elke socket dy’t makke wurdt neidat de tunnel oan is.

De listen fan tastiene en ferbeane apps yn ’e bouwer beslisse waans ferkear it ynterface ynkomt. Se jouwe gjin tagong ta lading bûten de IP-pakketten dy’t it ynterface draacht, en gjin inkel API leit de tunnel fan in oare klant bleat of listet de VPN-profylen fan it systeem op. Netwurkmooglikheden kinne sizze dat in netwurk VPN-transport is, mar net waans tunnel it is.

Dêrom krije steatsfragen oer oare apps tsjinstridige antwurden: de ynformaasje wurdt gewoanwei net oan jo proses bleatlein.

Wat de libbenssyklus eins freget

Folgje de steaten dy’t jo beheare: taret, oanmakke, weromlutsen, stoppe. Werferbinen heart ûntbinen te wêzen folge troch oanmeitsjen, mei ien eigner foar de deskriptor en de transport-socket, want twa komponinten dy’t om it oanmeitsjen wrakselje, fjochtsje om it iene frije plak. Eftergrûnstarts binne beheind op modern Android, dus in boot-útstjoering is gjin garânsje; brûk in foargrûntsjinst mei syn notifikaasje dêr’t it API-nivo it tasteat.

Loch de oergong en net allinnich de einsteat, en hâld de steatmasine lyts genôch om elk paad te testen. In steat dy’t jo yn in test net berikke kinne, is in steat dy’t jo yn it fjild sûnder log treffe sille.

Test de libbenssyklus op in apparaat

Emulators kinne ferbining neibeare mar it paad fan ynstimmen en ynlûken net oertsjûgjend, dus rin dizze op in echt apparaat mei in twadde VPN-klant ynstallearre om it plak te stellen.

adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp

Start de tunnel, befêstigje de notifikaasje en it ynterface, ferbyn dan de oare klant en sjoch oft de weromrop foar ynlûken rint en oft de steat skjin wurdt. Stop de app twingend en kontrolearje oft der noch wat in libbene deskriptor meldt.

Werhelje de searje nei in altyd-aan-werstart, want dat paad ferskilt fan in ferbining dy’t de brûker begjint. Wat jo sykje is gjin grien ikoan mar bewiis dat de app opholden is mei it brûken fan in deskriptor dy’t er net mear hie.

Relatearre artikelen