¿Cómo trabajan juntos `/ etc / hosts` y DNS para resolver nombres de host en direcciones IP?

10

En Linux, ¿cómo /etc/hostsfuncionan juntos y DNS para resolver los nombres de host a las direcciones IP?

  1. si se puede resolver un nombre de host /etc/hosts, ¿se aplica DNS después /etc/hosts de resolver el nombre de host o trata la dirección IP resuelta /etc/hostscomo un "nombre de host" para resolver de forma recursiva?
  2. En mi navegador (firefox y google chrome), cuando agrego a /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    escribir www.google.com en la barra de direcciones de los navegadores y presionar enter no se conectará al sitio web. Después se quita esa frase de /etc/hosts, puedo conectar con el sitio web. ¿Significa que /etc/hostsanula el DNS para resolver nombres de host?

    Después de volver a agregar la línea /etc/hosts, aún puedo conectarme al sitio web, incluso después de actualizar la página web. ¿Por qué no /etc/hostsvolver a presentar una solicitud para no poder conectarme al sitio web?

Gracias.

Tim
fuente
99
Tenga en cuenta que muchos navegadores web implementan sus propios servidores DNS y caché DNS y no consultan ningún mecanismo de búsqueda de nombres que se haya configurado en el sistema. En otras palabras, algunos navegadores web ignoran por completo /etc/hostslos servidores de nombres definidos localmente. Es bastante confuso presenciar la primera vez. (Mirándote, navegadores basados ​​en cromo!)
Christopher
@ Christopher Venía aquí para decir lo mismo. Relacionado unix.stackexchange.com/questions/363498/…
Rui F Ribeiro
@Christopher Después de volver a agregar la línea a / etc / hosts, aún puedo conectarme al sitio web, incluso después de actualizar la página web. ¿Por qué / etc / hosts no se vuelve a aplicar para que no pueda conectarme al sitio web? ¿Es por el caché DNS de Firefox?
Tim
@RuiFRibeiro Esta versión de Chromium parece respetar /etc/hostsy los servidores DNS definidos por el sistema: ( github.com/Eloston/ungoogled-chromium ). Instalación en MacOS con Homebrew: brew cask install eloston-chromium.
Christopher

Respuestas:

21

Esto está dictado por la configuración NSS (Name Service Switch), es decir /etc/nsswitch.conf, la hostsdirectiva del archivo . Por ejemplo, en mi sistema:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Aquí, se filesrefiere al /etc/hostsarchivo y dnsal sistema DNS. Y como puedes imaginar, lo que ocurra primero gana .

Además, vea man 5 nsswitch.confpara tener más idea sobre esto.


Como un aparte, para seguir los ordenamientos resolución anfitrión NSS, el uso getentcon hostscomo base de datos, por ejemplo:

getent hosts example.com
heemayl
fuente
Gracias. En mi parte 2, ¿es porque el servidor DNS de mi navegador web no funciona, pero la caché DNS del navegador web funciona?
Tim
¿Cómo systemd.resolverafecta las resoluciones? ¿Dónde encajan NIS y LDAP en el sistema de resolución? ¿Qué orden sigue a un sistema MacOS o un sistema Windows?
Isaac
@Tim Sí, su navegador está recuperando los datos de la memoria caché.
heemayl
7

Para responder solo a su última pregunta: /etc/hostsno se aplica nuevamente de inmediato porque firefoxestá almacenando en caché el último nombre de host para el que obtuvo google.com; si lo quieres para ir a buscar siempre de nuevo, usted tiene que fijar network.dnsCacheExpirationa 0en about:config. Más información (aunque un poco anticuada) aquí . Lo siento si esto es offtopic.


Como nota al margen, muchos programas no usan el resolutor estándar ( getaddrinfo(3), getnameinfo(3)[1]) porque es una mierda .

Primero, la interfaz no es asíncrona; cualquier programa moderadamente complejo tendrá que generar un hilo separado haciendo solo el getaddrinfo()y luego inventar su propio protocolo para comunicarse con él (y ni siquiera entremos getaddrinfo_a(), que está enviando una señal al finalizar, por lo que es aún peor).

En segundo lugar, la implementación del resolutor en glibc(la biblioteca estándar de C en Linux) es horrible, esperando que permita que atraiga objetos dinámicos aleatorios en el espacio de direcciones a través de dlopen()su espalda, y que sea imposible contenerlo de ninguna manera o usarlo estáticamente ejecutables vinculados.

