It-tunnel jitla', l-ikona taċ-ċavetta tidher, u kull talba fil-browser għadha tispiċċa fil-ħin. F'app VpnService dik il-kombinazzjoni normalment tfisser li l-linja tal-qari hija ħajja u n-nofs tal-ħruġ miksur, mhux li s-server irreżista l-handshake. Android diġà ħoloq l-interface, mexxa t-traffiku tal-app ġo fiha u ta lill-proċess tiegħek descriptor tal-fajl. Kollox wara dak id-descriptor huwa l-kodi tiegħek, u sejħa waħda nieqsa biżżejjed biex tibla' l-fluss kollu.

X'jagħtik is-sistema u x'ma jagħtikx

establish() jirritorna ParcelFileDescriptor għal interface tun. Is-sistema tikteb pakketti IP ħerġin ġo fih u tistenna li l-proċess tiegħek jaqrahom, jiddeċiedi fejn imorru u jibgħathom permezz ta' socket ordinarju. Taħtu m'hemmx forwarding fil-kernel, għalhekk meta ħadd ma jaqra l-pakketti jintefgħu u l-counters tal-interface qatt ma jiċċaqalqu.

Ibda billi tgħodd minflok taħseb. Żid counter ma' kull qari b'suċċess u rrekordja d-destinazzjoni u l-protokoll tal-ewwel pakketti. Jekk il-counter jibqa' f'żero waqt li t-traffiku qed jiġi ġġenerat, il-ħsara tinsab 'il fuq mill-kodi tal-forwarding tiegħek, li jiddejjaq it-tiftix għall-konfigurazzjoni tal-builder u l-mod tal-qari. Jekk il-counter jiċċaqlaq u l-browser xorta jonqos, il-ħsara tinsab fil-passaġġ tat-tluq jew tar-ritorn.

Qari blokkani jiddeċiedi jekk il-linja timxix

setBlocking(true) ipoġġi d-descriptor fil-mod blokkani u jeżisti minn API 21. Fil-verżjonijiet anzjani s-soluzzjoni hija għajnuna JNI żgħira li tnaddaf O_NONBLOCK b'fcntl fuq id-descriptor mhux maħdum. Il-mod huwa importanti għax jiddeċiedi x'jista' jagħmel qari mingħajr pakkett li qed jistenna.

Fil-mod mhux blokkani dak il-qari jirritorna mill-ewwel bi valur negattiv, u linja li tinjora r-riżultat iddawwar qalba mingħajr ma ċċaqlaq traffiku. Fil-mod blokkani l-qari jistenna, li huwa dak li trid il-ħajta tal-forwarding, imma mbagħad il-ħajta ma tistax tiġi interrotta. L-għeluq tad-descriptor huwa l-mod appoġġjat biex il-qari jonqos sabiex il-linja tkun tista' toħroġ. Li toqtol il-proċess jew tinterrompi l-ħajta jista' jħalli t-tluq li jmiss b'descriptor li ma jibqax jaqbel mal-interface.

Aqra pakkett wieħed kull sejħa f'buffer fid-daqs tal-MTU tal-interface, u ttratta żero jew ritorn negattiv bħala żball, mhux bħala pakkett vojt.

protect() qabel l-ewwel tluq, mhux warajh

Kull socket li jġorr pakkett inkapsulat irid jiġi protett l-ewwel. Socket mhux protett jobdi l-istess regoli tar-routing li għadek kemm installajt, għalhekk il-pakketti tiegħu jerġgħu lura fit-tunnel u l-linja tal-qari tiegħek terġa' taqbadhom. It-tunnel imbagħad jgħaddi l-ħruġ tiegħu innifsu bla tarf, u minn barra jidher bħal konnessjoni li tiftaħ u qatt ma twieġeb.

