Quiero evitar la censura de mi ISP móvil local (bloquea imgur, por ejemplo, por alguna razón desconocida.
Captura de pantalla (haga clic en la imagen para una variante más grande)
Estoy bastante seguro de que puedo eludir esto cambiando mi DNS a Google DNS u OpenDNS, pero no estoy muy seguro de cómo lograr esto en KitKat.
Info:
Device: Nexus 5
Android version: 4.4.2
Device status: rooted
Ok, antes que nada, divulgación completa : soy el autor de una aplicación que ahora está en Google Play Store y que te permite cambiar el DNS para cualquier conexión móvil en Android 4.4. La aplicación requiere root , cuesta un par de dólares y se llama Override DNS . Me dijeron, en una respuesta ahora eliminada, que es justo vincular mi aplicación siempre que la exponga claramente.
El problema que encontré con esta versión de Android (4.4) es que, aparentemente por razones de almacenamiento en caché, se cambió el comportamiento del sistema para redirigir todas las consultas de DNS a un demonio del sistema llamado netd
(aquí hay un enlace a una presentación relacionada con las redes de Android antes de 4.4 que , sin embargo, cubre parte de estos temas).
El método getprop
/ setprop
ya no funciona. Esos valores, cuando se modifican, simplemente son ignorados por el netd
daemon.
Es necesario comunicarse directamente con el daemon a través del /dev/socket/netd
socket. En Android ahora está presente una herramienta llamada ndc
que hace exactamente este trabajo.
La sintaxis para las cosas relacionadas con el DNS es esta:
# ndc resolver flushif <iface>
# ndc resolver flushdefaultif
# ndc resolver setifdns <iface> <domains> <dns1> <dns2>
# ndc resolver setdefaultif <iface>
La aplicación adivina automáticamente el nombre del dispositivo de red y aplica estos comandos cada vez que se activa una red móvil.
ndc resolver setifdns <iface> <domains> <dns1> <dns2> ...
. Ejemplo:ndc resolver setifdns eth0 "" 8.8.8.8 8.8.4.4
"Resolví" este problema usando una regla de iptables para reenviar todas las conexiones del puerto 53 a un servidor DNS previsto; mi experiencia en Android 4.4.2 al intentar modificar la configuración de DNS mientras estaba conectado a 3G ha sido exactamente como lo describió Leo; ignorancia de valores en getprop |grep dns[0-9]\]: y dhcpd.conf.
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 8.8.8.8:53
El motivo se describe aquí: http://forum.xda-developers.com/showpost.php?p=44722857&postcount=6 Todas las aplicaciones realizan búsquedas de DNS a través de netd a través de un socket /dev/socket/dnsproxyd unix. Este hilo también describe por qué se ignoran las propiedades del sistema.
Para deshacer esto, haga
iptables -t nat -L OUTPUT -n -v --line-numbers
, busque el número de línea que corresponde a udp dpt:53 to:xxx.xxx.xxx.xxx:53 y haga
iptables -t nat -D OUTPUT *linenumber*
Lamentablemente, puede ser imposible hacerlo en este momento, sin embargo, es posible probar DNS Changer . Esto puede funcionar si está rooteado, pero no hay garantías.
Un buen servicio de DNS para usar sería el servicio de DNS público de Google. Tiende a funcionar muy bien para este tipo de problemas aquí.
Si nada de esto funciona, sigue buscando respuestas. Un buen sitio para cosas como esta es XDA Developers . Suelen tener muchas respuestas sobre cosas para Android.
Estoy en KitKat Cyanogenmod 11, lo que significa que estoy rooteado de forma predeterminada. A pesar de eso solo puedo reportar falla:
1er método:
Cuando pruebo el adb shell
con
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
y luego pruebo a qué IP hjfdkhfjkyuiwnwetbyebvtwgqwdi.tk resuelve ... Obtengo una respuesta NXDOMAIN, lo que significa que no proviene del servidor de nombres OpenDNS que configuré (que devolvería una respuesta con una IP alternativa, para servirle agrega).
al hacer
getprop | grep dns
Sólo vería lo que he configurado. Sin embargo, cuando cambio de Wi-Fi a móvil (3G o 4G/LTE), veo direcciones IP que reconozco como asignadas a mi operador de telefonía móvil. Las aplicaciones como "DNSwitch" o "DNS Changer" pueden restablecer esos resolutores automáticamente al cambiar la red. Sin embargo, lo getprop
que me informa, todavía no es lo que realmente está resolviendo.
2do método [a]:
Otra forma en que lo intenté es modificar /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf
un conjunto de cosas arregladas allí (pero tenga en cuenta que los nombres de red y la cantidad de resolutores pueden diferir). Sin éxito.
2do método [b]:
Y /system/etc/dhcpcd/dhcpcd.conf
eliminé el parámetro para aceptar resolutores en la negociación de DHCP. Tampoco éxito.
3er método:
Hasta ahora, lo único que funcionaría un poco es usar una "VPN pobre", usando la aplicación "Túnel SSH", usando SOCKS4, pero usando eso no obtuve exactamente un buen resultado.
Reanudar:
Parece que el DNS está configurado en otro lugar o que todos se reenvían (secuestrados) tan pronto como la red es móvil.
Entonces, ¿cómo es que? ¿Es otra forma sucia de proporcionar a los operadores una herramienta para demoler la neutralidad de la red?
En tu caso tu pregunta fue por eso. ¿Tiene SSH para probar si SSHTunnel es una solución alternativa para sortear la censura de sus operadores?
Encontré el mismo problema hoy, y gracias a Transfusion. Traté de desarrollar una aplicación " DNS forwarde r" para resolverlo. No cambia el servidor dns en el sistema, pero reenvía las consultas dns a otro servidor. Esta solución funciona bien para mí en Kitkat (Nexus 5/4.4.3 y Moto Razr/CM11). Espero que pueda ayudar a otros también.
Actualmente, no creo que haya ninguna forma de cambiar su DNS en sus datos móviles. Pero si su teléfono está rooteado, puede usar aplicaciones como Set DNS .
Irfan Latif