Tunnel-ku wuu soo baxaa, calaamadda furaha way muuqataa, laakiin codsi kasta oo browser-ka ku jira wali wuu dhacaa waqti dhaaf. Barnaamijka VpnService isku-darkan badanaa waxay ka dhigan tahay in wareegga akhrintu nool yahay oo qaybta bixintu jaban tahay, ma aha in server-ku diiday gacan-qabsiga. Android horey ayuu u abuuray interface-ka, u raray traffic-ka barnaamijka gudihiisa oo siiyay habsocodkaaga descriptor fayl. Wax kasta oo ka dambeeya descriptor-kaas waa koodkaaga, hal wicid oo maqan ayaa ku filan inuu liqo dhammaan qulqulka.

Waxa nidaamku ku siinayo iyo waxa aanu ku siinayn

establish() wuxuu soo celiyaa ParcelFileDescriptor interface tun ah. Nidaamku wuxuu ku qoraa baakadaha IP ee baxa oo wuxuu filayaa in habsocodkaagu akhriyo, go'aansado halka ay tagaan oo uu ku diro socket caadi ah. Hoostiisa ma jiro gudbin kernel ah, markaa marka aanu qofna akhrin baakadaha waa la tuuraa oo tirooyinka interface-ka marnaba ma dhaqaaqaan.

Ku bilow tirin halkii aad ka qiyaasi lahayd. Kordhi tiro kasta oo akhris guul leh oo diiwaan geli halka iyo borotokoolka baakadaha ugu horreeya. Haddii tirintu ay eber ku sii ahaato inta traffic-ku soo baxayo, khaladku wuxuu ka sarreeyaa koodkaaga gudbinta, taasoo cidhiidhisay raadinta builder-ka iyo habka akhrinta. Haddii tirintu dhaqaaqdo oo browser-kuna wali fashilmo, khaladku wuxuu ku jiraa wadada dirista ama wadada soo noqoshada.

Akhrinta xannibaysa ayaa go'aamisa in wareeggu dhaqaaqo

setBlocking(true) wuxuu descriptor-ka geliyaa hab xannibaya oo wuxuu jiray tan iyo API 21. Noocyada hore xalku waa caawiye JNI yar oo fcntl ku tirtira O_NONBLOCK-ka descriptor-ka ceyriinka ah. Habku waa muhiim sababtoo ah wuxuu go'aamiyaa waxa la ogolyahay akhris aan baakad sugaysa lahayn.

Habka aan xannibin, akhrintaas waxay isla markiiba ku soo noqotaa qiime taban, wareegga natiijada iska indhatiraya wuxuu wareegaa core isagoon traffic dhaqaajin. Habka xannibaya, akhrintu way sugtaa, taas oo ay rabto dunta gudbinta, laakiin markaas dunta lama joojin karo. Xiridda descriptor-ka waa habka la taageeray ee akhrinta lagu fashiliyo si wareeggu u baxo. Dilka habsocodka ama joojinta dunta waxay ka tagi kartaa bilowga xiga descriptor aan hadda u dhigmayn interface-ka.

Akhri hal baakad wicid kasta geli buffer cabbirka MTU ee interface-ka, oo u qaado eber ama soo-noqosho taban khalad, ma aha baakad madhan.

protect() ka hor dirista ugu horreysa, ma aha ka dib

Socket kasta oo qaada baakad la duubay waa in marka hore la ilaaliyo. Socket aan la ilaalin wuxuu raacaa isla xeerarka dariiqa ee aad hadda dhigatay, markaa baakadihiisu waxay ku noqdaan tunnel-ka oo wareeggaaga akhrinta ayaa mar kale qaata. Markaas tunnel-ku wuxuu si aan dhammaad lahayn u gudbiyaa bixintiisa, dibaddana waxay u eg tahay xiriir furma oo marnaba jawaab ma bixiyo.

