¿Quién lee /etc/resolv.conf?


16

Mi servidor Centos 7 no resuelve los nombres de dominio correctamente. Por lo que veo, en los sistemas Linux modernos /etc/resolv.confa menudo es generado con dhclient, dnsmasqo Network Manager.

Por lo tanto, tengo una pregunta teórica general sobre la pila de red en Linux modernos:

¿Quién es responsable de la lectura? /etc/resolv.conf ? ¿Qué jugadores (servicios o subsistemas del núcleo) están involucrados en la resolución de nombres de dominio?

RESPUESTA CORTA: El manual de Arch Linux dice que la configuración de alto nivel de la resolución de nombres de dominio se realiza en /etc/nsswitch.conf y se basa en la glibcAPI de cambio de servicio de nombres .

glibcutiliza la nss-resolvefunción para enviar solicitudes DNS a servidores DNS.

Normalmente, los sistemas CentOS modernos nss-resolve dependen del systemd-resolved servicio. Si /etc/resolv.conffue generado por algo así dhclient-script, lo systemd-resolvedlee y funciona en modo de compatibilidad, emulando el comportamiento de sistemas más antiguos como el BINDcliente DNS.

Respuestas:


20

Las bibliotecas de cliente DNS lo hacen.

Las bibliotecas C contienen clientes DNS que envuelven búsquedas de nombre a dirección en el protocolo DNS y las entregan a servidores DNS proxy para hacer todo el trabajo de resolución de consultas. Hay muchos de estos clientes DNS. El que está en la biblioteca principal de tiempo de ejecución C de su sistema operativo muy probablemente sea el de BIND de ISC. Pero hay una gran cantidad de otros de Daniel J. Bernsteindns biblioteca través de c-ares a adns.

Aunque varios de ellos contienen sus propios mecanismos de configuración nativos, generalmente tienen un modo de compatibilidad de biblioteca BIND donde leen resolv.conf , que es el archivo de configuración para la biblioteca de cliente BIND C de ISC.

El NSS se superpone a esto y está configurado por nsswitch.conf. Una de las cosas que las búsquedas de NSS pueden invocar internamente es el cliente DNS, ynsswitch.conf el código NSS lo lee en la biblioteca C para determinar si las búsquedas se entregan al cliente DNS y dónde y cómo lidiar con las diversas respuestas.

(Hay una pequeña complicación a esta idea causada por el Name Services Cache Dæmon, nscd. Pero esto simplemente agrega un cliente de capa superior adicional en la biblioteca C, hablando un protocolo idiosincrásico a un servidor local, que a su vez actúa como un El cliente DNS que habla el protocolo DNS a un servidor DNS proxy systemd-resolvedagrega complicaciones similares).

systemd-resolved` NetworkManager` connman` dhcpcd`resolvconf , Y otros ajustar el archivo de configuración del cliente DNS BIND DNS a los clientes interruptor para hablar, en diferentes servidores DNS de proxy sobre la marcha. Esto está fuera del alcance de esta respuesta, especialmente porque hay muchas respuestas en este sitio WWW que ya se ocupan de los detalles bizantinos que implica dicho mecanismo.

La forma más tradicional de hacer las cosas en el mundo de Unix es ejecutar un servidor DNS proxy en la máquina o en una LAN. De ahí lo que dice el manual de FreeBSD sobre los sistemas configurados normalmente, donde la acción predeterminada de la biblioteca del cliente DNS en ausencia de resolv.confcoincide con lo que normalmente tienen los administradores del sistema Unix, que es un servidor DNS proxy que escucha en 127.0.0.1. (El manual de FreeBSD resolv.confes en realidad doco que también se origina en BIND de ISC, y por supuesto también se puede encontrar donde la biblioteca de cliente DNS de BIND se ha incorporado en otros lugares, como la biblioteca GNU C).

Otras lecturas


7

Desde la página de manual de FreeBSD, resolv.conf :

 The resolver configuration file contains information that is read by the
 resolver routines the first time they are invoked by a process.

 On a normally configured system this file should not be necessary.  The
 only name server to be queried will be on the local machine, the domain
 name is determined from the host name, and the domain search path is
 constructed from the domain name.

1

El archivo /etc/resolv.confse lee mediante llamadas * libc que realizan una resolución de nombre de host. Esto es principalmente getaddrinfoy en desuso gethostbyname.

Si estas funciones pasan un nombre DNS, entonces hacen estas cosas en el siguiente orden:

  1. Intente resolver el nombre de host localmente, es decir, leyendo /etc/hosts.
  2. Si esto falla, consulte los servidores DNS enumerados en /etc/resolv.conf.
  3. Si esto también falla, entonces el nombre de host no se puede resolver.

Como menciona dnsmasq : este es un servidor DNS que se ejecuta localmente. Entonces, en muchas distribuciones modernas de Linux, los /etc/resolv.confúnicos puntos son 127.0.0.1(aquí es donde escucha el dnsmasq local). dnsmasq se configura para reenviar las consultas a los servidores DNS de Internet; dnsmasq es configurado por Network Manager al conectarse a Internet.


Esas no son llamadas del sistema, esas son funciones * libc.
JoshuaRLi

@JoshuaRLi seguro, lo edité.
rexkogitans
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.