Sur le routeur
Comme roxan a déjà écrit Cette opération ne peut pas être effectuée sur l'appareil Android lui-même (du moins, pas facilement), mais doit être effectuée sur votre routeur. Certains routeurs permettent de spécifier, pour chaque appareil, si l'accès à Internet doit être autorisé, en utilisant un seul "commutateur" (oui/non).
Si ce n'est pas possible, vous devrez modifier les règles du pare-feu. Cela nécessiterait d'attribuer une IP fixe à votre appareil, donc sur votre routeur vous pourriez spécifier par exemple (pseudo-code) :
route from <android_ip> to <internal_network> pass
route from <android_ip> to * reject/drop
(encore une fois, c'est du pseudo-code, je ne suis pas très familier avec le iptables
pour donner la syntaxe exacte par cœur). Ce que cela ferait alors : Tous les paquets provenant de votre appareil Android passeraient le routeur s'ils étaient destinés au réseau interne, mais seraient rejetés (visibles pour l'appareil Android, qui pourrait donc réagir immédiatement) ou abandonnés (les connexions seraient alors interrompues) s'ils étaient destinés à l'extérieur.
Fondamentalement, comme Android utilise iptables
de même, il devrait être possible de faire la même chose directement sur l'appareil, pourrait-on penser. Mais je ne suis pas sûr que ce soit vraiment vrai : du point de vue de l'appareil Android, tout est ciblé vers l'extérieur (vers sa passerelle). Ce qui donne une autre idée :
Sur l'appareil Android
Je viens de vérifier sur mon appareil, et Android inclut en effet la fonction route
(bien que j'aie eu besoin de l'exécuter via busybox, par ex. busybox route
pour afficher les routes configurées). Supposons que votre réseau local utilise 192.168.0.*
et votre routeur étant 192.168.0.1
vous pouvez faire ce qui suit :
# default gateway (should already be defined), but we don't want this
#route add default gw 192.168.0.1 wlan0
route del default gw wlan0
# re-add route for access to the local network
route add -net 192.168.0.0 netmask 255.255.255.0 192.168.0.1 wlan0
Maintenant, le dispositif ne devrait plus savoir quoi faire avec les paquets, par exemple pour les 8.8.8.8
et renvoie un message "no route to host". L'exemple montre déjà un problème en jeu : 8.8.8.8
est l'un des serveurs de noms préconfigurés. Veillez donc à configurer votre appareil pour qu'il utilise un serveur de noms dans votre réseau local, si vous souhaitez obtenir une résolution de nom (le serveur de noms de Google ne sera pas non plus d'une grande utilité pour votre réseau interne).
Notons également que l'interface utilisée pourrait ne pas s'appeler wlan0
. Découvrez-le en invoquant route
sans aucun argument : cela listera toutes les routes établies comme ceci :
link-local * 255.255.0.0 U 1000 0 0 eth0
Donc dans ce cas, j'ai dû utiliser eth0
pour l'interface.
192.168.0.0 * 255.255.255.0 U 205 0 0 wlan0
Ceci décrirait notre exemple, en utilisant wlan0
comme interface, et 192.168.0.*
comme réseau. Comme sur mon appareil cette route était déjà présente dans la table de routage, il pourrait même suffire de supprimer simplement la passerelle par défaut.
Je n'ai pas effectué de test pour vérifier que tout fonctionne comme vous l'aviez prévu (bien que cela devrait, j'ai peut-être inclus une erreur de frappe ici ou là). Je serais donc heureux que vous me disiez si tout s'est bien passé :)