DNS do Lado do Cliente: resolv.conf, hosts e getent

DNS do Lado do Cliente: resolv.conf, hosts e getent

O Que Você Vai Alcançar

  • Ler e escrever nameserver / search / options em /etc/resolv.conf
  • Explicar a resolução estática via /etc/hosts e sua prioridade sobre o DNS
  • Controlar a ordem de consulta (files dns) na linha hosts: de /etc/nsswitch.conf
  • Consultar bancos de dados NSS de forma abrangente com getent
  • Entender o systemd-resolved (resolvectl e o stub resolver 127.0.0.53)
  • Isolar problemas de resolução de nomes com host / dig

Este é o núcleo do objetivo 109.4 do LPIC-1 "Configurar DNS do lado do cliente". Uma vez que você entenda quais arquivos são consultados e em que ordem, pode isolar a maioria dos problemas de conectividade.

Em Que Ordem a Resolução do Cliente Acontece?

A resolução de nomes começa quando uma aplicação chama getaddrinfo() da GNU C Library (glibc), e a linha hosts: em /etc/nsswitch.conf decide as fontes e sua ordem. Se files (/etc/hosts) vem antes de dns, o arquivo hosts tem prioridade sobre o DNS.

Estágio Fonte Função
1. Ordem /etc/nsswitch.conf A linha hosts: decide a ordem files / dns
2. Estático /etc/hosts Mapeamento manual IP<->hostname (decisivo se corresponder antes do DNS)
3. DNS /etc/resolv.conf O nameserver a consultar e os domínios de search

Portanto, quando "o resultado de getent hosts difere do DNS", as primeiras coisas a suspeitar são a ordem em nsswitch.conf e as entradas em /etc/hosts. A relação desses três arquivos é primordial no exame e na prática.

getent hosts retorna o resultado através de nsswitch.conf (tanto hosts quanto DNS), enquanto host / dig consultam o servidor DNS diretamente. Quando os dois discordam, suspeite do envolvimento de /etc/hosts.

Configurando /etc/resolv.conf

/etc/resolv.conf é o arquivo de configuração do resolver. Suas principais diretivas são nameserver (o IP a consultar), search (domínios a adicionar) e options.

nameserver / search / domain / options

cat /etc/resolv.conf
nameserver 192.168.1.1
nameserver 8.8.8.8
search example.com lan
options timeout:2 attempts:3

As principais diretivas, conforme man resolv.conf(5), são as seguintes.

Diretiva Significado
nameserver IP Servidor DNS a consultar. Até 3 (MAXNS), tentados de cima para baixo
search dom1 dom2 Lista de domínios a adicionar a nomes curtos (ex: web -> web.example.com)
domain name Nome do domínio local. Mutuamente exclusivo com search; o último prevalece
options name Ajustar comportamento do resolver (timeout:n / attempts:n / rotate / ndots:n)

Se ambos search e domain estiverem presentes, o último a aparecer é usado (man resolv.conf(5)). ndots:n é o limiar: nomes com menos de n pontos são tratados como relativos e recebem search.

Em muitas distribuições, /etc/resolv.conf é gerado automaticamente e sobrescrito pelo NetworkManager ou systemd-resolved. Edições manuais podem desaparecer no reboot ou em alterações de conexão. Faça configurações permanentes na fonte geradora (descrito abaixo).

/etc/hosts e /etc/nsswitch.conf

/etc/hosts mapeia endereços IP para hostnames estaticamente. A linha hosts: em /etc/nsswitch.conf decide se essa definição estática ou o DNS é consultado primeiro.

O formato do /etc/hosts

cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost
192.168.1.50    web.example.com web

Conforme man hosts(5), o formato é "IP_address canonical_hostname aliases...". Cada linha lista um IP e seu hostname mais aliases, separados por espaço em branco. Como resolve imediatamente sem DNS, é muito usado para fixar nomes para testes e desenvolvimento local.

A linha hosts: do nsswitch.conf

grep hosts /etc/nsswitch.conf
hosts:          files dns