Nidaamku waa protect, ka dib connect ama bind, ka dib send. Wicidda protect ka dib connect waxay ka tagi kartaa go'aankii hore ee dariiqa, markaa socket-ku wuxuu sii wataa isticmaalka wadada khaldan inkastoo wiciddu soo celisay true. Hubi boolean-ka soo noqda oo si cod dheer ugu fashil haddii uu false yahay, halkii aad ka geli lahayd diris aan shaqeyn karin.

Khaladka fasaxa ee sendto ee socket-ka aan marnaba taaban protect() waa calaamadda caadiga ah ee khaladkan.

Tusaalaha UDP ma qaado HTTPS

Tusaalaha gudbinta ee inta badan casharrada nuqul ka sameeyaan wuxuu maareeyaa UDP oo keliya. TCP wuxuu u baahan yahay gacan-qabsi, lambarrada isku xigga, xaqiijin iyo dib-u-dirid, wareegga nuqul ka sameeya culeyska inta u dhaxaysa descriptor tun iyo socket ma bixiyo midkoodna. Taas ayaa keentay in weydiinta UDP DNS ay gudubto inta codsi kasta oo HTTPS uu istaago. Ama ku socodsii stack TCP meelaha isticmaalaha ama xiriirrada u dhiib proxy maxalli ah oo ku dhammeeya TCP qalabka oo qulqulka gudbiya.

Tijaabi kala-qaybinta ka hor inta aad wax dib u qorin: dir hal weydiin UDP oo fur hal xiriir TCP oo u socda isla host-ka. Haddii wadada UDP ay shaqeyso oo wadada TCP ay ku xanniban tahay SYN-ka ugu horreeya, dhibaatadu waa koodka gudbinta ee ma aha server-ka. Isbarbardhiggaas keliya wuxuu badbaadiyaa waqti badan oo lagu qaato akhrinta diiwaannada server-ka oo aan wax faa'iido leh ku jirin.

Liiska dariiqyada iyo filtarrada barnaamij kastaa waxay xaddidaan waxa aad aragto

addAddress, addRoute iyo addDns waxay qeexaan waxa nidaamku tunnel-ka u diro. Meesha ka baxsan liiska dariiqyada marnaba ma gaarto descriptor-kaaga, markaa ma jiro qadar macquul ah oo gudbin ah oo hagaajinaya. Diiwaan geli wicidda builder-ka aad sameyso oo la barbardhig ciwaannada barnaamijku dhab ahaan isku dayayo inuu gaaro.

Xulashada barnaamij kastaa waxay leedahay xadkeeda: addAllowedApplication iyo addDisallowedApplication waxay u baahan yihiin API 21, noocyada horena hababkaas ma jiraan. Naqshad ku filtaraysa baakadka halkaas marnaba ma shaqeyn karto.

Dib-u-dejinta waxay ka tagtaa descriptor duugoobay

Wicidda establish() mar kale waxay soo celisaa descriptor cusub oo xirtaa interface-kii hore. Descriptor-kii hore hadda waa ansax la'aan, markaa dunta weli ku xanniban waxay heshaa khalad, socket-yada loo sameeyay wadada horena waxaa laga yaabaa in la beddelo. onRevoke waa dib-u-wicidda tunnel-ka ay isticmaalaha ama nidaamku qaadeen. Haynta wareegga nolosha hal milkiile, oo joojiya akhristaha ka hor dib-u-dejinta, waxay ka hortagtaa inta badan xaaladaha isku-xiran-laakiin-maytay.

Akhri khalad kasta sida tallaabada uu ka tirsan yahay. Dib-u-dejinta xiriirka ee recvfrom waxay ka dhigan tahay in dhinaca fog uu xirmay inta koodkaagu weli akhrinayay. Khaladka ciwaan qaldan wuxuu tilmaamaa falanqaynta madaxa ama khalad offset, ma aha shabakada.

Nidaamka shaqada: hab xannibaya daaran, hal baakad akhris kasta, madax la falanqeeyay, socket la ilaaliyay, culeys la diray, xirid nadiif ah marka la wareejiyo iyo liis dariiqo ah oo daboolaya meesha.

Maqaallo la xiriira