Njia mbili zinaweza kuweka kiolesura cha IP mbele ya programu ya Android, na zote zinaishia kwenye aina moja ya kifafanuzi cha faili chenye wamiliki tofauti sana. Moja inapita kupitia VpnService na builder yake, nyingine kupitia root shell na /dev/net/tun. Kila usomaji kwenye kifafanuzi hicho ni pakiti inayotoka na kila uandishi ni pakiti inayoingia. Kinachotenganisha njia hizo ni nani anashikilia sera, nani anastahimili usasishaji wa OS, na ni kiasi gani cha jedwali la uelekezaji unaruhusiwa kugusa.

Chukua njia ya jukwaa isipokuwa unaweza kutaja kitu maalum ambacho inakataa kufanya. Kukataa huko kwa kawaida ni TAP, ukamataji nje ya seti yako ya programu, au kanuni ya uelekezaji ambayo mfumo kamwe haifichui.

Kwenye njia ya jukwaa unatangaza nia badala ya amri. Unatoa angalau anwani moja, njia unazotaka, seva za DNS na orodha ya programu ya hiari, kisha huduma ya mfumo wa Android hufanya usanidi wa upendeleo chini ya utambulisho wake mwenyewe. Hujui jina la kiolesura mapema na hutoa kamwe ioctl inayoiunda, na hilo ndilo walakini.

Njia mbili za kupata kiolesura cha IP

Njia ya root ni mapishi ya zamani. Unafungua /dev/net/tun, unaitia TUNSETIFF pamoja na IFF_TUN, unainua kiolesura kwa ip link, na unaongeza anwani na njia kwa mkono. Kila hatua ni yako kuifanya sawa, pamoja na zile ambazo mfumo ungezishughulikia kwa ukimya. Njia moja inayokosekana humpa mtumiaji ripoti sawa na seva iliyokufa.

Urekebishaji hutofautiana kadiri usanidi unavyotofautiana. Kwenye njia ya root kiolesura ama kipo au ioctl yako ilirudisha hitilafu unayoweza kuisoma moja kwa moja. Kwenye njia ya jukwaa kiolesura kinapatikana tu baada ya establish() kufanikiwa, kwa hiyo kushindwa huja kama isipokuwa au kifafanuzi cha null badala ya nodi ya kifaa unayoweza kuchunguza.

establish() hurudisha nini kwa kweli

Builder.establish() ina matokeo matatu na yanahitaji majibu matatu tofauti. Kifafanuzi kinamaanisha kiolesura kimesanidiwa na ni chako kutumia, null inamaanisha ombi halikupita, na isipokuwa iliyotupwa inamaanisha huduma ya mfumo ilikataa. Kuunganisha null na mafanikio katika boolean moja ni njia ya kawaida zaidi ambayo programu huripoti handaki inayofanya kazi ambayo haibebi pakiti kamwe. Marejeo ya Builder yanasema sharti la anwani, na inafaa kuyasoma kabla ya kulaumu seva.

Mwelekeo huamuliwa na kifafanuzi, si itifaki yako. Usomaji hukupa pakiti zinazotoka ambazo tayari zimechaguliwa kwa VPN, na uandishi huingiza pakiti zinazoingia tena kwenye kiolesura. Usafirishaji wako mwenyewe husimba, huthibitisha na kuweka fremu kwa pakiti hizo, kwa sababu jukwaa linasimama kwenye mpaka wa pakiti.

Binder ni hatua moja, JNI ni mhimili mwingine

Ombi la builder hupita kwenye mfumo kupitia Binder, na mahali fulani chini ya hapo jukwaa huita msimbo asilia ili kusanidi kifaa. Hizi ni mbinu mbili tofauti zilizorundikwa katika mwito mmoja. Binder ni mawasiliano baina ya michakato kati ya programu yako na huduma ya mfumo, wakati JNI ni daraja la Java kwenda asilia ndani ya mchakato. Kusoma mti wa AOSP wa Android 9 hufanya mrundikano uonekane halisi, na inafaa kukumbuka kwamba majina ya ndani ya madarasa na njia za faili huhamahama kati ya matoleo.

Kinachohama si mkataba unaoweza kuutegemea: builder, kifafanuzi inachorudisha, na mzunguko wa maisha wa huduma kuizunguka. Hakuna programu inayopaswa kuita muamala wa ndani wa huduma au kuunda upya nodi ya kifaa ili kupata kiolesura. Ikiwa msimbo wako unategemea jina la darasa la AOSP, utavunjika kwenye toleo ambalo hukulijaribu.

TUN hubeba IP, TAP hubeba Ethernet

TUN ni kiolesura cha IP. TAP ni kiolesura cha Ethernet, na tofauti hiyo huamua kama daraja linawezekana kabisa. Kifaa cha TUN hakina anwani ya MAC na hakina kichwa cha Ethernet cha kusambaza, kwa hiyo mteja wa TUN hawezi kujiunga na daraja la tabaka 2, jinsi yoyote njia zilivyoandikwa.

VpnService hukupa lahaja ya IP, ambayo ni kile VPN ya ngazi ya programu inahitaji na inaweza kusaidia bila mrundikano mbichi wa Ethernet. Ikiwa muundo wako unahitaji daraja, njia ya jukwaa haitakupeleka huko, na njia ya root itafanya hivyo tu ikiwa kerneli na ruhusa za kifaa zitashirikiana.

Ambapo njia ya root bado inashinda

Kazi tatu huwasukuma watu mbali na njia ya jukwaa. Daraja la tabaka 2 linahitaji TAP. Kunasa trafiki kutoka programu zilizo nje ya wigo wako wa VPN kunahitaji mwonekano ambao mfumo hautoi. Uelekezaji wa sera ambao builder haufichui kamwe, kama jedwali tofauti kwa lengo moja, unahitaji kanuni unazoweka mwenyewe.

Gharama huja baadaye: bootloader iliyofunguliwa au taswira yenye root, sera ya SELinux inayohama chini yako, na kifaa kinachoacha tabia sahihi baada ya OTA. Mapishi yenye root pia hayawi kusambazwa kupitia usambazaji wa kawaida wa programu, kwa hiyo timu nyingi huibakiza kama njia ya utambuzi ya ndani badala ya bidhaa.

Kuchagua kati ya hizo mbili

Anza na kiolesura unachohitaji, si msimbo ulionao. Ikiwa jibu ni kifaa cha TUN chenye njia zilizozuiwa kwa programu, njia ya jukwaa ni fupi na inastahimili usasishaji. Ikiwa jibu linahusisha fremu za Ethernet, ukamataji wa programu nyingine, au kanuni za uelekezaji ambazo builder hukataa, uko katika eneo la root na unapaswa kuipanga kama gharama ya uendeshaji.

Ukaguzi unaomaliza mijadala mingi: jenga kwanza njia ya jukwaa, rekodi matokeo ya establish() tofauti na hali ya kikao cha mbali, na uthibitisha pakiti moja katika kila mwelekeo. Baada ya hapo tu amua kama uwezo unaokosekana unahalalisha kuiacha njia inayosaidiwa.

Makala zinazohusiana