6 votos

¿Cómo configurar correctamente el DNS mientras se ejecutan dos LAN?

El dispositivo no puede hacer ping a www.google.com pero hacer ping a 8.8.8.8 está bien. Mi sistema operativo es Android 6.0.1, el kernel es 4.1.15

He intentado con resolv.conf y /etc/hosts. Pero estos métodos parecen no funcionar en Android.

Y no pude averiguar cuál es exactamente el problema.

eth0      Link encap:Ethernet  HWaddr EE:DE:17:79:BB:42
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ecde:17ff:fe79:bb42/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:600 TX bytes:1166

eth1      Link encap:Ethernet  HWaddr 00:0E:C6:81:79:01
          inet addr:192.168.120.57  Bcast:192.168.121.255  Mask:255.255.254.0
          inet6 addr: fe80::20e:c6ff:fe81:7901/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41709 errors:0 dropped:0 overruns:0 frame:0
          TX packets:113 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2738793 TX bytes:8354

Cerré el servicio netd para que pueda configurar eth0 y eth1 respectivamente.

Aquí está mi regla de IP

0:      from all lookup local
9998:   from all to 192.168.120.0/23 lookup 4
9999:   from all to 192.168.1.0/24 lookup 3
10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system
13000:  from all fwmark 0x10063/0x1ffff lookup local_network
15000:  from all fwmark 0x0/0x10000 lookup legacy_system
16000:  from all fwmark 0x0/0x10000 lookup legacy_network
17000:  from all fwmark 0x0/0x10000 lookup local_network
23000:  from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000:  from all unreachable

Aquí está un resultado de ping a una IP, puedes ver que la respuesta es buena.

root# ping 192.168.120.1
PING 192.168.120.1 (192.168.120.1) 56(84) bytes of data.
64 bytes from 192.168.120.1: icmp_seq=1 ttl=64 time=1.08 ms
64 bytes from 192.168.120.1: icmp_seq=2 ttl=64 time=0.986 ms
64 bytes from 192.168.120.1: icmp_seq=3 ttl=64 time=1.00 ms

root# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=0.718 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=0.420 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=0.403 ms

Pero hacer ping a google siempre devuelve desconocido.

ping: unknown host www.google.com

Espero poder hacer ping a una IP y a una URL en mi caso.

Por cierto, el DNS de eth0 es 192.168.1.245 y el DNS de eth1 es 8.8.8.8

0 votos

¿Por qué alguien querría conectar un dispositivo Android a dos redes LAN al mismo tiempo?

7voto

Jack Wade Puntos 231

Intentaré explicar lo que entiendo por DNS en Android. Os ayudará a solucionar problemas relacionados y me servirá para futuros apuntes.

DNS

Tradicionalmente, Domain Name Resolver ha formado parte de la biblioteca C del sistema operativo (comúnmente denominada libc). GNU libc (que es el más común en las distribuciones Linux) implementa un complicado mecanismo de resolución de nombres llamado NSS que puede priorizar en qué orden los servicios de bases de datos como LDAP / NIS, local files ( /etc/hosts ) y DNS para resolver nombres de host / dominio. DNS resolver entonces lee /etc/resolv.conf para obtener la dirección del servidor de nombres que se va a consultar.

A diferencia de GNU libc Android Bionic libc (que depende en netd para DNS) no considera /etc/resolv.conf a menos que CAMBIOS_ANDROID (sólo cuando libc++ se compila como biblioteca estática ?). Sin embargo /etc/hosts Las entradas son valorado por el resolver de Android al resolver nombres.
Pero si está utilizando un binario compilado / enlazado estáticamente con algún otro - como por ejemplo musl o uC o diet - libc, que debe estar leyendo /etc/resolv.conf para obtener la dirección IP del servidor de nombres de dominio. Busybox ping es un ejemplo habitual.

DNS de Android

Dentro del entorno de ejecución Java de Android, se puede utilizar un DHCP proporcionado o configurado manualmente o codificado Se utiliza el servidor DNS. Propiedades net.dns1 y net.dns2 se establecen con los valores de los servidores DNS recibidos de Servidor DHCP (en Wi-Fi o datos móviles) por ConnectivityService y luego reenviado a netd . A partir de Android Oreo, estas propiedades son ya no está disponible a través de las API de Android, pero sólo legible como root o shell - una vez eliminado entonces re-added . Así que cambiar las propiedades net.dns* utilizando setprop sólo afecta a los programas (que se ejecutan con UID 0 o 2000 ) que leen explícitamente estas propiedades. Un ejemplo de ello es busybox de meefik . También había algunos otros Propiedades relacionadas con DNS ambientado en los viejos tiempos de dhcpcd que era el cliente DHCP hasta Lollipop.

Vea más detalles en ¿Cómo hace el sistema operativo Android la resolución de nombres DNS? .

Almacenamiento en caché

