Tvær leiðir geta sett IP-viðmót fyrir framan Android-forrit, og báðar enda á sama konar skráarlýsingu með mjög ólíkum eigendum. Önnur fer um VpnService og builder þess, hin um root-skel og /dev/net/tun. Sérhver lestur á þeirri lýsingu er útfararpakki og sérhver skrif er innfararpakki. Það sem aðgreinir leiðirnar er hver hefur stefnuna, hver lifir af uppfærslu stýrikerfis, og hversu miklu af leiðartöflunni þú mátt snerta.

Farðu leið pallborðsins nema þú getir nefnt það tiltekna sem hún neitar að gera. Sú neitun er venjulega TAP, upptaka utan þíns eigin forritasamstæðu, eða leiðarregla sem ramminn aldrei afhjúpar.

Á leið pallborðsins lýsir þú yfir ætlun í stað skipana. Þú gefur að minnsta kosti eitt vistfang, leiðirnar sem þú vilt, DNS-þjóna og valfrjálsan forritalista, og þá framkvæmir kerfisþjónusta Android forréttindauppsetninguna undir eigin auðkenni. Þú lærir aldrei nafn viðmótsins fyrirfram og gefur aldrei út ioctl-ið sem býr það til, og það er málið.

Tvær leiðir til að fá IP-viðmót

Root-leiðin er eldri uppskriftin. Þú opnar /dev/net/tun, kallar á TUNSETIFF með IFF_TUN, ræsir viðmótið með ip link og bætir við vistföngum og leiðum með höndunum. Hvert skref er þitt að gera rétt, þar á meðal þau sem ramminn hefði sinnt hljóðlega. Ein leið sem vantar gefur notandanum sömu skýrslu og dautt þjónn.

Villuleit er jafn ólík og uppsetningin. Á root-leiðinni er viðmótið annaðhvort til eða ioctl-ið þitt skilaði villu sem þú getur lesið beint. Á leið pallborðsins er viðmótið aðeins til eftir að establish() tekst, svo bilun kemur sem undantekning eða null-lýsing frekar en tækisnóð sem þú getur rótað í.

Hvað establish() skilar í raun

Builder.establish() hefur þrjár niðurstöður og þær krefjast þriggja ólíkra svara. Lýsing þýðir að viðmótið er stillt og þitt til notkunar, null þýðir að beiðnin komst ekki í gegn, og kastað undantekning þýðir að kerfisþjónustan hafnaði henni. Að slá null og árangri saman í eitt boolean er algengasta leiðin sem forrit tilkynnir vinnandi göng sem flytja aldrei pakka. Builder-tilvísunin tilgreinir vistfangskröfuna, og það er þess virði að lesa hana áður en þú kennir þjóninum um.

Stefnurnar eru ákvarðaðar af lýsingunni, ekki af samskiptareglunum þínum. Lestrar gefa þér útfararpakka sem þegar eru valdir fyrir VPN, og skrif sprauta innfararpökkum aftur inn í viðmótið. Þinn eigin flutningur dulkóðar, auðkennir og rammar þessa pakka, því pallborðið stöðvast við pakkamörkin.

Binder er eitt stökk, JNI er annar ás

Beiðni builders fer inn í kerfið um Binder, og einhvers staðar fyrir neðan kallar pallborðið á innfæddan kóða til að stilla tækið. Þetta eru tveir ólíkir gangverkar staflaðir í einu kalli. Binder er samskipti milli ferla milli forritsins þíns og kerfisþjónustu, en JNI er brúin frá Java yfir í innfæddan kóða innan ferlis. Að lesa Android 9 AOSP-tré gerir staflann bókstaflegan, og vert er að muna að innri klasanöfn og skráarslóðir færast milli útgáfa.

Það sem færist ekki er samningurinn sem þú mátt treysta á: builderinn, lýsingin sem hann skilar og lífsferill þjónustunnar í kring. Ekkert forrit ætti að kalla á innri þjónustufærslu eða endurskapa tækisnóð til að fá viðmót. Ef kóðinn þinn reiðir sig á AOSP-klasanafn mun hann brotna á útgáfu sem þú prófaðir ekki.

TUN ber IP, TAP ber Ethernet

TUN er IP-viðmót. TAP er Ethernet-viðmót, og sá munur ræður því hvort brúun er yfirhöfuð möguleg. TUN-tæki hefur ekkert MAC-vistfang og engan Ethernet-haus til að senda áfram, svo TUN-viðskiptavinur getur ekki gengið í lag-2 brú, hvernig sem leiðirnar eru skrifaðar.

VpnService gefur þér IP-afbrigðið, sem er það sem VPN á forritastigi þarf og getur stutt án hráa Ethernet-stafs. Ef hönnunin þín krefst brúunar mun leið pallborðsins ekki koma þér þangað, og root-leiðin aðeins ef kjarninn og heimildir tækisins vinna saman.

Þar sem root-leiðin vinnur enn

Þrjú verk ýta fólki af leið pallborðsins. Lag-2 brúun þarf TAP. Að grípa umferð frá forritum utan þíns eigin VPN-sviðs þarf sýnileika sem ramminn veitir ekki. Stefnumiðuð leiðsögn sem builderinn afhjúpar aldrei, eins og sér tafla fyrir eitt áfangastað, þarf reglur sem þú setur upp sjálfur.

Kostnaðurinn kemur síðar: ólæstur bootloader eða rótuð mynd, SELinux-stefna sem færist undir þér, og tæki sem hættir að haga sér rétt eftir OTA. Rótuð uppskrift getur heldur ekki dreift sér um venjulega forritadreifingu, svo flest teymi halda henni sem innri greiningarleið frekar en vöru.

Að velja á milli þeirra

Byrjaðu á viðmótinu sem þú þarft, ekki kóðanum sem þú hefur. Ef svarið er TUN-tæki með leiðum sem takmarkast við forritið er leið pallborðsins styttri og lifir af uppfærslur. Ef svarið felur í sér Ethernet-ramma, upptöku annarra forrita eða leiðarreglur sem builderinn hafnar ertu á root-svæði og ættir að fjárhagsáætla það sem rekstrarkostnað.

Athugun sem leysir flestir deilur: byggðu fyrst leið pallborðsins, skráðu niðurstöðu establish() aðskilda frá stöðu fjarfundarins og staðfestu einn pakka í hvora átt. Aðeins þá ákveður þú hvort vantar getan réttlætir að yfirgefa studdu leiðina.

Tengdir greinar