Meu servidor Centos 7 não resolve nomes de domínio corretamente. Pelo que vejo, em sistemas Linux modernos /etc/resolv.conf
geralmente é gerado com dhclient
, dnsmasq
ou Network Manager
.
Assim, 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 CURTA: 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 glibc
API Name Service Switch.
glibc
usa nss-resolve
função para enviar solicitações de DNS para servidores DNS.
Normalmente, em sistemas CentOS modernos, nss-resolve
depende do systemd-resolved
serviço. Se /etc/resolv.conf
foi gerado por algo como dhclient-script
, systemd-resolved
lê e funciona em modo de compatibilidade, emulando o comportamento de sistemas mais antigos como BIND
o cliente DNS.
As bibliotecas de cliente DNS sim.
As bibliotecas C contêm clientes DNS que encerram pesquisas de nome para endereço no protocolo DNS e as entregam a servidores DNS proxy para fazer todo o trabalho pesado de resolução de consultas. Existem muitos desses clientes DNS. O que está na biblioteca de tempo de execução C principal do seu sistema operacional provavelmente será o do BIND do ISC. Mas há um monte de outros da
dns
biblioteca de Daniel J. Bernstein através de c-ares para adns.Embora vários deles contenham seus próprios mecanismos de configuração nativos, eles geralmente têm um modo de compatibilidade de biblioteca BIND onde eles lêem
resolv.conf
, que é o arquivo de configuração para a biblioteca cliente BIND C do ISC.O NSS está em camadas sobre isso e é configurado pelo
nsswitch.conf
. Uma das coisas que as pesquisas NSS podem invocar internamente é o cliente DNS ensswitch.conf
é lida 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.(Há uma pequena complicação nessa ideia causada pelo Name Services Cache Daemon, nscd. Mas isso simplesmente adiciona um cliente extra de camada superior na biblioteca C, falando um protocolo idiossincrático para um servidor local, que por sua vez atua como um Cliente DNS falando o protocolo DNS para um servidor DNS proxy.
systemd-resolved
adiciona complicações semelhantes.)systemd-resolved
,NetworkManager
,connman
,dhcpcd
,resolvconf
e outros ajustam o arquivo de configuração do cliente DNS BIND para alternar clientes DNS para conversar com diferentes servidores DNS proxy em tempo real. 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 proxy DNS 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.conf
correspondências com o que os administradores de sistema Unix normalmente têm, que é um servidor DNS proxy escutando em 127.0.0.1. (O manual do FreeBSDresolv.conf
é na verdade doco que também se origina do BIND do ISC e, claro, também pode ser encontrado onde a biblioteca do cliente DNS do BIND foi incorporada em outros lugares, como a biblioteca GNU C.)Leitura adicional
dns
biblioteca . cr.yp.to.Da página de manual do FreeBSD muito melhor, resolv.conf :
O arquivo
/etc/resolv.conf
é lido por chamadas *libc que executam a resolução do nome do host. Isso é principalmentegetaddrinfo
e o obsoletogethostbyname
.Se essas funções receberem um nome DNS, elas farão essas coisas na seguinte ordem:
/etc/hosts
./etc/resolv.conf
.Desde que você mencionou dnsmasq : Este é um servidor DNS que é executado localmente. Então, em muitas distribuições Linux modernas, o
/etc/resolv.conf
único ponto para127.0.0.1
(é onde o dnsmasq local escuta). O dnsmasq é então configurado para encaminhar as consultas aos servidores DNS da Internet; dnsmasq é configurado pelo Network Manager ao se conectar à Internet.