2 votos

¿Restringir una aplicación para que sólo envíe tráfico de Internet pero no lo reciba de vuelta?

¿Hay alguna forma o aplicación para restringir algunas aplicaciones en mi Android, o todo el dispositivo, para que sólo envíen paquetes de datos de Internet pero no los reciban de vuelta?

Quiero confundir una aplicación de juegos haciendo esto. Me limita a tener sólo dos juegos simultáneamente. Pero quiero suprimir este comportamiento abriendo el juego de forma normal, bloqueando el tráfico entrante y luego enviando tres o más peticiones para iniciar una partida. La aplicación falla, pero después de reiniciar, los tres o más juegos se inician.

Tengo un teléfono rooteado.

4voto

Jack Wade Puntos 231

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

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X