Las consultas DNS se almacenan en caché en Android mediante netd como NSCD en las distribuciones Linux para acelerar la resolución de nombres. Android tiene un herramienta de línea de comandos ndc que podría borrar la caché de DNS, pero el comando fue eliminado en Android 7 . Ahora es posible evitar el almacenamiento en caché configurando la variable de entorno ANDROID_DNS_MODE que impide que Bionic libc devuelva el proxy a netd para la búsqueda en caché. Véase ¿Cómo modificar variables de entorno como PATH al inicio? para establecer la variable de forma global.

Cómo configurar DNS

Como ya se ha mencionado, anteriormente se utilizaban distintos métodos para cambiar los servidores de nombres de dominio predeterminados en Android no parecen funcionar ahora. Configuración de servidores de nombres y / o nombre de dominio de búsqueda a través de línea de comandos:

~$ ndc resolver setnetdns <network_id> <domain> <DNS>

* La sintaxis de los comandos es un poco diferente en versiones anteriores

Del mismo modo ndc tether dns set trabaja para dnsmasq . Para obtener el ID de red actual:

~$ dumpsys netd | grep 'Default network'

Borrar servidores DNS establecidos:

~# ndc resolver clearnetdns <network_id>

Sin embargo, algunas aplicaciones pueden a veces saltarse el mecanismo de resolución de nombres de Android intentando llegar directamente a algún servidor de nombres, he observado WhatsApp. O el valor codificado se utiliza (puede ser cuando el router es anunciar el servidor DNS IPv6 ). La única opción que funciona con seguridad es iptables DNAT :

~# iptables -t nat -I OUTPUT -p udp --dport 53 -j DNAT --to 1.1.1.1:53

Los servidores DNS también pueden configurado en Ajustes para la red Wi-Fi. Compatible con Android 9+ DNS privado / DNS sobre TLS (DoT) que envía consultas DNS cifradas sobre puerto 853 según lo normalizado en RFC7858 .

La solución no root que funciona tanto para Wi-Fi como para datos móviles es utilizar aplicaciones VPN como Anfitriones virtuales o Filtro DNS personal que interceptan el tráfico DNS y realizan consultas al servidor DNS ascendente configurado.

Pruebas

Para comprobar qué servidor de nombres utiliza connectivity y netd servicios en tiempo de ejecución Java:

~# dumpsys connectivity | grep CONNECTED | grep -o 'DnsAddresses: \[[^ ]*'
~# dumpsys netd | grep -A2 'DNS servers:'

Y los utilizados por el servidor DNS de reenvío de anclaje:

~# ndc tether dns list
~# logcat -d -s TetherController,dnsmasq | grep -E 'update_dns|nameserver'

Para ver a dónde van las consultas DNS, puede capturar el tráfico destinado al puerto 53:

~# iptables -I OUTPUT -m udp -p udp --dport 53 -j LOG --log-prefix 'DNS_QUERIES '
~# iptables -I OUTPUT -m tcp -p tcp --dport 53 -j LOG --log-prefix 'DNS_QUERIES '
~# dmesg -w | grep 'DNS_QUERIES'

O

~# tcpdump -n -i any port 53

Si las consultas no van al destino deseado, hay algún problema con tu configuración DNS, particularmente si usas VPN. Tenga en cuenta que iptables y tcpdump (captura en el puerto 53 ) no funcionará con DNS Privado (puerto 853 ). Carácter dinámico de la RPDB y de las tablas de encaminamiento ( rt_tables sigue cambiando, principal no se utiliza) acompañado de fwmark ( SO_MARK ) complican las cosas para el control manual.

Así que si los pasos mencionados no funcionan, no hay mucho que puedas hacer para solucionar los problemas de DNS en los dispositivos Android. Un restablecimiento de fábrica o un reinicio de la ROM pueden resolver el problema.

Además, si un servidor DNS local es proporcionado por DHCP (servidor en el router Wi-Fi), puede comprobar si realmente está escuchando en el puerto 53:

~# nmap -e eth0 -sUT -p53 --script=dns-recursion 192.168.1.245

0 votos

@unforgettableidSupportsMonica Gracias por la edición. Pero solo por curiosidad, me gustaría saber por qué consideras que el nuevo formato de encabezado es mejor que el anterior. ¿El uso de letras mayúsculas en los encabezados no es correcto o el uso de dos puntos al final está mal? Para mi aprendizaje, para poder corregirlo en el futuro. Además, mantuve a propósito los últimos tres encabezados con fuentes más pequeñas porque son subencabezados de "DNS DE ANDROID". ¿Es eso inapropiado?

0 votos

A) ¡No te preocupes! B) Escribir todo en mayúsculas dificulta la legibilidad. (Fuente.) Algunos editores (por ejemplo, los editores de periódicos) aún utilizan mayúsculas en los títulos, pero creo que es mejor no hacerlo. C) Los dos puntos al final no están mal, y desconozco cualquier evidencia de que dificulten la legibilidad. Los dos puntos al final son simplemente poco convencionales. Los eliminé para que tu publicación sea más convencional.

0 votos

D) Ups. No presté suficiente atención durante mi primera edición y no me di cuenta de que los últimos tres # títulos # en realidad debían ser ### subtitulos ###. Fue mi error. Ahora he sugerido una segunda edición para cambiarlos de vuelta a subtitulos.

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