O valor de hosts: é a ordem de consulta. Esta configuração tenta files (/etc/hosts) primeiro, depois dns (os servidores em /etc/resolv.conf). Como files vem primeiro, uma correspondência em /etc/hosts significa que o DNS não é consultado. Em sistemas com systemd você pode ver resolve (o módulo NSS do systemd-resolved nss-resolve), como em files resolve [!UNAVAIL=return] dns.

Escrever hosts: como dns files faz o DNS ter prioridade e impede que fixações em /etc/hosts funcionem. A ordem é uma fonte clássica de comportamento inesperado, então sempre verifique esta linha ao solucionar problemas.

Verificando com getent / host / dig

getent consulta bancos de dados NSS (hosts / passwd / group, etc.) através de nsswitch.conf. host / dig consultam o servidor DNS diretamente. Usar ambos permite isolar se um problema está no lado hosts ou no lado DNS.

Consultar NSS com getent

getent hosts web.example.com
getent hosts 8.8.8.8
192.168.1.50    web.example.com web
8.8.8.8         dns.google

getent hosts NAME segue a linha hosts: do nsswitch.conf e retorna o resultado final combinando /etc/hosts e DNS. getent também pode consultar bancos de dados como passwd / group / services (ex: getent passwd root). Esta saída é a mais próxima do que uma aplicação realmente resolve.

Consultar DNS diretamente com host / dig

host example.com
dig example.com A +short
example.com has address 93.184.216.34
93.184.216.34

host NAME faz uma consulta direta e host IP faz uma consulta reversa. dig NAME A consulta o registro A, e +short extrai apenas a resposta. Com @server, como em dig @8.8.8.8 example.com, você pode especificar o servidor explicitamente e consultar um servidor específico sem passar por /etc/resolv.conf.

O padrão de isolamento é este contraste. getent hosts X funciona mas dig X falha -> está sendo resolvido por /etc/hosts. dig X funciona mas getent hosts X falha -> um problema de ordem no nsswitch.conf ou módulo NSS.

Configurando systemd-resolved

systemd-resolved é um serviço do sistema que fornece resolução de nomes de rede. Ele escuta como stub resolver em 127.0.0.53, e /etc/resolv.conf é frequentemente gerado apontando para este endereço. Verifique o estado e configure com resolvectl.

Verificar estado e resolução com resolvectl

resolvectl status
resolvectl query example.com
Global
       Protocols: -LLMNR +mDNS ...
Link 2 (eth0)
    DNS Servers: 192.168.1.1
     DNS Domain: example.com

example.com: 93.184.216.34

resolvectl status mostra os servidores DNS atuais e domínios de busca por link. resolvectl query NAME resolve um nome através do resolved. Note que sob o systemd-resolved, o nameserver em /etc/resolv.conf se torna 127.0.0.53 (o stub resolver), e os servidores upstream reais são mostrados por resolvectl status.

A relação entre resolved.conf e resolv.conf

cat /etc/resolv.conf
grep -v '^#' /etc/systemd/resolved.conf
nameserver 127.0.0.53
options edns0 trust-ad
search example.com

[Resolve]
DNS=192.168.1.1
FallbackDNS=8.8.8.8

Especifique o DNS upstream permanente na seção [Resolve] de /etc/systemd/resolved.conf (DNS= / FallbackDNS=) e aplique com systemctl restart systemd-resolved. A prática correta é editar este arquivo gerador em vez de /etc/resolv.conf diretamente.

Sob o systemd-resolved, reescrever 127.0.0.53 em /etc/resolv.conf para um IP real reverte na reinicialização do serviço ou rede. Faça alterações upstream em resolved.conf. Em algumas configurações, /etc/resolv.conf é um link simbólico para /run/systemd/resolve/stub-resolv.conf.

O Papel do /etc/host.conf

/etc/host.conf é um arquivo de configuração legado do resolver; na glibc atual, apenas itens limitados (principalmente multi) são significativos. O centro do controle de ordem de consulta migrou para nsswitch.conf.

cat /etc/host.conf
multi on

Conforme man host.conf(5), a glibc ignora a linha order, e a ordem de consulta é decidida por /etc/nsswitch.conf. multi on instrui a retornar todos os IPs quando um único host tem múltiplos IPs em /etc/hosts. É um arquivo mantido por razões históricas; apenas lembre que o controle de ordem de consulta hoje é feito em nsswitch.conf.

