App esclusa ancora online? Le regole per app e di instradamento differiscono
Escludere un'app Android da una VPN non la blocca. Gli elenchi di autorizzazione, le regole UID e le rotte inviate decidono ciascuno una parte diversa del percorso.
Escludere un pacchetto è un'istruzione di instradamento, non un blocco, quindi le pagine che si caricano dopo la connessione della VPN sono attese e non la prova di un guasto. L'esclusione toglie l'app dal tunnel invece di bloccarla, e la rete ordinaria trasporta il suo traffico. Qui si incontrano due politiche distinte: una sceglie i processi, l'altra sceglie le destinazioni. Leggerle in quest'ordine spiega perché un'icona connessa e un'app che funziona non sono una contraddizione.
Perché un'esclusione lascia la rete aperta
VpnService.Builder accetta un elenco di autorizzazione o un elenco di blocco, mai entrambi. Solo i pacchetti di un elenco di autorizzazione sono instradati nel tunnel. Un elenco di blocco inverte la cosa: ogni pacchetto tranne quelli elencati usa il tunnel, e quelli elencati mantengono il percorso fisico. Un pacchetto non elencato sotto un elenco di autorizzazione è anch'esso fuori dal tunnel, quindi l'esclusione è lo stato normale per la maggior parte delle app in quella modalità.
Ciò rende una voce di blocco locale una decisione di instradamento, non una regola del firewall. Se il requisito è impedire a un'app di raggiungere un host, il tunnel deve coprirla e il server o una politica locale deve rifiutare il traffico. Togliere un'app dal tunnel cambia solo quale interfaccia trasporta i suoi pacchetti.
Il caso Play Store è il solito esempio deliberato. Escludere il pacchetto dello store consente ai download di usare la connessione sottostante quando l'uscita della VPN interferisce con i trasferimenti, e mostra che esclusione significa aggiramento, non blocco.
Un profilo, un elenco
Il builder genera un'eccezione se si usano entrambe le chiamate, quindi il profilo davanti a voi è o un elenco di autorizzazione o un elenco di blocco. Questo unico fatto determina come leggere ogni osservazione successiva. Controllate il codice o la configurazione gestita prima della tabella di instradamento, perché l'elenco decide che cosa significa il resto dell'output. Un profilo ibrido non è uno stato che si possa osservare.
La distinzione predice anche che cosa farà un'app appena installata. Sotto un elenco di autorizzazione resta fuori finché qualcuno non la aggiunge, mentre sotto un elenco di blocco entra nel tunnel per impostazione predefinita.
Le configurazioni gestite espongono la stessa scelta sotto nomi di chiave diversi, e alcune console la descrivono come modalità VPN per app anziché come elenco. Il comportamento si riduce comunque a quelle due chiamate, quindi risalite dall'impostazione all'elenco dei pacchetti invece di fidarvi dell'etichetta. Se l'etichetta e l'elenco non concordano, vince l'elenco.
Seguite la regola UID fino alla tabella del tunnel
Android assegna a ogni app il proprio ID utente Linux, e il servizio VPN installa regole di politica che corrispondono a intervalli di UID. Il traffico corrispondente viene inviato a una tabella di instradamento la cui rotta predefinita punta al dispositivo tun. Il numero di tabella è assegnato per istanza VPN, quindi cambia dopo una riconnessione o dopo la creazione di un secondo profilo VPN.
L'output delle regole è la mappa. Ogni riga nomina una tabella di ricerca, e quella tabella contiene la rotta predefinita che decide se i pacchetti corrispondenti entrano nel tunnel.
adb shell ip rule show
adb shell ip route show table all
adb shell cmd package list packages -U | grep <package>
Eseguite prima il terzo comando per ottenere l'UID, poi trovate la regola il cui intervallo lo contiene. Quella regola punta a un numero di tabella, e ip route show table <n> con quel numero mostra se esiste una rotta predefinita attraverso il dispositivo tun. Se la tabella non ha una rotta predefinita, l'app è selezionata ma non ha percorso, il che è un guasto diverso.
Questi comandi richiedono una build sottoponibile a debug o un dispositivo in cui adb shell possa leggere lo stato della rete. Su un telefono di produzione il gestore dei pacchetti risponde ancora, ma l'ispezione dell'instradamento può essere rifiutata, quindi registrate ciò che potete e trattate il resto come non verificato.
Una rotta rivendica un prefisso, non un'app
Builder.addRoute rivendica prefissi di destinazione per il tunnel. Un profilo che aggiunge solo 10.0.0.0/8 invia quel prefisso attraverso il tunnel e lascia ogni altra destinazione sul percorso fisico. È il normale tunneling diviso, ed è indipendente da quali app abbiano selezionato le regole.
La configurazione inviata dal server rispecchia lo stesso modello. Le singole spinte di rotta aggiungono prefissi, mentre una direttiva redirect-gateway sostituisce la rotta predefinita e cattura tutto per le app che il tunnel copre. Rimuovere quella direttiva può ridurre un tunnel funzionante a una sola sottorete senza alcuna modifica sul dispositivo.
Una rotta inviata con un gateway o un qualificatore metrico inusuale può anche non installarsi. Preferite la forma semplice del prefisso e lasciate al server l'inoltro e il NAT.
Leggete l'intersezione prima di cambiare un'impostazione
Il tunnel trasporta l'intersezione dei processi coperti e delle destinazioni rivendicate. Un'app coperta che chiede un indirizzo fuori dai prefissi pubblicati esce dalla rete fisica. Un pacchetto bloccato resta fuori anche quando chiede un indirizzo dentro quei prefissi. Nessuno dei due casi è un bug; entrambi sono le due politiche che fanno il proprio lavoro.
Una VPN per app può anche lasciare un'app associata senza connettività. Quando on-demand è disattivato e il tunnel è abbassato, l'app resta legata alla VPN per app e non ha ripiego, il che sembra un'app rotta più che uno stato di politica. Attivare on-demand, o rimuovere l'associazione tramite la gestione, cambia la cosa.
| Layer | What it selects | Where to look | Typical mismatch |
|---|---|---|---|
| Package list | Processes | Builder calls or managed configuration | App excluded but expected to be blocked |
| UID policy rule | Which table a UID uses | ip rule show | Tunnel icon on, app still on Wi-Fi |
| Routing table | Destinations for matched traffic | ip route show table <n> | Covered app reaches only one subnet |
| Server push | Prefixes offered to the client | Server route configuration | Tunnel shrinks after a server edit |
Diagnosticate un asse alla volta. Confermate prima autorizzazione o blocco, leggete poi le regole UID e le tabelle installate, e provate infine una seconda app verso la stessa destinazione. La seconda app separa la selezione del processo dalla selezione della destinazione in un'unica richiesta.
Annotate il risultato come app, destinazione e numero di tabella. È quella terna che il prossimo cambiamento deve preservare.