DNS do Lado do Cliente: resolv.conf, hosts e getent
O Que Voce Vai Alcancar
- Ler e escrever
nameserver/search/optionsem/etc/resolv.conf - Explicar a resolucao estatica via
/etc/hostse sua prioridade sobre o DNS - Controlar a ordem de consulta (
files dns) na linhahosts:de/etc/nsswitch.conf - Consultar bancos de dados NSS de forma abrangente com
getent - Entender o
systemd-resolved(resolvectle o stub resolver127.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.
- Edicoes em resolv.conf desaparecem: NetworkManager / systemd-resolved regeneram o arquivo, entao edicoes manuais sao volateis. Altere na fonte (
resolved.confou a conexao do NetworkManager). - Incompreensao da ordem do nsswitch.conf:
hosts: dns filesfaz o DNS ter prioridade e ignora fixacoes em/etc/hosts. Coloquefilesprimeiro se quiser que/etc/hoststenha efeito. - Confundir prioridade hosts vs. DNS: Se
/etc/hoststem uma correspondencia (efilesesta 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. - Confundir o stub do systemd-resolved com upstream:
127.0.0.53em/etc/resolv.confe o stub, nao o upstream real. Confirme o upstream comresolvectl status. - Nao entender a diferenca entre getent e dig:
getent hostsinclui/etc/hostsenquantodige 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.