Erros Comuns

A maioria dos problemas de resolução de nomes tem origem na incompreensão desses arquivos de configuração. Aqui estão cinco que aparecem frequentemente no exame e na prática.

  1. Edições em resolv.conf desaparecem: NetworkManager / systemd-resolved regeneram o arquivo, então edições manuais são voláteis. Altere na fonte (resolved.conf ou a conexão do NetworkManager).
  2. Incompreensão da ordem do nsswitch.conf: hosts: dns files faz o DNS ter prioridade e ignora fixações em /etc/hosts. Coloque files primeiro se quiser que /etc/hosts tenha efeito.
  3. Confundir prioridade hosts vs. DNS: Se /etc/hosts tem uma correspondência (e files está primeiro), o DNS não é consultado. Uma linha obsoleta deixada em hosts é uma causa comum quando você acha que está consultando DNS mas não está.
  4. Confundir o stub do systemd-resolved com upstream: 127.0.0.53 em /etc/resolv.conf é o stub, não o upstream real. Confirme o upstream com resolvectl status.
  5. Não entender a diferença entre getent e dig: getent hosts inclui /etc/hosts enquanto dig é somente DNS. Uma discordância é normal e útil para isolamento.

Solução de Problemas

Sintoma: resolv.conf editado reverte imediatamente

Causa: NetworkManager ou systemd-resolved gera automaticamente e sobrescreve /etc/resolv.conf

Verificação:

ls -l /etc/resolv.conf
resolvectl status

Correção: Sob o systemd-resolved, edite DNS= em /etc/systemd/resolved.conf e execute systemctl restart systemd-resolved. Sob o NetworkManager, defina DNS no perfil de conexão.

Sintoma: Apenas um host específico resolve para um IP antigo

Causa: Uma entrada obsoleta permanece em /etc/hosts e, com files primeiro, corresponde antes do DNS

Verificação:

getent hosts target.example.com
grep target.example.com /etc/hosts
dig target.example.com +short

Correção: Corrija ou exclua a linha correspondente em /etc/hosts. A diferença entre os resultados de getent e dig é a evidência do envolvimento do hosts.

Sintoma: getent hosts funciona mas dig falha

Causa: O nome está sendo resolvido por /etc/hosts e não está registrado no DNS

Verificação:

grep name /etc/hosts
grep hosts /etc/nsswitch.conf

Correção: Se isso é por design, não há problema. Para resolver via DNS, remova a linha em /etc/hosts e registre um registro no DNS.

Lista de Verificação de Conclusão

  • [ ] Verificou nameserver / search com cat /etc/resolv.conf
  • [ ] Verificou a ordem de consulta com grep hosts /etc/nsswitch.conf
  • [ ] Verificou o resultado real da resolução com getent hosts NAME
  • [ ] Isolou consultando DNS diretamente com host / dig
  • [ ] Sob o systemd-resolved, confirmou upstream com resolvectl status

Resumo

Cenário Comando / Arquivo Finalidade
Verificar servidores DNS /etc/resolv.conf Verificar nameserver / search
Resolução estática /etc/hosts Fixar IP<->hostname
Controlar a ordem /etc/nsswitch.conf A ordem hosts: files dns
Verificar resultado real getent hosts NAME Resultado final via NSS
Consultar DNS diretamente host / dig Consultar o servidor DNS diretamente
Gerenciar resolved resolvectl / resolved.conf Estado e configuração do systemd-resolved

DNS do lado do cliente é a base das operações de rede. Uma vez que você compreenda a relação dos três arquivos (resolv.conf / hosts / nsswitch.conf) e como usar getent / host / dig, pode isolar problemas de resolução de nomes com confiabilidade.

Próximas Leituras

Continue Sua Jornada LPIC-1

Hub LPIC-1

  • Hub de Aprendizado LPIC-1 -- Mapa completo de artigos LPIC-1, acompanhamento de progresso e cobertura dos objetivos do exame

Artigos LPIC-1 Relacionados

Prática