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

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

O Que Voce Vai Alcancar

  • Ler e escrever nameserver / search / options em /etc/resolv.conf
  • Explicar a resolucao estatica 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 resolucao de nomes com host / dig

Este e o nucleo do objetivo 109.4 do LPIC-1 "Configurar DNS do lado do cliente". Uma vez que voce entenda quais arquivos sao consultados e em que ordem, pode isolar a maioria dos problemas de conectividade.

Em Que Ordem a Resolucao do Cliente Acontece?

A resolucao de nomes comeca quando uma aplicacao 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.

Estagio Fonte Funcao
1. Ordem /etc/nsswitch.conf A linha hosts: decide a ordem files / dns
2. Estatico /etc/hosts Mapeamento manual IP<->hostname (decisivo se corresponder antes do DNS)
3. DNS /etc/resolv.conf O nameserver a consultar e os dominios de search

Portanto, quando "o resultado de getent hosts difere do DNS", as primeiras coisas a suspeitar sao a ordem em nsswitch.conf e as entradas em /etc/hosts. A relacao desses tres arquivos e primordial no exame e na pratica.

getent hosts retorna o resultado atraves 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 e o arquivo de configuracao do resolver. Suas principais diretivas sao nameserver (o IP a consultar), search (dominios 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), sao as seguintes.

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

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

Em muitas distribuicoes, /etc/resolv.conf e gerado automaticamente e sobrescrito pelo NetworkManager ou systemd-resolved. Edicoes manuais podem desaparecer no reboot ou em alteracoes de conexao. Faca configuracoes permanentes na fonte geradora (descrito abaixo).

/etc/hosts e /etc/nsswitch.conf

/etc/hosts mapeia enderecos IP para hostnames estaticamente. A linha hosts: em /etc/nsswitch.conf decide se essa definicao estatica ou o DNS e 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 e "IP_address canonical_hostname aliases...". Cada linha lista um IP e seu hostname mais aliases, separados por espaco em branco. Como resolve imediatamente sem DNS, e 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: e a ordem de consulta. Esta configuracao tenta files (/etc/hosts) primeiro, depois dns (os servidores em /etc/resolv.conf). Como files vem primeiro, uma correspondencia em /etc/hosts significa que o DNS nao e consultado. Em sistemas com systemd voce pode ver resolve (o modulo 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 fixacoes em /etc/hosts funcionem. A ordem e uma fonte classica de comportamento inesperado, entao sempre verifique esta linha ao solucionar problemas.

Verificando com getent / host / dig

getent consulta bancos de dados NSS (hosts / passwd / group, etc.) atraves de nsswitch.conf. host / dig consultam o servidor DNS diretamente. Usar ambos permite isolar se um problema esta 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 tambem pode consultar bancos de dados como passwd / group / services (ex: getent passwd root). Esta saida e a mais proxima do que uma aplicacao 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, voce pode especificar o servidor explicitamente e consultar um servidor especifico sem passar por /etc/resolv.conf.

O padrao de isolamento e este contraste. getent hosts X funciona mas dig X falha -> esta sendo resolvido por /etc/hosts. dig X funciona mas getent hosts X falha -> um problema de ordem no nsswitch.conf ou modulo NSS.

Configurando systemd-resolved

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

Verificar estado e resolucao 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 dominios de busca por link. resolvectl query NAME resolve um nome atraves 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 sao mostrados por resolvectl status.

A relacao 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 secao [Resolve] de /etc/systemd/resolved.conf (DNS= / FallbackDNS=) e aplique com systemctl restart systemd-resolved. A pratica correta e 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 reinicializacao do servico ou rede. Faca alteracoes upstream em resolved.conf. Em algumas configuracoes, /etc/resolv.conf e um link simbolico para /run/systemd/resolve/stub-resolv.conf.

O Papel do /etc/host.conf

/etc/host.conf e um arquivo de configuracao legado do resolver; na glibc atual, apenas itens limitados (principalmente multi) sao 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 e decidida por /etc/nsswitch.conf. multi on instrui a retornar todos os IPs quando um unico host tem multiplos IPs em /etc/hosts. E um arquivo mantido por razoes historicas; apenas lembre que o controle de ordem de consulta hoje e feito em nsswitch.conf.

Erros Comuns

A maioria dos problemas de resolucao de nomes tem origem na incompreensao desses arquivos de configuracao. Aqui estao cinco que aparecem frequentemente no exame e na pratica.

  1. Edicoes em resolv.conf desaparecem: NetworkManager / systemd-resolved regeneram o arquivo, entao edicoes manuais sao volateis. Altere na fonte (resolved.conf ou a conexao do NetworkManager).
  2. Incompreensao da ordem do nsswitch.conf: hosts: dns files faz o DNS ter prioridade e ignora fixacoes em /etc/hosts. Coloque files primeiro se quiser que /etc/hosts tenha efeito.
  3. Confundir prioridade hosts vs. DNS: Se /etc/hosts tem uma correspondencia (e files esta primeiro), o DNS nao e consultado. Uma linha obsoleta deixada em hosts e uma causa comum quando voce acha que esta consultando DNS mas nao esta.
  4. Confundir o stub do systemd-resolved com upstream: 127.0.0.53 em /etc/resolv.conf e o stub, nao o upstream real. Confirme o upstream com resolvectl status.
  5. Nao entender a diferenca entre getent e dig: getent hosts inclui /etc/hosts enquanto dig e somente DNS. Uma discordancia e normal e util para isolamento.

Solucao de Problemas

Sintoma: resolv.conf editado reverte imediatamente

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

Verificacao:

ls -l /etc/resolv.conf
resolvectl status

Correcao: 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 conexao.

Sintoma: Apenas um host especifico resolve para um IP antigo

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

Verificacao:

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

Correcao: Corrija ou exclua a linha correspondente em /etc/hosts. A diferenca entre os resultados de getent e dig e a evidencia do envolvimento do hosts.

Sintoma: getent hosts funciona mas dig falha

Causa: O nome esta sendo resolvido por /etc/hosts e nao esta registrado no DNS

Verificacao:

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

Correcao: Se isso e por design, nao ha problema. Para resolver via DNS, remova a linha em /etc/hosts e registre um registro no DNS.

Lista de Verificacao de Conclusao

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

Resumo

Cenario Comando / Arquivo Finalidade
Verificar servidores DNS /etc/resolv.conf Verificar nameserver / search
Resolucao estatica /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 configuracao do systemd-resolved

DNS do lado do cliente e a base das operacoes de rede. Uma vez que voce compreenda a relacao dos tres arquivos (resolv.conf / hosts / nsswitch.conf) e como usar getent / host / dig, pode isolar problemas de resolucao de nomes com confiabilidade.

Proximas 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

Pratica