Zwee Weeër kënnen eng IP-Schnittstell virun eng Android-App setzen, an alleb zwee enden am selwechten Typ Dateideskriptor mat ganz ënnerschiddlechen Eegentümer. Dee een geet iwwer VpnService an hire Builder, dee aneren iwwer eng root-Shell an /dev/net/tun. All Liesung op dësem Deskriptor ass e Paket eraus an all Schreiwung ass e Paket eran. Wat d'Weeër trennt ass wien d'Politik huet, wien en OS-Update iwwerlieft, a wéi vill vun der Routingstabell du bierfs.

Huel de Plattformwee, ausser du kanns déi spezifesch Saach nennen, déi se refuséiert. Dëse Refus ass normalerweis TAP, Erfaassen ausserhalb vun dengem eegene Set uppen, oder eng Routingregel, déi de Framework ni verréit.

Op dem Plattformwee deklaréiers du Absicht amplaz Kommandoen. Du gëss op d'mannst eng Adress, d'Routen déi s du wëlls, DNS-Serveren an eng optional Lëscht uppen, duerno mécht Android seng Systemservice déi privilegiéiert Konfiguratioun ënner senger eegener Identitéit. Du wëss net viraus den Numm vun der Schnittstell, an du gëss ni de ioctl eraus, deen se schaaft, an dat ass de Punkt.

Zwee Weeër fir eng IP-Schnittstell ze kréien

De Rootwee ass dat méi al Rezept. Du méchs /dev/net/tun op, rifft TUNSETIFF mat IFF_TUN, bréngs d'Schnittstell mat ip link erop, a setz Adressen a Routen mat der Hand derbäi. All Schrëtt ass däin, richteg ze maachen, och déi, déi de Framework stëll geholl hätt. Eng feelend Rout gëtt dem Benotzer dee selwechte Rapport wéi en doudege Server.

Debuggen ënnerscheet sech esou vill wéi d'Ariichten. Op dem Rootwee gëtt et d'Schnittstell entweder oder däin ioctl huet e Feeler zréckginn, deen s du direkt liese kanns. Op dem Plattformwee gëtt et d'Schnittstell eréischt nodeems establish() gelungen ass, dofir kënnt e Feelschlag als Ausnam oder als null-Deskriptor an net als Geräteknot, an deem s du kënns wuehlen.

Wat establish() tatsächlech zréckgëtt

Builder.establish() huet dräi Resultater an se brauchen dräi verschidden Äntwerten. En Deskriptor heescht, d'Schnittstell ass konfiguréiert an deng fir ze benotzen, null heescht, d'Ufro ass net duerchgaangen, an eng geworf Ausnam heescht, de Systemservice huet se ofgelehnt. null an Erfolleg an engem eenzege Boolean zesummewerfen ass dee gewéinlechste Wee, wéi eng App en funktionéierende Tunnel mëttelt, deen ni e Paket dréit. D'Builder-Referenz nennt d'Adressufuerderung, an dat ass et wäert ze liesen ier s de Server beschëllegs.

D'Richtunge ginn vum Deskriptor festgeluecht, net vun dengem Protokoll. Liesunge ginn dir erausginn Paketen, déi schonn fir de VPN ausgewielt sinn, a Schreiwungen injizéieren eran Paketen zréck an d'Schnittstell. Däin eegenen Transport verschlësselt, authentifizéiert a raamt dës Paketen, well d'Plattform op der Paketgrenz ophält.

Binder ass ee Sputt, JNI ass eng aner Achs

Eng Builder-Ufro geet iwwer Binder an de System, an iergendwou drënner rifft d'Plattform nativen Code op fir d'Gerät ze konfiguréieren. Dat sinn zwee verschidde Mechanismen, gestapelt an engem Uruff. Binder ass Interprozesskommunikatioun tëscht denger App an engem Systemservice, während JNI d'Bréck vu Java op native Code bannent engem Prozess ass. En Android 9 AOSP-Bam ze liesen mécht de Stack wuertwiertlech, an et ass et wäert ze erënneren, datt intern Klassennimm a Fichiersweeër tëscht Verëffentlechunge wiesselen.

Wat sech net beweegt ass de Kontrakt, op deen s du dech verloosse kanns: de Builder, den Deskriptor deen en zréckgëtt, an de Liewenszyklus vum Service ronderëm. Keng App soll eng intern Service-Transaktioun ruffen oder e Geräteknot nei schafen, fir eng Schnittstell ze kréien. Wann däi Code vun engem AOSP-Klassennumm ofhänkt, geet en op enger Verëffentlechung futti, déi s de net getest hues.

TUN dréit IP, TAP dréit Ethernet

TUN ass eng IP-Schnittstell. TAP ass eng Ethernet-Schnittstell, an deen Ënnerscheed entscheet, ob Bridging iwwerhaapt méiglech ass. En TUN-Gerät huet keng MAC-Adress a keen Ethernet-Header fir weiderzeleeden, dofir kann en TUN-Client kenger Layer-2-Bréck bäitrieden, wéi d'Routen och geschriwwe sinn.

VpnService gëtt dir d'IP-Variant, déi en App-Niveau-VPN brauch an déi en ouni rohe Ethernet-Stack ënnerstëtze kann. Wann däin Design Bridging verlaangt, bréngt dech de Plattformwee net dohinner, an de Rootwee nëmmen dann, wann de Kernel an d'Geräteberechtegungen zesummeschaffen.

Wou de Rootwee nach gewënnt

Dräi Aarbechten drécken d'Leit vum Plattformwee fort. Layer-2-Bridging brauch TAP. Verkéier vun Apps ausserhalb vun dengem eegene VPN-Bereich erfaassen brauch Siichtbarkeet, déi de Framework net gëtt. Politik-Routing, dat de Builder ni verréit, wéi eng eege Tabell fir een Zil, brauch Reegelen, déi s du selwer installéiers.

D'Käschte kommen méi spéit: en entspaarten Bootloader oder en root-Bild, eng SELinux-Politik déi sech ënner dir beweegt, an en Gerät, dat no engem OTA opgehéiert sech richteg ze behuelen. En root-Rezept kann een och net iwwer déi normal App-Distributioun ausliwweren, dofir behalen déi meeschte Teams en als internen Diagnosewee amplaz als Produkt.

Tëscht deenen zwee wielen

Fänk mat der Schnittstell un, déi s du brauchs, net mam Code deen s du hues. Wann d'Äntwert en TUN-Gerät mat app-begrenzte Routen ass, ass de Plattformwee méi kuerz an iwwerlieft Updates. Wann d'Äntwert Ethernet-Framen, Erfaasse vun aneren Apps oder Routingregelen enthält, déi de Builder refuséiert, bass du am Root-Territoire a solls et als Betribskäschte budgetéieren.

Eng Kontroll, déi déi meescht Diskussiounen entscheet: bau fir d'éischt de Plattformwee, notéier d'Resultat vun establish() getrennt vum Zoustand vun der Fernsitzung, a bestäteg een Paket an all Richtung. Eréischt duerno entscheet s du, ob déi feelend Fähegkeet et rechtfertegt, dee ënnerstëtzte Wee ze verloossen.

Ähnlech Artikelen