26 votes

Comment modifier le DNS des connexions mobiles sous Android KitKat ?

Je veux éviter la censure de mon fournisseur d'accès mobile local (il bloque imgur, par exemple, pour une raison inconnue).

Screenshot
Capture d'écran (cliquez sur l'image pour l'agrandir)

Je suis à peu près certain de pouvoir contourner ce problème en changeant mon DNS pour Google DNS ou OpenDNS, mais je ne sais pas vraiment comment faire sur KitKat.

Info:
Device: Nexus 5
Android version: 4.4.2
Device status: rooted

18voto

Priyank Bolia Points 3825

Ok, tout d'abord divulgation complète : Je suis l'auteur d'une application qui est maintenant sur le Google Play Store et qui permet de changer les DNS pour toute connexion mobile sous Android 4.4. L'application nécessite une racine coûte quelques dollars et s'appelle Annulation du DNS . On m'a dit, dans une réponse maintenant supprimée, qu'il était juste de créer un lien vers mon application tant que je l'exposais clairement.

Le problème que j'ai trouvé avec cette version d'Android (4.4) est que, apparemment pour des raisons de mise en cache, le comportement du système a été modifié pour rediriger toutes les requêtes DNS vers un démon système appelé netd (voici un lien à une présentation relative à la mise en réseau d'Android avant la version 4.4 qui, toutefois, couvre une partie de ces sujets).

があります。 getprop / setprop ne fonctionne plus. Ces valeurs, lorsqu'elles sont modifiées, sont tout simplement ignorées par la fonction netd démon.

Il est nécessaire de communiquer directement avec le démon par l'intermédiaire de la fonction /dev/socket/netd prise. Dans Android, il est maintenant présent un outil appelé ndc qui fait exactement ce travail.

La syntaxe pour les éléments liés au DNS est la suivante :

# ndc resolver flushif <iface>
# ndc resolver flushdefaultif
# ndc resolver setifdns <iface> <domains> <dns1> <dns2>
# ndc resolver setdefaultif <iface>

があります。 application devine automatiquement le nom du périphérique réseau et applique ces commandes chaque fois qu'un réseau mobile est activé.

13voto

ajma Points 5637

J'ai "résolu" ce problème en utilisant une règle iptables pour transférer toutes les connexions du port 53 vers un serveur DNS prévu ; mon expérience sur Android 4.4.2 en essayant de modifier les paramètres DNS alors que je suis connecté à la 3G a été exactement comme Leo l'a décrit ; ignorance des valeurs dans getprop |grep dns[0-9]\] : et dhcpd.conf.

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 8.8.8.8:53

La raison en est décrite ici : http://forum.xda-developers.com/showpost.php?p=44722857&postcount=6 Toutes les applications effectuent des recherches DNS par le biais de netd via un socket unix /dev/socket/dnsproxyd. Ce fil de discussion décrit également pourquoi les propriétés du système sont ignorées.

Pour annuler cela, faites

iptables -t nat -L OUTPUT -n -v --line-numbers

trouvez le numéro de ligne qui correspond à udp dpt:53 to:xxx.xxx.xxx.xxx:53 et faites

iptables -t nat -D OUTPUT *linenumber*

1voto

pyrogoggles Points 21

Malheureusement, il est impossible de le faire pour l'instant, mais il est possible d'essayer Changeur de DNS . Cela peut fonctionner si vous êtes enraciné, mais il n'y a aucune garantie.

Un bon service DNS à utiliser est le service DNS public de Google. Il a tendance à fonctionner très bien pour ce type de problèmes.

Si rien de tout cela ne fonctionne, continuez à chercher des réponses. Un bon site pour ce genre de choses est Développeurs XDA . Ils ont tendance à avoir beaucoup de réponses sur les choses pour Android.

1voto

Leo Points 21

Je suis sur KitKat Cyanogenmod 11, ce qui signifie que je suis rooté par défaut. Malgré cela, je ne peux que constater l'échec :

1ère méthode :

Lorsque j'essaie le adb shell avec

setprop net.rmnet0.dns1 208.67.222.222
setprop net.rmnet0.dns2 208.67.222.222
setprop net.rmnet1.dns1 208.67.222.222
setprop net.rmnet1.dns2 208.67.222.222
setprop net.rmnet2.dns1 208.67.222.222
setprop net.rmnet2.dns2 208.67.222.222
setprop net.dns1 208.67.222.222
setprop net.dns1 208.67.222.222

et ensuite tester vers quelle IP hjfdkhfjkyuiwnwetbyebvtwgqwdi.tk se résout... J'obtiens une réponse NXDOMAIN, ce qui signifie qu'il ne provient pas du serveur de noms OpenDNS que j'ai configuré (qui renverrait une réponse avec une IP alternative, pour vous servir de publicité).

En faisant

getprop | grep dns

Je ne verrais que ce que j'ai configuré. Cependant, lorsque je passe du WiFi au mobile (3G ou 4G/LTE), je vois des adresses IP que je reconnais comme étant attribuées à mon opérateur mobile. Des applications comme "DNSwitch" ou "DNS Changer" peuvent redéfinir ces résolveurs automatiquement lors d'un changement de réseau. Mais qu'en est-il getprop selon moi, n'est toujours pas ce qui fait vraiment la résolution.

2ème méthode [a] :

Un autre moyen que j'ai essayé, est de modifier /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf et régler les choses là-dedans (mais soyez conscient que les noms de réseau et le nombre de résolveurs peuvent différer). Sans succès.

2ème méthode [b] :

Et dans /system/etc/dhcpcd/dhcpcd.conf J'ai enlevé le paramètre pour accepter les résolveurs à la négociation DHCP. Pas de succès non plus.

3ième méthode :

Jusqu'à présent, la seule chose qui pourrait fonctionner un peu est l'utilisation d'un "pauvre homme VPN", en utilisant l'application "SSH Tunnel", en utilisant SOCKS4, mais en utilisant cela je n'ai pas exactement obtenu un bon résultat.

Resume :

Il semble que soit les DNS sont définis ailleurs, soit ils sont tous transférés (détournés) dès que le réseau est mobile.

Alors, comment ça se fait ? S'agit-il d'un autre moyen détourné de fournir aux opérateurs un outil pour démolir la neutralité du réseau ?

Dans votre cas, votre question était due à cela. Avez-vous SSH pour essayer si SSHTunnel est une solution alternative pour contourner la censure de votre opérateur ?

1voto

user64656 Points 21

J'ai rencontré le même problème aujourd'hui, et grâce à Transfusion. J'ai essayé de développer une application " DNS forwarde r" pour résoudre le problème. Cela ne change pas le serveur DNS sur le système, mais transmet les requêtes DNS à un autre serveur. Cette solution de contournement fonctionne bien pour moi sur Kitkat (Nexus 5/4.4.3 et Moto Razr/CM11). J'espère que cela pourra aider d'autres personnes.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X