VpnService(e)n ezerk ez du trafikorik bere kabuz atzematen. Sistemari tun interfaze bat eskatzen dio, interfaze horri helbide eta bide multzo bat ematen dio, eta unetik aurrera kernela bide horiekin bat datozen pakete guztiak aplikazioak irakur dezakeen fitxategi deskriptore batera kopiatzen du. Aplikazioaren kodeak ez ditu inoiz ikusten bideek hautatu ez zituzten paketeak, beraz tunel baten esparrua bideratze-taularen kontua da programazio-kontua baino lehen. Horregatik, zerbitzuaren inplementazio berak fluxu guztiak irensten ditu telefono batean eta zati bat beste batean, eta horregatik bide bat gehitzeak batzuetan konpondu egiten du hautsita zirudien tunel bat. Lortzen duzuna deklaratu duzuna da, eraikitzaileak isilka ukatu zuen guztia kenduta.

Bideek erabakitzen dute zein pakete iristen diren

Builder.addRoute(prefix, prefixLength)(e)k aurrizki bat instalatzen du VPN sarearen bideratze-taulan. Sistemak sare hori esparruko aplikazioentzako lehenespen gisa tratatzen du, beraz haren sarrerak sare fisikoaren lehenespen-bidearen aurretik kontsultatzen dira eta bat datozen aurrizki bat nahikoa da fluxu bat desbideratzeko. Beraz 0.0.0.0/0(r)ako bide batek IPv4 osoa hartzen du, inprimagailua, cast helburua eta routerraren administrazio-orria barne.

Lehenespen-sarrera fisikoa ezabatu gabe estaldura hori nahi duten bezeroek 0.0.0.0/1 eta 128.0.0.0/1 bikotea erabiltzen dute horren ordez. Bi bide zehatzagoek lehenespen-bide bat gainditzen dute, elkarrekin helbide-espazio osoa hartzen dute, eta telefonoaren bere lehenespen-sarrera taulan geratzen da oraindik sare fisikoari lotuta dauden socketei begira.

Helbideak eta DNS sarrerak eraikitzaile beretik datoz eta beste galdera bati erantzuten diote. addAddress(e)k interfazeari helbide bat ematen dio aurrizki-luzerarekin, eta addDnsServer(e)k esparruko aplikazioek interfazearen bidez galdetuko dioten ebazlea instalatzen du. Bi familiak interfaze berean egon daitezke, beraz IPv4 soilik bide multzo bat IPv6 helbide baten ondoan zuzen irakurtzen den eta hala ere irakurtzen uzten duen konfigurazioa da. Interfazeak helbiderik ez duen familia bat bideratzen baduzu, kernelak ez du iturburu-helbiderik pakete horientzat eta ez dira inoiz deskriptorean agertzen.

Zer itzultzen du establish()(e)k

establish()(e)k ParcelFileDescriptor bat itzultzen du, edo null aplikazioa baimenduta ez dagoenean. Null baimen-egoera da, ez sare-errorea: VpnService.prepare()(e)k jadanik null itzuli behar zuen, edo erabiltzaileak deiaren aurretik sistemako elkarrizketa onartu behar zuen. Baimena baliorik gabe utz daiteke zerbitzua martxan dagoen bitartean, eta interfazea zure oinen azpitik ixten da zure irakurketa-begiztara deirik izan gabe.

Deskriptorea ez da blokeatzailea kontrakoa esan ezean, beraz irakurketa bat berehala itzultzen da daturik gabe, haria aparkatu beharrean. Sockete blokeatzaile batentzat idatzitako begizta batek nukleo bat erretzen du, eta irakurketa huts bat hilgarritzat jotzen duen begizta batek tunela urratzen du segundo alfer batean. Builder.setBlocking(true)(e)k portaera hori aldatzen du, eta prezioa irakurketaren barruan itxaroten duen haria da.

Bide eta helbide argumentuak LinkAddress balio gisa baliozkotzen dira, eta multicast helmugak, hala nola 224.0.0.0/4, zuzenean ukatzen dira. Puntutik punturako tun interfazeak ez du broadcast domeinurik ere, beraz haren bidezko multicast aurkikuntzak beste diseinu bat behar du, beste bide bat beharrean. VpnService.Builder erreferentzia da deiren bat alde batera utzi zela ondorioztatu aurretik aztertu beharreko zerrenda.

Aplikazioko esparruak multzoa estutzen du, ez tunela