Dado que muchos programas no utilizan el sistema de resolución normal de manera directa, sino que también no se molestan en replicar exactamente su comportamiento, y pasan por alto algunos o todos /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confo /etc/gai.conf.

[1] y ni siquiera mencione el no reentrante, solo ipv4 gethostbyname(), que fue obsoleto desde hace siglos.

Tio billy
fuente
Gracias. ¿Qué quiere decir "no reentrante"?
Tim
1
Significa que si está haciendo un google = GHBN("google.com"); facebook = GHBN("facebook.com")puede terminar con ambos googley facebookcontener la dirección de facebook.com. Cuando las dos llamadas se realizan en subprocesos diferentes, es aún más divertido: puede terminar con una dirección que es mitad google y mitad facebook o basura completa.
Tío Billy
¿Qué ha reemplazado gethostbyname()ahora?
Tim
1
getaddrinfoes la función estándar para eso, pero es en sí misma brokrn, como ya expliqué, por lo que no se usa como lo hacen los navegadores u otras aplicaciones de la vida real.
Tío Billy
De hecho, Firefox y Chrome usan sus propias resoluciones, por ejemplo. Gracias por las notas perspicaces.
Rui F Ribeiro
6

El archivo /etc/hostsy el DNS no funcionan juntos. Proporcionan resoluciones independientes de nombres (nombres de red).

El pegamento que los une está dentro /etc/nsswitch.confde los sistemas Linux . En el /etc/netsvc.confcaso de los servidores AIX, en el sistema para Windows y podría aparecer en la lista con lookupd -configuration(buscar LookupOrder, similar a:) Cache FF DNS NI DSen sistemas MacOS.

El orden real se vuelve complejo y generalmente complicado, ya que cada servicio de resolución de nombres podría (y muchas veces lo hace) mirar dentro de otros niveles de resolución. Me gusta dnsmasq(un servidor DNS ligero en general 127.0.0.1:53, o ::1:53(o ambos)) generalmente lee e incluye el /etc/hostscontenido del archivo. O como systemd.resolver(un solucionador básico que solo debe resolver nombres sin puntos como mycomputer) llama directamente a las resoluciones DNS para nombres con puntos ( mycomputer.here.dev.) en algunas condiciones.

En general, los servicios se llaman en orden y el primero que no falla gana y se acepta como la dirección correcta. El orden básico general es: /etc/hosts(archivo), mDNS (nombres sin puntos), DNS, NIS, NIS +, LDAP. En algunos sistemas Linux hay una resolución de último recurso para la computadora hostnameen el serviciomyhostname

Por ejemplo, en este sistema (desde cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Tenga en cuenta que los muy viejos (glibc 2.4 y anteriores) orderde entrada set en/etc/host.conf como:

order hosts,bind,nis

Solo se aplica al /etc/hostsservicio de nombres de archivos (archivo ).

Los efectos en esta computadora cliente (linux) relacionados con NIS y LDAP son (generalmente) controlados por el servidor DNS utilizado (enlace, desvinculado, etc.).

entonces:

  1. Si un nombre de host puede resolverse en / etc / hosts, ¿se aplica DNS después de / etc / hosts para resolver el nombre de host o trata la dirección IP resuelta por / etc / hosts como un "nombre de host" para resolver de forma recursiva?

Ninguna.

Si se puede resolver un nombre de host /etc/hosts, DNSno se aplica (si los archivos son anteriores a DNS).

ni la dirección IP resuelta se trata como un "nombre de host".

Simplemente es: la dirección resuelta.

navegador

Un navegador podría usar cualquier método para resolver un nombre (después de haber verificado su caché de nombres resueltos). Solo si utiliza un método proporcionado por el sistema, se aplica el orden indicado anteriormente. El navegador, como cualquier programa, podría elegir contactar a cualquier servidor DNS directamente.

Si el orden del sistema lo ha hecho /etc/hostsantes DNS, significa que una entrada en ese archivo tendrá prioridad sobre el DNSservicio de resolución.

Entonces:

  1. ... ¿Significa que / etc / hosts anula el DNS para resolver nombres de host?

Sí (si el navegador usa la resolución proporcionada por el sistema).

¿Por qué no /etc/hostsvolver a presentar una solicitud para no poder conectarme al sitio web?

Solo hasta que el caché interno del navegador se borre (o se agote el tiempo de espera) para ese nombre específico, ese nombre se buscará nuevamente fuera del navegador.

Si el navegador tiene un nombre resuelto en su caché, el navegador lo usa nuevamente.

Use esto para borrar el caché .

O simplemente cierre (espere un momento) y reinicie el navegador.

Isaac
fuente