Es posible, pero no es fácil de conseguir. Hay múltiples enfoques que podemos utilizar para bloquear (o al menos intentar bloquear) el tráfico entrante.
Pero bloquear el tráfico en un solo sentido no tiene sentido en la mayoría de los casos. Una aplicación que envíe paquetes TCP pero no reciba respuestas se considerará desconectada de Internet. Sin embargo, puedes probar en tu caso particular si funciona.
Nota: Todos los métodos descritos a continuación necesitan acceso a root.
BLOQUEO BASADO EN EL UID:
Android utiliza el núcleo de Linux, que tiene un cortafuegos incorporado netfilter
que puede utilizarse para filtrar el tráfico de la red. Existe un iptables
módulo denominado owner
que filtra el tráfico en función de su UID / GID. Cada aplicación en Android es un usuario UNIX y tiene un UID único.
Pero el problema es que owner
es el módulo sólo válido para el tráfico de salida es decir, los paquetes generados localmente. Los paquetes IP que provienen de otra máquina no llevan la información del propietario con ellos. Así que el módulo de propietario aplicado al tráfico entrante debe fallar o debería dar un aviso como se explica aquí . Para medir el uso de la red entrante/saliente por aplicación, Android parcheó el kernel para incluir qtaguid
módulo. Pero iptables
no fue parcheado para usar el módulo desde la línea de comandos. Vea también los detalles relacionados en ¿Cómo ver el tráfico de red solicitado por la aplicación? .
Sin embargo, owner
funciona para algunos de los paquetes TCP entrantes recibidos de vuelta con Banderas TCP que puede bloquear total o parcialmente el tráfico entrante:
# iptables -I INPUT -m owner --uid-owner <APP_UID> -j DROP
* Para eliminar la regla, sustituya -I
con -D
Probablemente la razón es que se devuelven los mismos paquetes TCP para el Handshake y el Bye, pero no estoy seguro de ello. Sin embargo, asegúrese de que no funciona para el 100% del tráfico TCP/UDP. Vea el tráfico escapado:
# iptables -I INPUT -j LOG --log-uid --log-prefix 'INCOMING '
# dmesg -w | grep INCOMING | grep -vE 'IN=lo|=5353|=1900|ICMP' | grep -v UID=
Algunas aplicaciones de cortafuegos bloquean el tráfico saliente mediante VPN en Android. API de VpnService también hace uso de UIDs
y SOcket_MARKs
para controlar el tráfico en la tabla de enrutamiento / RPDB, justo antes de salir del dispositivo.
BLOQUEO BASADO EN EL PUERTO:
Las formas más seguras y complejas de bloquear el tráfico entrante se basan en vigilar todos los sockets de red que se crean y eliminan. Un socket es una combinación de dirección IP y puerto.
Para tener una idea básica de este enfoque, tomemos el ejemplo de la aplicación Firefox en mi teléfono, con el UID 10081:
# ss -4tuapne | awk '/uid:10081/ { print $5,$1,$2,$7.$8 }'
192.168.1.11:39910 tcp ESTAB users:(("mozilla.firefox",pid=22370,fd=163)) uid:10081
...
...
# iptables -I INPUT -p tcp --dport 39910 -j DROP
Esto bloqueará todo el tráfico entrante al puerto 39910 que utiliza la aplicación Firefox. Pero este enfoque no es práctico porque la creación y eliminación de sockets tiene lugar a un ritmo tan alto que incluso en el código nativo se perderían algunos paquetes. Y en el siguiente momento el mismo puerto será asignado a algún otro socket de la aplicación. Esto sólo parece posible si el puerto local es fijo pero para las aplicaciones normales, el sistema seleccionado al azar está disponible ( TCP / [UDP](https://developer.android.com/reference/java/net/DatagramSocket.html#DatagramSocket()) ) se está utilizando para la creación de sockets (se puede controlar con rango_de_puertos_locales_ip ).
Puede encontrar más detalles Ver el tráfico de red solicitado por la aplicación .
BLOQUEO BASADO EN LA IP:
Este método funciona mejor si conoces la dirección IP de origen de los paquetes. Encuentre todos los servidores a los que su aplicación intenta conectarse en Internet (por ejemplo, bloqueando el tráfico saliente de la aplicación) y bloquéelos utilizando iptables
filtrado de IP de origen, si no son cien y no cambian con frecuencia:
# iptables -I INPUT -p tcp -s <IP_ADDR> -j DROP