Għaliex Android VpnService jaqbad parti mit-traffiku u mhux kollu
Ir-rotot, id-dħul tad-DNS u l-ambitu għal kull app jiddeċiedu liema pakketti jilħqu l-apparat tun, għaliex l-apparati lokali jisparixxu u x'jirrifjuta l-bennej.
Xejn fi VpnService ma jaqbad traffiku waħdu. Huwa jitlob lill-sistema interface tun, jagħti lil dik l-interface sett ta' indirizzi u rotot, u minn dak il-mument il-kernel jikkopja kull pakkett li jaqbel ma' dawk ir-rotot f'deskrittur tal-fajl li l-app tista' taqra. Il-kodiċi tal-app qatt ma jara l-pakketti li r-rotot ma għażlux, għalhekk l-ambitu ta' tunnel hija kwistjoni ta' tabella tal-irrotar qabel ma tkun kwistjoni ta' programmazzjoni. Għalhekk l-istess implimentazzjoni tas-servizz tista' tibla' kull fluss fuq telefon wieħed u biss biċċa fuq ieħor, u għalhekk iż-żieda ta' rotta kultant issewwi tunnel li deher miksur. Dak li tikseb huwa dak li ddikjarajt, nieqes kull ma rrifjuta l-bennej bil-kwiet.
Ir-rotot jiddeċiedu liema pakketti jaslu
Builder.addRoute(prefix, prefixLength) jinstalla prefiss fit-tabella tal-irrotar tan-netwerk VPN. Is-sistema tittratta dak in-netwerk bħala l-predefuljat għall-apps fl-ambitu, għalhekk id-dħul tiegħu jiġi kkonsultat qabel ir-rotta predefinita tan-netwerk fiżiku u prefiss li jaqbel huwa biżżejjed biex idawwar fluss. Għalhekk rotta għal 0.0.0.0/0 tieħu IPv4 kollu, inklużi l-istampatur, il-mira tal-cast u l-paġna tal-amministrazzjoni tar-router.
Il-klijenti li jridu dak il-kopertura mingħajr ma jħassru d-dħul predefinit fiżiku jużaw minflok il-par 0.0.0.0/1 u 128.0.0.0/1. Żewġ rotot aktar speċifiċi jegħlbu rotta predefinita, flimkien ikopru l-ispazju kollu tal-indirizzi, u d-dħul predefinit tat-telefon innifsu jibqa' fit-tabella għas-sockets li għadhom marbuta man-netwerk fiżiku.
L-indirizzi u d-dħul tad-DNS ġejjin mill-istess bennej u jwieġbu mistoqsija differenti. addAddress jagħti lill-interface indirizz b'tul tal-prefiss, u addDnsServer jinstalla solvitur li l-apps fl-ambitu se jistaqsu dwaru permezz tal-interface. Iż-żewġ familji jistgħu joqogħdu fuq interface waħda, għalhekk sett ta' rotot biss IPv4 ħdejn indirizz IPv6 hija konfigurazzjoni li taqra sew u xorta tnixxi. Jekk tirrotta familja li l-interface m'għandhiex indirizz fiha, il-kernel m'għandux indirizz tas-sors għal dawk il-pakketti u qatt ma jidhru fid-deskrittur.
X'jirritorna establish()
establish() jirritorna ParcelFileDescriptor, jew null meta l-app mhijiex awtorizzata. Null huwa stat ta' kunsens u mhux żball tan-netwerk: VpnService.prepare() diġà kellu jirritorna null, jew l-utent kellu japprova d-djalogu tas-sistema qabel is-sejħa. Il-kunsens jista' jiġi rtirat waqt li s-servizz jaħdem, u l-interface tagħlaq taħt saqajk mingħajr ebda callback fil-linja tal-qari tiegħek.
Id-deskrittur mhuwiex imblukkar sakemm ma tgħidx mod ieħor, għalhekk qari jerġa' lura minnufih mingħajr data minflok ma jipparkja l-ħajt. Linja miktuba għal socket imblukkar taħraq qalba waħda, u linja li tittratta qari vojt bħala fatali tċarrat it-tunnel f'sekonda idle. Builder.setBlocking(true) ibiddel dak l-imġiba, u l-prezz huwa ħajt li jistenna ġewwa l-qari.
L-argumenti tar-rotta u l-indirizz jiġu vvalidati bħala valuri LinkAddress, u destinazzjonijiet multicast bħal 224.0.0.0/4 jiġu miċħuda għal kollox. Interface tun punt-punt ukoll m'għandhiex dominju tax-xandir, għalhekk l-iskoperta tal-multicast minnha teħtieġ disinn differenti minflok rotta oħra. Ir-referenza VpnService.Builder hija l-lista li trid tiġi ċċekkjata qabel ma tikkonkludi li sejħa ġiet injorata.
L-ambitu għal kull app idawwar is-sett, mhux it-tunnel
Mill-API 21 il-bennej jaċċetta addAllowedApplication u addDisallowedApplication, u ż-żewġ listi jeskludu lil xulxin fi ħdan bennej wieħed. Lista tal-permess tagħmel it-tunnel jeżisti għal dawk il-pakketti waqt li kull ħaġa oħra żżomm in-netwerk fiżiku; lista tal-projbizzjoni taqbad kollox ħlief il-pakketti msemmija, li huwa dak li klijent joffri bħala tunnel maqsum. Qabel l-API 21 m'hemm l-ebda mekkaniżmu tal-pjattaforma, u l-imġiba għal kull app ġiet minn klijenti ta' partijiet terzi li jiffiltraw skont l-UID ġewwa l-forwarder tagħhom stess. Id-differenza tgħodd meta tinnaviga l-iżbalji, għax tunnel għal kull app b'lista ta' permess ta' pakkett wieħed kważi ma jipproduċi traffiku u dik hija mġiba korretta, mhux rotta miksura.
X'ikun l-ambitu, is-socket li l-app tiegħek tiftaħ lejn is-server VPN m'għandhiex tgħaddi mit-tunnel li tkun qed tibni. VpnService.protect(socket) torbot dik is-socket man-netwerk sottostanti sabiex il-pakketti tagħha jaqbżu l-apparat tun. Jekk taqbeż is-sejħa, il-handshake jiġi miblugħ mill-interface li kellha tgħollih.
VpnService.setUnderlyingNetworks tagħlaq iċ-ċirku billi tgħid lis-sistema liema netwerk fiżiku jġorr it-tunnel. Dak il-valur jiddetermina kif il-VPN tirrapporta l-konnettività lill-apps oħra, u valur null jew antikwat huwa kawża tas-soltu ta' tunnel konness li l-bqija tat-telefon tittrattah bħala offline. Aġġornah meta jinbidel in-netwerk sottostanti, mhux biss fil-bidu.
Is-somom tal-verifika u l-MTU: fejn rotta korretta xorta tfalli
Ladarba l-pakketti jaslu, żewġ dettalji fil-livell tal-pakkett jiddeċiedu jekk xi ħaġa taħdimx minn tarf sa tarf. L-ewwel huwa l-indirizz tas-sors: b'diversi indirizzi tal-interface il-kernel jista' joħroġ pakketti li jġorru l-ewwel wieħed, għalhekk forwarder li jerġa' jikteb l-intestaturi għandu jsewwi l-indirizz u s-somma tal-verifika li tkoprih.
It-tieni huwa l-ambitu tas-somma tal-verifika. Meta l-app tibni l-pakketti TCP jew UDP hija stess, is-somma tal-verifika tkopri pseudo-intestatura li żżomm l-indirizz tas-sors, l-indirizz tad-destinazzjoni, in-numru tal-protokoll u t-tul tat-trasport, u li tħalli barra wieħed minnhom jagħti pakketti li jaslu u jiġu mwarrba. Dak il-falliment jidher bħal timeout wara tweġiba li qatt ma tiġi, li jibgħat lil ħafna nies lura għar-rotot. setMtu jiffissa l-MTU tal-interface, u kull qari jirritorna eżattament pakkett IP komplut wieħed, għalhekk buffer miktub għal fluss ta' bytes se jfarrka l-analiżi tiegħek, mhux il-pakkett.
Dawra ta' verifika li tifred il-livelli
Biex issib fejn l-ambitu tħarbat, ipprova l-livelli bil-qies. Staqsi lill-apparat liema rotot iżżomm verament in-netwerk VPN, imbagħad iċċekkja jekk fluss lejn indirizz magħruf jidhirx bħala qari fid-deskrittur, imbagħad iċċekkja jekk il-pakkett li joħroġ il-forwarder tiegħek huwiex iffurmat tajjeb. Problema ta' rotta ma turi xejn fid-deskrittur, filwaqt li problema tas-somma tal-verifika turi pakkett li jasal u jisparixxi.
Jekk xejn ma jasal fid-deskrittur, is-suspettat huwa s-sett tar-rotot u mhux il-qarrej: ikkonferma l-prefissi, ikkonferma li hemm indirizz fl-istess familja, u kkonferma li l-app hija fl-ambitu li stabbilixxejt. Jekk il-pakketti jaslu fid-deskrittur imma xejn ma jerġa' lura, eżamina protect() u l-valur tan-netwerk sottostanti qabel ma terġa' tmiss rotta. Jekk in-naħa 'l bogħod tirrapporta pakketti difettużi, is-somma tal-verifika u l-MTU huma l-postijiet fejn tħares. Prova waħda għal kull livell tiffranka nofs jum ta' tħassib.