API 21etik aurrera eraikitzaileak addAllowedApplication eta addDisallowedApplication onartzen ditu, eta bi zerrendak elkarren baztertzaileak dira eraikitzaile berean. Baimenduen zerrendak tunela pakete horientzako existiarazten du, gainerako guztiak sare fisikoa mantentzen duen bitartean; debekatuen zerrendak izendatutako paketeak ez beste guztia atzematen du, hori da bezero batek tunel zatitu gisa eskaintzen duena. API 21 baino lehen ez dago plataformako mekanismorik, eta aplikazioko portaera hirugarrenen bezeroetatik zetorren, beren aurreratzailean UIDaren arabera iragazten zutenak. Bereizketa garrantzitsua da araztean, pakete bakarreko baimenduen zerrenda duen aplikazioko tunel batek ia trafikorik sortzen ez duelako, eta hori portaera zuzena da, ez bide hautsia.

Esparrua edozein dela ere, zure aplikazioak VPN zerbitzarira irekitzen duen socketak ez du eraikitzen ari den tunelatik bidaiatu behar. VpnService.protect(socket)(e)k socket hori azpiko sarera lotzen du, haren paketeek tun gailua saihesteko. Deia saltatzen baduzu, esku-ematea altxatu behar zuen interfazeak irensten du.

VpnService.setUnderlyingNetworks(e)k zirkulua ixten du sistemari tunela zein sare fisikok daraman esanez. Balio horrek zehazten du nola jakinarazten dion VPN(e)k konektibitatea beste aplikazioei, eta null edo zaharkitutako balio bat ohiko arrazoia da telefonoaren gainerakoak lineaz kanpokotzat jotzen duen tunel konektatu baterako. Eguneratu azpiko sarea aldatzen denean, ez soilik abiaraztean.

Egiaztapen-batuketak eta MTU: non bide zuzen batek huts egiten duen oraindik

Paketeak iritsi ondoren, pakete mailako bi xehetasunek erabakitzen dute zerbait muturretik muturrera funtzionatzen duen. Lehenengoa iturburu-helbidea da: interfaze-helbide batzuk daudenean kernelak lehenengoa daramaten paketeak igor ditzake, beraz goiburuak berridazten dituen aurreratzaile batek helbidea eta hura estaltzen duen egiaztapen-batuketa zuzendu behar ditu.

Bigarrena egiaztapen-batuketaren esparrua da. Aplikazioak berak TCP edo UDP paketeak eraikitzen dituenean, egiaztapen-batuketak iturburu-helbidea, helburu-helbidea, protokolo-zenbakia eta garraio-luzera dituen sasi-goiburua estaltzen du, eta horietako edozein baztertzeak iristen eta baztertzen diren paketeak ematen ditu. Hutsegite hori inoiz iristen ez den erantzun baten ondorengo denbora-muga bezala agertzen da, eta horrek jende gehiena bideetara itzularazten du. setMtu(e)k interfazearen MTU finkatzen du, eta irakurketa bakoitzak IP pakete oso bat zehazki itzultzen du, beraz byte-fluxu baterako idatzitako buffer batek zure analisia zatikatuko du, ez paketea.

Geruzak bereizten dituen egiaztapen-joanaldia

Esparrua non okertu zen aurkitzeko, probatu geruzak ordenan. Galdetu gailuari zein bide dituen VPN sareak benetan, gero egiaztatu helbide ezagun baterako fluxu bat deskriptorean irakurketa gisa agertzen den, gero egiaztatu zure aurreratzaileak igortzen duen paketea ondo eratuta dagoen. Bide-arazo batek ez du ezer erakusten deskriptorean, egiaztapen-batuketa arazo batek iristen eta desagertzen den pakete bat erakusten duen bitartean.

Deskriptorera ezer iristen ez bada, susmagarria bide-multzoa da, ez irakurgailua: berretsi aurrizkiak, berretsi familia berean helbide bat dagoela, eta berretsi aplikazioa ezarri zenuen esparruaren barruan dagoela. Paketeak deskriptorera iristen badira baina ezer ez bada itzultzen, aztertu protect() eta azpiko sarearen balioa bide bat berriro ukitu aurretik. Urrutiko aldeak pakete gaizki eratuak jakinarazten baditu, egiaztapen-batuketa eta MTU dira begiratzeko lekuak. Geruza bakoitzeko sonda batek arratsalde bat aurrezten du asmakizunetan.

Erlazionatutako artikuluak