Android VPN-tawizing: getConnectionOwnerUid tsjin /proc/net
Android 10 ferberget /proc/net foar apps. In VPN krijt noch pakketten, mar de tawizing ferhuzet nei getConnectionOwnerUid, mei eigen tuple- en tastimmingregels.
Op Android 10 en letter krijt in app dy't /proc/net/tcp iepenet tagongswegering yn stee fan in sockettabel. De VPN-ynterface skomt dat net: pakketten komme noch oan, want de tunnel is in routingbeslissing, gjin triemtaastimming. Wat feroare is it antwurd op in smeller fraach: “hokker app besit dizze ferbining?” De ferfanging is ConnectivityManager.getConnectionOwnerUid, it stipe fersyk per ferbining, en de kar tusken de âlde gewoante en de nije API hinget ôf fan hokker fan trije taken jo echt hawwe: pakketten ûntfange, in stream tawize of gebrûk optelle.
Twa manieren om de eigenersfraach te beantwurdzjen
Foar API 29 koe in privilegearjend as root-proses de sockettabellen fan de kernel lêze, de fjouwerling matsjje en de besittende UID leare. Dat joech in ynventaris foar it hiele apparaat yn ien triem. Fan API 29 ôf is de triemsysteemwerjefte beheind, en it stipe paad is in fersyk per ferbining mei it protokol, it lokale adres en it fiere adres.
| Question | Legacy socket tables | getConnectionOwnerUid |
|---|---|---|
| Who owns this flow? | Scan and match the tuple | Ask once per tuple |
| Device-wide inventory? | Yes, when readable | No, one flow at a time |
| Historical usage? | No | No; that is NetworkStatsManager |
| Works without root? | No on modern releases | Yes, for authorized callers |
De ferliking is net “âld tsjin nij”. It binne trije ferskillende taken dy't eartiids troch ien lêsbere triem foldien waarden en no troch trije ferskillende ynterfaces mei trije ferskillende kontrakten foldien wurde.
It lokale adres is it einpunt fan 'e app
De metoadehanttekening nimt in protokol, in lokaal socketadres en in fier socketadres. “Lokaal” betsjut de kant fan 'e app yn 'e ferbining, net it einpunt dat op it momint fan ynspeksje tafallich de boarne fan it pakket is. In pakket dat fan 'e fiere server werom nei de app reizget, hat boarne en bestimmung omkeard neffens dy definysje.
ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);Dizze rjochtingsflater is de meast foarkommende reden dat in wurkjend fersyk it ferkearde antwurd jout, of gjin. Log beide einpunten foar de oprop en befestigje it pear tsjin de ferbining dy't de app eins iepene hat. Adresfamylje jildt ek: in IPv4-omsette adres en in native IPv6-adres binne ferskillende tuples, en sa ek TCP- en UDP-streamen op deselde poarten.
Autorisaasje en ûnbekende resultaten binne part fan it kontrakt
It fersyk is beheind ta autorisearre oanroppen, ynklusyf de aktive VPN-app foar de oangeande brûker. In net-ferbûn monitoring-app kin net oannimme dat er de ferbinings fan in oar profyl ophelje kin, en in net-autorisearre oprop kin in feiligensútsûndering smite yn stee fan in freonlike flater. Behannelje beide útkomsten eksplisyt.
In ûntbrekkende eigener is gjin pakketnamme. De stream kin sletten wêze tusken it pakket en it fersyk, de tuple kin ûnfolslein wêze, of de oanropper mei gewoan net witte. It earste suksesfolle antwurd cache en letter wer brûke skriuwt in nije ferbining ta oan in âlde app, wat slimmer is as ûnbekend melde.
As tawizing mislearret, hat it ferkear noch in beslissing nedich: blokkearje it wêr't it belied dat easket, stean allinnich in omfang ta dat jo begripe, of lit de leechte sjen. Dy fallback heart by it ûntwerp, net by in kommentaar.
Boekhâlding is in oare fraach
NetworkStatsManager rapportearret gebrûk ûnder eigen tagongsregels. It kin sizze hoefolle in UID oer in perioade oerbrocht hat; it kin net de eigener fan in willekeurich libjend pakket sizze. Netwurkmooglikheden beskriuwe eigenskippen fan in netwurk, net in map fan sockets. De trije minge jout dashboards dy't konsekwint lykje en it net binne.
Foar it ienfâldige gefal om te besluten hokker apps de tunnel brûke, drukke de stipe listen fan tastiene en ferbeane apps fan Android it belied al út sûnder eat te skrabjen. Hâld tawizing per stream foar de gefallen dy't it echt nedich hawwe, en budgettearje foar in ûnderhâlden ymplemintaasje dy't rjochting, tastimmingen en ûnbekende steaten tegearre behannelt.
Kies it helpmiddel op taak, test dan de rânen
As de eask tunnelkar is, brûk de list fan it platfoarm. As it live-tawizing is, brûk it eigenersfersyk en behannelje elke ûnbeantwurdbere tuple as ûnbekend. As it histoaryske totalen binne, brûk de stats-API. Test dan de trije rânen dy't naive ymplemintaasjes brekke: in pakket yn 'e tsjinoerstelde rjochting, in stream dy't slút foar't jo it freegje, en in oanropper dy't net de aktive VPN is.
Neat hjirfan freget om SELinux út te skeakeljen, de telefoan te rooten of kerneltabellen wrâldwiid lêsber te meitsjen. De beheining is it punt: it platfoarm ferhuze tawizing efter in kontrakt sadat it antwurd beskikber is foar it ûnderdiel dat it legit gading hat, en foar nimmen oars.