DNS do Lado do Cliente: resolv.conf, hosts e getent
O Que Você Vai Alcançar
- Ler e escrever
nameserver/search/optionsem/etc/resolv.conf - Explicar a resolução estática 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 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.
- 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.confou a conexão do NetworkManager). - Incompreensão da ordem do nsswitch.conf:
hosts: dns filesfaz o DNS ter prioridade e ignora fixações em/etc/hosts. Coloquefilesprimeiro se quiser que/etc/hoststenha efeito. - Confundir prioridade hosts vs. DNS: Se
/etc/hoststem uma correspondência (efilesestá 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á. - Confundir o stub do systemd-resolved com upstream:
127.0.0.53em/etc/resolv.confé o stub, não o upstream real. Confirme o upstream comresolvectl status. - Não entender a diferença entre getent e dig:
getent hostsinclui/etc/hostsenquantodigé 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.