Android VPN: dangosydd VpnService yn erbyn dyfais tun root
Ni all apiau Android greu tun0 eu hunain: beth mae establish() yn ei ddychwelyd, lle mae Binder yn stopio a JNI yn dechrau, a phryd y mae dyfais a grëwyd gan root yn ennill.
Gall dwy lwybr osod rhyngwyneb IP o flaen ap Android, ac mae'r ddwy yn gorffen ar yr un math o ddangosydd ffeil gyda pherchnogion tra gwahanol. Mae un yn mynd trwy VpnService a'i adeiladydd, a'r llall trwy gragen root a /dev/net/tun. Mae pob darlleniad ar y dangosydd hwnnw'n becyn allanol a phob ysgrifeniad yn un mewnol. Yr hyn sy'n gwahanu'r llwybrau yw pwy sy'n dal y polisi, pwy sy'n goroesi uwchraddiad o'r system weithredu, a chymaint o'r tabl llwybro y caiff ei gyffwrdd.
Cymer y llwybr platfform oni bai y galli enwi'r peth penodol y mae'n gwrthod ei wneud. Y gwrthodiad hwnnw yw TAP fel arfer, neu gasglu y tu allan i'th set apiau dy hun, neu reol llwybro nad yw'r fframwaith byth yn ei datgelu.
Ar y llwybr platfform yr wyt yn datgan bwriad yn lle gorchmynion. Rhoi o leiaf un cyfeiriad, y llwybrau yr wyt eu heisiau, gweinyddwyr DNS a rhestr apiau ddewisol, ac yna mae gwasanaeth system Android yn gwneud y sefydlu breiniol dan ei hunaniaeth ei hun. Ni ddysgi enw'r rhyngwyneb ymlaen llaw, ac ni roddi'r ioctl sy'n ei greu, a dyna'r pwynt.
Dwy ffordd i gael rhyngwyneb IP
Y llwybr root yw'r rysáit hŷn. Yr wyt yn agor /dev/net/tun, yn galw TUNSETIFF gydag IFF_TUN, yn codi'r rhyngwyneb gydag ip link, ac yn ychwanegu cyfeiriadau a llwybrau â llaw. Eich cyfrifoldeb chi yw pob cam, gan gynnwys y rhai y byddai'r fframwaith wedi'u trin yn dawel. Mae un llwybr ar goll yn rhoi'r un adroddiad i'r defnyddiwr ag y mae gweinydd marw.
Mae dadfygio yr un mor wahanol â'r sefydlu. Ar y llwybr root mae'r rhyngwyneb naill ai'n bodoli neu mae dy ioctl wedi dychwelyd gwall y gelli ei ddarllen yn uniongyrchol. Ar lwybr y platfform nid yw'r rhyngwyneb yn bodoli nes bod establish() yn llwyddo, felly daw methiant fel eithriad neu fel dangosydd null yn lle nod dyfais y gelli chwilio ynddo.
Beth mae establish() yn ei ddychwelyd mewn gwirionedd
Mae tri chanlyniad i Builder.establish() ac mae arnynt angen tri ymateb gwahanol. Mae dangosydd yn golygu bod y rhyngwyneb wedi'i ffurfweddu ac yn eiddo i ti i'w ddefnyddio, mae null yn golygu na chafodd y cais fynd trwodd, ac mae eithriad wedi'i daflu yn golygu bod gwasanaeth y system wedi'i wrthod. Plygu null a llwyddiant i mewn i un boolean yw'r ffordd fwyaf cyffredin y mae ap yn adrodd am dwnnel sy'n gweithio nad yw byth yn cario pecyn. Mae cyfeirlyfr Builder yn nodi'r gofyniad am gyfeiriad, ac mae'n werth ei ddarllen cyn beio'r gweinydd.
Mae'r dangosydd yn pennu'r cyfeiriadau, nid dy brotocol. Mae darlleniadau yn rhoi pecynnau allanol sydd eisoes wedi'u dewis ar gyfer y VPN, ac mae ysgrifeniadau yn chwistrellu pecynnau mewnol yn ôl i'r rhyngwyneb. Dy gludydd dy hun sy'n amgryptio, yn dilysu ac yn ffrâmio'r pecynnau hynny, oherwydd bod y platfform yn stopio ar ffin y pecyn.
Un cam yw Binder, ac echelin arall yw JNI
Mae cais adeiladydd yn croesi i'r system trwy Binder, ac yn rhywle oddi tani mae'r platfform yn galw cod brodorol i ffurfweddu'r ddyfais. Dau fecanwaith gwahanol wedi'u pentyrru mewn un alwad yw'r rhain. Cyfathrebu rhwng prosesau yw Binder rhwng dy ap a gwasanaeth system, tra mai pont Java-i-frodorol o fewn proses yw JNI. Mae darllen coeden AOSP Android 9 yn gwneud y pentwr yn llythrennol, ac mae'n werth cofio bod enwau dosbarth mewnol a llwybrau ffeil yn symud rhwng rhyddhadiadau.
Yr hyn nad yw'n symud yw'r contract y gelli ddibynnu arno: yr adeiladydd, y dangosydd y mae'n ei ddychwelyd, a chylch bywyd y gwasanaeth o'i amgylch. Ni ddylai unrhyw ap alw trafodiad gwasanaeth mewnol nac ail-greu nod dyfais i gael rhyngwyneb. Os yw dy god yn dibynnu ar enw dosbarth AOSP, bydd yn torri ar ryddhâd na phrofwyd gennyt.
TUN sy'n cario IP, TAP sy'n cario Ethernet
Rhyngwyneb IP yw TUN. Rhyngwyneb Ethernet yw TAP, a'r gwahaniaeth hwnnw sy'n penderfynu a yw pontio'n bosibl o gwbl. Nid oes gan ddyfais TUN gyfeiriad MAC nac unpennawd Ethernet i'w anfon ymlaen, felly ni all cleient TUN ymuno â phont haen 2, pa bynnag ffordd y bo'r llwybrau wedi'u hysgrifennu.
Mae VpnService yn rhoi'r amrywiad IP i ti, sef yr hyn sydd ei angen ar VPN ar lefel ap a'r hyn y gall ei gefnogi heb bentwr Ethernet crai. Os oes ar dy gynllun angen pontio, ni fydd llwybr y platfform yn dy gyrraedd yno, a dim ond os yw'r cnewyllyn a chaniatadau'r ddyfais yn cydweithio y bydd llwybr root yn gwneud hynny.
Lle mae llwybr root yn dal i ennill
Mae tri swydd yn gwthio pobl oddi ar lwybr y platfform. Mae angen TAP ar bontio haen 2. Mae casglu traffig o apiau y tu allan i'th gwmpas VPN yn gofyn am welededd nad yw'r fframwaith yn ei rhoi. Mae llwybro polisi nad yw'r adeiladydd byth yn ei ddatgelu, fel tabl ar wahân ar gyfer un cyrchfan, yn gofyn am reolau a osodi di dy hun.
Daw'r costau yn hwyrach: cychwynnwr dan glo wedi'i agor neu ddelwedd wedi'i gwreiddio, polisi SELinux sy'n symud danat, a dyfais sy'n peidio â'i hymddwyn yn iawn ar ôl OTA. Ni all rysáit wedi'i gwreiddio fynd allan trwy ddosbarthiad ap arferol chwaith, felly mae'r rhan fwyaf o dimau yn ei chadw fel llwybr diagnostig mewnol yn hytrach na chynnyrch.
Dewis rhyngddynt
Dechreua o'r rhyngwyneb sydd ei angen arnat, nid o'r cod sydd gennyt. Os mai dyfais TUN â llwybrau wedi'u cyfyngu i ap yw'r ateb, mae llwybr y platfform yn fyrrach ac yn goroesi uwchraddio. Os yw'r ateb yn cynnwys fframiau Ethernet, casglu apiau eraill, neu reolau llwybro y mae'r adeiladydd yn eu gwrthod, yr wyt yng nghyrchfan root a dylit gyllidebu ar ei gyfer fel cost weithredu.
Gwiriad sy'n setlo'r rhan fwyaf o ddadleuon: adeilada lwybr y platfform yn gyntaf, cofnoda ganlyniad establish() ar wahân i gyflwr y sesiwn bell, a chadarnha un pecyn ym mhob cyfeiriad. Dim ond wedyn y penderfyni a yw'r gallu sydd ar goll yn cyfiawnhau gadael y llwybr a gefnogir.