Quem lê o /etc/resolv.conf?

16

Meu servidor Centos 7 não resolve nomes de domínio corretamente. Pelo que vejo, nos sistemas Linux modernos, /etc/resolv.confmuitas vezes é gerado com dhclient, dnsmasqou Network Manager.

Portanto, tenho uma pergunta teórica geral sobre a pilha de rede nos Linux modernos:

Quem é responsável pela leitura /etc/resolv.conf? Quais players (serviços ou subsistemas de kernel) estão envolvidos na resolução de nomes de domínio?

RESPOSTA RESUMIDA: O manual do Arch linux diz que a configuração de alto nível da resolução de nomes de domínio é feita /etc/nsswitch.conf e depende da glibcAPI do Name Service Switch .

glibcusa a nss-resolvefunção para enviar solicitações de DNS para servidores DNS.

Normalmente, nos sistemas CentOS modernos, o serviço nss-resolve depende systemd-resolved . Se /etc/resolv.conffoi gerado por algo como dhclient-script, systemd-resolvedlê-o e funciona em um modo de compatibilidade, emulando o comportamento de sistemas mais antigos como o BINDcliente DNS.

Boris Burkov
fonte

Respostas:

20

Bibliotecas de clientes DNS fazem.

As bibliotecas C contêm clientes DNS que agrupam as pesquisas de nome para endereço no protocolo DNS e as entregam a servidores DNS proxy para executar todo o trabalho pesado da resolução de consultas. Existem muitos desses clientes DNS. A que está na principal biblioteca de tempo de execução C do seu sistema operacional provavelmente será a do BIND do ISC. Mas há muitos outros da dnsbiblioteca de Daniel J. Bernstein, do c-ares ao adns.

Embora vários deles contenham seus próprios mecanismos de configuração nativos, eles geralmente têm um modo de compatibilidade da biblioteca BIND onde leem resolv.conf, que é o arquivo de configuração da biblioteca cliente BIND C do ISC.

O NSS é colocado em camadas e é configurado por nsswitch.conf. Uma das coisas que as pesquisas do NSS podem chamar internamente é o cliente DNS e nsswitch.confé lido pelo código NSS na biblioteca C para determinar se e onde as pesquisas são entregues ao cliente DNS e como lidar com as várias respostas.

(Existe uma ligeira complicação nessa idéia causada pelo Name Services Cache Dæmon, nscd. Mas isso simplesmente adiciona um cliente de camada superior extra na biblioteca C, falando um protocolo idiossincrático a um servidor local, que por sua vez atua como um Cliente DNS que fala o protocolo DNS para um servidor DNS proxy. systemd-resolvedAdiciona complicações semelhantes.)

systemd-resolved, NetworkManager, connman, dhcpcd, resolvconf, E outros ajustar o arquivo de configuração do cliente DNS BIND para clientes interruptor de DNS para falar com diferentes servidores de DNS de proxy na mosca. Isso está fora do escopo desta resposta, especialmente porque há muitas respostas neste site da WWW que já lidam com os detalhes bizantinos que esse mecanismo envolve.

A maneira mais tradicional de fazer as coisas no mundo Unix é executar um servidor DNS proxy na própria máquina ou em uma LAN. Daí o que o manual do FreeBSD diz sobre sistemas normalmente configurados, onde a ação padrão da biblioteca cliente DNS, na ausência de, resolv.confcorresponde ao que os administradores de sistema Unix normalmente possuem, que é um servidor DNS proxy que escuta em 127.0.0.1. (O manual do FreeBSD para resolv.confna verdade é um documento que também se origina do BIND do ISC e, é claro, também pode ser encontrado onde a biblioteca cliente DNS do BIND foi incorporada em outros locais, como a biblioteca GNU C.)

Leitura adicional

JdeBP
fonte
7

Na melhor página do manual do 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.
Roubar
fonte
1

O arquivo /etc/resolv.confé lido por chamadas * libc que executam a resolução de nomes de host. Isto é principalmentegetaddrinfo e obsoleto gethostbyname.

Se essas funções receberem um nome DNS, elas farão o seguinte na seguinte ordem:

  1. Tente resolver o nome do host localmente, ou seja, lendo /etc/hosts .
  2. Se isso falhar, consulte os servidores DNS listados em /etc/resolv.conf .
  3. Se isso também falhar, o nome do host não poderá ser resolvido.

Desde que você mencionou o dnsmasq : este é um servidor DNS que é executado localmente. Portanto, em muitas distribuições modernas do Linux, os /etc/resolv.confúnicos pontos a apontar 127.0.0.1(é aqui que o dnsmasq local ouve). O dnsmasq é então configurado para encaminhar as consultas aos servidores DNS da Internet; O dnsmasq é configurado pelo Network Manager ao se conectar à Internet.

rexkogitans
fonte
Essas não são chamadas de sistema, são funções * libc.
precisa saber é o seguinte
@ JoshuaRLi certeza, eu editei.
Rexkogitans 22/03/19