L-ordni hija protect, imbagħad connect jew bind, imbagħad send. Sejħa protect wara connect tista' tħalli d-deċiżjoni preċedenti tar-rotta, għalhekk is-socket ikompli juża l-passaġġ ħażin anki jekk is-sejħa rritornat true. Iċċekkja l-boolean li jirritorna u falli b'leħen għoli meta jkun false, minflok tidħol fi tluq li ma jistax jaħdem.

Żball ta' permess minn sendto fuq socket li qatt ma mess protect() huwa s-sinjal tas-soltu ta' dan l-iżball.

Il-kampjun UDP ma jġorrx HTTPS

Il-kampjun tal-forwarding li jikkupjaw ħafna tutorials jimmaniġġja UDP u xejn aktar. TCP jeħtieġ handshake, numri ta' sekwenza, konfermi u trażmissjoni mill-ġdid, u linja li tikkupja l-load bejn descriptor tun u socket ma tipprovdi ebda waħda minnhom. Għalhekk mistoqsija DNS permezz ta' UDP tista' tgħaddi waqt li kull talba HTTPS toqgħod. Jew tmexxi stack TCP fl-ispazju tal-utent jew agħti l-konnessjonijiet lil proxy lokali li jtemm TCP fuq it-tagħmir u jgħaddi l-fluss.

Ittestja d-diviżjoni qabel terġa' tikteb xejn: ibgħat mistoqsija UDP waħda u iftaħ konnessjoni TCP waħda lejn l-istess host. Jekk il-passaġġ UDP jaħdem u l-passaġġ TCP jinqabad fl-ewwel SYN, il-problema hija l-kodi tal-forwarding u mhux is-server. Dik il-paragun waħda tiffranka ħafna ħin li jintefa' jaqra logs tas-server li ma fihom xejn utli.

Il-lista tar-rotot u l-filtri skont l-app jillimitaw dak li tara

addAddress, addRoute u addDns jiddefinixxu x'jibgħat is-sistema fit-tunnel. Destinazzjoni barra l-lista tar-rotot qatt ma tasal għad-descriptor tiegħek, għalhekk l-ebda ammont ta' loġika tal-forwarding ma se jsewwiha. Irrekordja s-sejħiet tal-builder li tagħmel u qabbilhom mal-indirizzi li l-app tassew tipprova tilħaq.

L-għażla skont l-app għandha l-limitu tagħha: addAllowedApplication u addDisallowedApplication jeħtieġu API 21, u fil-verżjonijiet anzjani l-metodi sempliċement mhumiex. Disinn li jiffiltra skont il-pakkett ma jistax jaħdem hemmhekk.

It-twaqqif mill-ġdid iħalli descriptors antikwati

Sejħa oħra ta' establish() tirritorna descriptor ġdid u tagħlaq l-interface preċedenti. Id-descriptor l-antik issa mhuwiex validu, għalhekk ħajta li għadha blokkata fuqu tirċievi żball, u s-sockets maħluqa għall-passaġġ l-antik jista' jkollhom jiġu sostitwiti. onRevoke huwa l-callback għal tunnel li l-utent jew is-sistema ħadu. Iż-żamma taċ-ċiklu tal-ħajja għand sid wieħed, li jwaqqaf il-qarrej qabel it-twaqqif mill-ġdid, tevita l-biċċa l-kbira tal-istati konness-imma-mejjet.

Aqra kull żball skont il-pass li jappartjeni għalih. Reset tal-konnessjoni minn recvfrom ifisser li t-tarf imbiegħed għalaq waqt li l-kodi tiegħek kien għadu jaqra. Żball ta' indirizz ħażin jindika lejn parsing tal-header jew bug ta' offset, mhux lejn in-netwerk.

L-ordni tax-xogħol: mod blokkani mixgħul, pakkett wieħed kull qari, header ipparsjat, socket protett, load mibgħut, għeluq nadif waqt il-konsenja u lista tar-rotot li tkopri d-destinazzjoni.

Artikli relatati