C'est possible, mais loin d'être facile à réaliser. Il existe de multiples approches que nous pouvons utiliser pour bloquer (ou du moins essayer de bloquer) le trafic entrant.
Mais bloquer la circulation dans un sens n'a pas de sens dans la plupart des cas. Une application qui envoie des paquets TCP mais ne reçoit pas de réponse en retour se considérera déconnectée d'Internet. Cependant, vous pouvez essayer pour votre cas particulier si cela fonctionne.
Note : Toutes les méthodes décrites ci-dessous nécessitent un accès Root.
BLOCAGE BASÉ SUR L'UID :
Android utilise le noyau Linux qui possède un pare-feu intégré. netfilter
qui peuvent être utilisés pour filtrer le trafic réseau. Il existe un iptables
module nommé owner
qui filtre le trafic en fonction de son UID / GID. Chaque application sur Android est un utilisateur UNIX et possède un UID unique.
Mais le problème est que owner
Le module est uniquement valable pour le trafic sortant c'est-à-dire les paquets générés localement. Les paquets IP provenant d'une autre machine ne portent pas d'information sur le propriétaire. Le module propriétaire est donc appliqué au trafic entrant devrait échouer ou il devrait donner un avertissement comme expliqué aquí . Pour mesurer l'utilisation du réseau entrant/sortant par application, Android a patché le noyau pour y inclure qtaguid
module. Mais iptables
n'a pas été patché pour utiliser le module en ligne de commande. Voir également les détails connexes dans Comment visualiser le trafic réseau demandé par une application ? .
Cependant owner
fonctionne pour certains des paquets TCP entrants reçus en retour avec Drapeaux TCP qui peut bloquer totalement ou partiellement le trafic entrant :
# iptables -I INPUT -m owner --uid-owner <APP_UID> -j DROP
* Pour supprimer la règle, remplacez -I
avec -D
La raison en est probablement que les mêmes paquets TCP sont renvoyés pour Handshake et Bye, mais je n'en suis pas sûr. Cependant, assurez-vous que cela ne fonctionne pas pour un trafic 100% TCP/UDP. Voir le trafic échappé :
# iptables -I INPUT -j LOG --log-uid --log-prefix 'INCOMING '
# dmesg -w | grep INCOMING | grep -vE 'IN=lo|=5353|=1900|ICMP' | grep -v UID=
Certaines applications de pare-feu bloquent le trafic sortant utilisant un VPN sur Android. API de VpnService fait également appel à UIDs
y SOcket_MARKs
pour contrôler le trafic dans la table de routage / RPDB, juste avant de quitter le dispositif.
BLOCAGE BASÉ SUR LE PORT :
Des moyens plus sûrs et plus complexes de bloquer le trafic entrant reposent sur l'observation de tous les sockets réseau créés et supprimés. Un socket est une combinaison d'adresse IP et de port.
Pour avoir une idée de base de cette approche, prenons l'exemple de l'application Firefox sur mon téléphone, avec l'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
Cela bloquera tout le trafic entrant vers le port 39910 utilisé par l'application Firefox. Mais cette approche n'est pas pratique car la création et la suppression des sockets se fait à un rythme tellement élevé que même dans le code natif, certains paquets seraient manqués. Et au moment suivant, le même port sera assigné au socket d'une autre application. Cela ne semble possible que si le port local est Correction de mais pour les applications normales, le système aléatoire sélectionné est disponible ( TCP / [UDP](https://developer.android.com/reference/java/net/DatagramSocket.html#DatagramSocket()) ) est utilisé pour la création de sockets (peut être contrôlé avec la commande gamme de ports ip_locaux ).
Vous pouvez trouver plus de détails Visualiser le trafic réseau demandé par l'application .
BLOCAGE BASÉ SUR L'IP :
Cette méthode fonctionne mieux si vous connaissez l'adresse IP source des paquets. Trouvez tous les serveurs auxquels votre application essaie de se connecter sur Internet (par exemple en bloquant l'application pour le trafic sortant) et bloquez-les en utilisant la méthode suivante iptables
le filtrage des IP sources, si elles ne sont pas au nombre de cent et si elles ne changent pas fréquemment :
# iptables -I INPUT -p tcp -s <IP_ADDR> -j DROP