Android VPN: deskrittur VpnService kontra apparat tun root
L-apps Android ma jistgħux joħolqu tun0 waħedhom: x'jirritorna establish(), fejn Binder jieqaf u JNI jibda, u meta apparat maħluq minn root jirbaħ.
Żewġ toroq jistgħu jqiegħdu interface IP quddiem app Android, u t-tnejn jispiċċaw fl-istess tip ta' deskrittur tal-fajl b'sidien differenti ħafna. Waħda tgħaddi minn VpnService u l-builder tiegħu, l-oħra minn shell root u /dev/net/tun. Kull qari fuq dak id-deskrittur hija pakkett li joħroġ u kull kitba hija pakkett li jidħol. Dak li jifred it-toroq huwa min iżomm il-politika, min jibqa' ħaj wara aġġornament tal-OS, u kemm mit-tabella tar-routing tista' tmiss.
Agħżel it-triq tal-pjattaforma sakemm ma tistax issemmi l-ħaġa speċifika li tirrifjuta tagħmel. Dak iċ-ċaħda normalment hija TAP, qbid barra mis-sett tal-apps tiegħek, jew regola tar-routing li l-framework qatt ma jesponi.
Fit-triq tal-pjattaforma tiddikjara intenzjoni minflok kmandi. Tipprovdi mill-inqas indirizz wieħed, ir-rotot li trid, servers DNS u lista fakultattiva ta' apps, imbagħad is-servizz tas-sistema ta' Android iwettaq l-istabbiliment privileġġjat taħt l-identità tiegħu stess. Qatt ma titgħallem l-isem tal-interface bil-quddiem u qatt ma toħroġ l-ioctl li joħloqha, u dan huwa l-punt.
Żewġ modi kif tikseb interface IP
It-triq root hija l-iktar riċetta antika. Tiftaħ /dev/net/tun, issejjaħ TUNSETIFF ma' IFF_TUN, tgħolli l-interface b'ip link, u żżid indirizzi u rotot bl-idejn. Kull pass huwa tiegħek biex tagħmlu sew, inklużi dawk li l-framework kien jimmaniġġja bil-kwiet. Rotta waħda nieqsa tagħti lill-utent l-istess rapport bħal server mejjet.
Id-debugging tvarja daqs l-istabbiliment. Fit-triq root l-interface jew teżisti jew l-ioctl tiegħek irritorna żball li tista' taqra direttament. Fit-triq tal-pjattaforma l-interface teżisti biss wara li establish() jirnexxi, għalhekk falliment jiġi bħala eċċezzjoni jew deskrittur null minflok bħala nód tal-apparat li tista' tħaffer fih.
X'jirritorna establish() fil-verità
Builder.establish() għandu tliet eżiti u dawn jeħtieġu tliet tweġibiet differenti. Deskrittur ifisser li l-interface hija kkonfigurata u tiegħek biex tużaha, null ifisser li t-talba ma għaddietx, u eċċezzjoni mwiegħda tfisser li s-servizz tas-sistema rrifjutatha. Li tgħaqqad null u suċċess fi boolean wieħed hija l-iktar mod komuni kif app tirrapporta tunnel li jaħdem li qatt ma jġorr pakkett. Ir-referenza tal-Builder tiddikjara r-rekwiżit tal-indirizz, u jiswa li taqraha qabel ma tagħti l-ħtija lis-server.
Id-direzzjonijiet huma ffissati mid-deskrittur, mhux mill-protokoll tiegħek. Il-qari jagħtik pakketti li joħorġu diġà magħżula għall-VPN, u l-kitbiet jinjettaw pakketti li jidħlu lura fl-interface. It-trasport tiegħek innifsu jikkripta, jawtentika u jiffrejma dawk il-pakketti, għax il-pjattaforma tieqaf fil-fruntiera tal-pakkett.
Binder huwa qabża waħda, JNI huwa ass ieħor
Talba tal-builder taqsam fis-sistema permezz ta' Binder, u x'imkien taħt dan il-pjattaforma ssejjaħ kodiċi nattiv biex tikkonfigura l-apparat. Dawk huma żewġ mekkaniżmi differenti mimlija fi sejħa waħda. Binder huwa komunikazzjoni bejn proċessi bejn l-app tiegħek u servizz tas-sistema, filwaqt li JNI huwa l-pont minn Java għan-nattiv ġewwa proċess. Li taqra siġra AOSP ta' Android 9 tagħmel il-munzell jidher litterali, u jiswa li tiftakar li l-ismijiet tal-klassijiet interni u l-mogħdijiet tal-fajls jiċċaqalqu bejn il-verżjonijiet.
Dak li ma jiċċaqlaqx huwa l-kuntratt li tista' tiddependi fuqu: il-builder, id-deskrittur li jirritorna, u ċ-ċiklu tal-ħajja tas-servizz madwaru. L-ebda app m'għandha ssejjaħ transazzjoni interna tas-servizz jew terġa' toħloq nód tal-apparat biex tikseb interface. Jekk il-kodiċi tiegħek jiddependi fuq isem ta' klassi AOSP, se jinkiser f'verżjoni li ma ttestjajtx.
TUN iġorr IP, TAP iġorr Ethernet
TUN hija interface IP. TAP hija interface Ethernet, u dik id-differenza tiddeċiedi jekk il-pont huwiex possibbli. Apparat TUN m'għandux indirizz MAC u m'għandux intestatura Ethernet biex jgħaddi 'l quddiem, għalhekk klijent TUN ma jistax jingħaqad ma' pont ta' saff 2, kif inhi miktuba r-rotot.
VpnService jagħtik il-varjant IP, li huwa dak li VPN fil-livell tal-app jeħtieġ u li jista' jappoġġja mingħajr munzell Ethernet mhux maħdum. Jekk id-disinn tiegħek jeħtieġ pont, it-triq tal-pjattaforma mhux se twasslek hemm, u t-triq root biss jekk il-kernel u l-permessi tal-apparat jikkooperaw.
Fejn it-triq root għadha tirbaħ
Tliet xogħlijiet imbuttaw lin-nies 'il barra mit-triq tal-pjattaforma. Il-pont ta' saff 2 jeħtieġ TAP. Li taqbad traffiku minn apps barra mill-ambitu tal-VPN tiegħek jeħtieġ viżibilità li l-framework ma jagħtix. Routing ibbażat fuq il-politika li l-builder qatt ma jesponi, bħal tabella separata għal destinazzjoni waħda, jeħtieġ regoli li tinstallahom int stess.
L-ispejjeż jiġu aktar tard: bootloader mhux illokkjat jew immaġni rootjata, politika SELinux li tiċċaqlaq taħtek, u apparat li jieqaf jaġixxi kif suppost wara OTA. Riċetta rootjata lanqas ma tista' tiġi mibgħuta permezz tad-distribuzzjoni normali tal-apps, għalhekk ħafna timijiet iżommuha bħala triq dijanjostika interna minflok prodott.
L-għażla bejn it-tnejn
Ibda mill-interface li għandek bżonn, mhux mill-kodiċi li għandek. Jekk it-tweġiba hija apparat TUN b'rotot limitati għall-app, it-triq tal-pjattaforma hija iqsar u tibqa' ħajja mill-aġġornamenti. Jekk it-tweġiba tinvolvi frejms Ethernet, qbid ta' apps oħra, jew regoli tar-routing li l-builder jirrifjuta, int f'territorju root u għandek tibbawġetjah bħala spejjeż operattivi.
Verifika li ssolvi ħafna mill-argumenti: ibni l-ewwel it-triq tal-pjattaforma, irreġistra r-riżultat ta' establish() separatament mill-istat tas-sessjoni remota, u kkonferma pakkett wieħed f'kull direzzjoni. Biss wara tiddeċiedi jekk il-kapaċità nieqsa tiġġustifikax li titlaq mit-triq appoġġjata.