Esto está dictado por la configuración de NSS (Conmutador de servicio de nombres), es decir, /etc/nsswitch.conf
hosts
del archivo directiva. Por ejemplo, en mi sistema:
hosts: files mdns4_minimal [NOTFOUND=return] dns
Aquí, files
se refiere al /etc/hosts
archivo, y dns
se refiere al sistema DNS. Y como puedes imaginar lo que llegue primero gana .
Además, consulte man 5 nsswitch.conf
para tener más idea sobre esto.
Aparte, para seguir los pedidos de resolución de host de NSS, use getent
con hosts
como base de datos, por ejemplo:
getent hosts example.com
Para responder solo a tu última pregunta:/etc/hosts
no se aplica de nuevo inmediatamente porque firefox
está almacenando en caché el último nombre de host que obtuvo para google.com
; si desea que siempre vuelva a buscarlo, deberá establecer network.dnsCacheExpiration
a 0
en about:config
. Más información (aunque un poco desactualizada) aquí. Lo siento si esto está fuera de tema.
Como nota al margen, muchos programas no usan el resolver estándar (getaddrinfo(3)
, getnameinfo(3)
[1]) porque apesta .
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 en getaddrinfo_a()
, que está enviando una señal al finalizar, por lo que es aún peor).
En segundo lugar, la implementación del solucionador en glibc
(la biblioteca C estándar en Linux) es horrible, esperando que lo dejes extraer objetos dinámicos aleatorios en el espacio de direcciones a través de dlopen()
a sus espaldas, y haciendo que sea imposible contenerlo de alguna manera o usarlo en ejecutables vinculados estáticamente.
Dado que muchos programas no usan el resolver estándar directamente, tampoco se molestan en replicar su comportamiento exactamente e ignoran algunos o todos los /etc/resolv.conf
, /etc/hosts
, /etc/nsswitch.conf
o /etc/gai.conf
.
[1] y ni siquiera mencione el gethostbyname()
no reentrante y solo ipv4 , que estaba en desuso desde hace mucho tiempo.
El archivo /etc/hosts
y el DNS no funcionan juntos. Proporcionan resoluciones independientes de nombres (nombres de red).
El pegamento que los une está dentro de /etc/nsswitch.conf
para sistemas linux. En /etc/netsvc.conf
para servidores AIX, en el sistema para Windows y podría aparecer en la lista con lookupd -configuration
(busque LookupOrder, similar a:Cache FF DNS NI DS
) en sistemas MacOS.
El orden real se vuelve complejo y, por lo general, intrincado, 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 generalmente en 127.0.0.1:53
o ::1:53
(o ambos)) generalmente lee e incluye el /etc/hosts
contenido del archivo. O como systemd.resolver
(un solucionador básico que solo debería resolver nombres sin puntos como mycomputer
) llama directamente a las resoluciones DNS para nombres con puntos (mycomputer.here.dev.
) bajo 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 existe una resolución de último recurso para la computadora hostname
en el servicio myhostname
Por ejemplo, en este sistema (desde cat /etc/nsswitch
):
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
Tenga en cuenta que el muy antiguo (glibc 2.4 y anterior) order
entrada establecida en /etc/host.conf
como:
order hosts,bind,nis
Solo se aplica a los archivos (archivo /etc/hosts
) servicio de nombres.
Los efectos en esta computadora cliente (Linux) relacionados con NIS y LDAP son (generalmente) controlados por el servidor DNS utilizado (vinculado, desvinculado, etc.).
entonces:
- Si un nombre de host se puede resolver 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?
Ninguno.
Si un nombre de host se puede resolver en /etc/hosts
, el DNS
no se aplica (si los archivos son anteriores a DNS).
ni es la dirección IP resuelta tratada 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 aplicará el orden dado anteriormente. El navegador, como cualquier programa, podría optar por contactar directamente con cualquier servidor DNS.
Si la orden del sistema tiene /etc/hosts
antes de DNS
, significa que una entrada en ese archivo tendrá prioridad sobre DNS
servicio de resolución.
Entonces:
- ... ¿Significa que /etc/hosts anula el DNS para resolver nombres de host?
Sí (si el navegador utiliza la resolución proporcionada por el sistema).
¿Por qué no /etc/hosts
aplicar de nuevo, por lo que no puedo conectarme al sitio web?
Solo hasta que se borre la memoria caché interna del navegador (o se agote el tiempo de espera) para ese nombre específico, ese nombre se buscará fuera del navegador nuevamente.
Si el navegador tiene un nombre resuelto en su caché, el navegador lo utiliza de nuevo.
Use esto para borrar el caché.
O simplemente cierre (espere un momento) y reinicie el navegador.