Dúas persoas fan a mesma pregunta e reciben respostas incompatibles, porque están en lugares distintos. Unha ten aberta a pantalla de axustes de VPN do sistema e edita unha lista de aplicacións. A outra escribe VpnService.Builder.addDisallowedApplication() nun editor. As dúas chámano filtro de VPN por aplicación. Só unha delas posúe o control que describe, e ningunha das dúas está bloqueando nada.

Comeza pola pantalla que ve o usuario

Abre Axustes, atopa a entrada de VPN e mira a conexión que está realmente activa. Se o cliente ofrece unha lista por aplicación, esa lista pertence ao túnel propio do cliente. A plataforma non publica unha API xeral mediante a cal unha aplicación allea poida ler ou editar a selección de aplicacións doutra VPN, así que unha segunda aplicación non pode arranxar esa lista polo usuario.

Esta é a primeira bifurcación do percorrido. Se a VPN instalada non ten ese axuste, non hai nada que programar ao seu redor: a función está ausente no produto dono do túnel. Se o ten, a corrección correcta está nesa pantalla e fáina a persoa que pode abrila.

Segue o paquete cara a un túnel

Cando a túa propia aplicación constrúe un túnel, crea unha interface TUN e declara que tráfico de aplicacións entra nela. As chamadas de pertenza ocorren antes de establecer a interface, e despois o conxunto de regras queda fixo para esa sesión:

val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish()   // membership decided here

Esas chamadas aplícanse ao túnel que a túa aplicación acaba de crear e a nada máis. Non son unha política de todo o dispositivo, non persisten para outros clientes e non poden entrar na VPN de ninguén. Cando unha chamada do construtor falla porque o paquete non se pode resolver, a interface nunca se establece, o que é un fallo limpo en lugar de silencioso.

Por que a exclusión parecía un bloqueo

Unha aplicación excluída encamíñase arredor do teu túnel cara á rede subxacente. Iso é o contrario de bloqueala: o tráfico segue saíndo do dispositivo, só que fóra da interface que controlas. Unha aplicación estilo cortalumes fai o inverso. Admite o tráfico da aplicación no seu túnel e despois descarta os paquetes, ou négase a reenvialos, de modo que a interface é a mesma e a dirección da política está invertida.

O traballo detrás desa inversión non é unha opción de configuración. Lees paquetes IP do descritor do túnel, decides por fluxo e logo reenvíalos por un socket protexido ou descártalos. Todo o que non manexas simplemente detense, e por iso un túnel a medio facer parece unha rede rota en vez dun filtro que funciona. Se o teu obxectivo é bloquear, orza manexo de paquetes, un servizo en primeiro plano e unha política escrita para o tráfico que non poidas clasificar.

Que rompe cando o constrúes ti mesmo

Android xeralmente permite só unha VPN activa á vez, así que o teu túnel de filtrado e un de privacidade compiten polo mesmo oco agás que os produtos admitan encadeamento. A VPN sempre activa con bloqueo de conexións cambia o modo de fallo dun xeito que aquí importa: o tráfico que non pode entrar no túnel descártase en vez de enviarse directo, que é o que quere un deseño de prevención de fugas e o que unha sesión de depuración raramente espera.

A visibilidade de paquetes é a segunda trampa. Resolver o nome de paquete dunha aplicación pode fallar con NameNotFoundException, e nas versións máis recentes de Android o conxunto de paquetes que podes ver depende das consultas que declarases. Manexa a excepción en vez de supoñer que todo nome se resolve, e volve ler a lista cando se instalan ou retiran aplicacións en lugar de gardala en caché para sempre.

Os dispositivos xestionados engaden un terceiro dono. Unha política de mobilidade empresarial pode fixar unha VPN por aplicación ou un perfil sempre activo, e unha aplicación común non pode anulala. Comproba se o dispositivo está xestionado antes de depurar o teu propio código, porque nese caso a lista que intentas cambiar pode que ninguén que teña o teléfono poida editala.

Proba con unha aplicación que controles

Non probes coa aplicación que intentas filtrar. Usa unha segunda aplicación cuxo comportamento de rede poidas observar, e comproba se o seu tráfico sae polo teu túnel mentres o do obxectivo non o fai. Se ambas quedan dentro, a política funciona e o obxectivo está excluído; se ningunha sae, o túnel mesmo está mal e a lista de aplicacións non é o problema.

Despois decide cal de tres cousas estás construíndo en realidade. Un túnel por aplicación é a API do construtor, coa lista como parte do teu perfil. Un cortalumes de dispositivo é manexo de paquetes máis un ciclo de vida que poidas defender. Cambiar a VPN doutra persoa non é un camiño soportado en absoluto, e a resposta honesta alí é que o axuste pertence a ese produto.

Artigos relacionados