/etc/hosts e /etc/resolv.conf: Entendendo a Prioridade de Resolucao DNS
O Que Sao /etc/hosts e /etc/resolv.conf?
/etc/hosts e um arquivo local estatico que mapeia nomes de host para enderecos IP sem envolver o DNS. /etc/resolv.conf configura o resolvedor DNS, especificando quais servidores de nomes consultar. A ordem de resolucao — qual fonte e verificada primeiro — e controlada pela linha hosts: no /etc/nsswitch.conf. O padrao e files dns, o que significa que o arquivo hosts tem prioridade sobre o DNS.
Resumo Rapido
Ordem de resolucao para hosts: files dns:
- Verificar
/etc/hosts— se uma correspondencia for encontrada, retornar imediatamente - Consultar servidores DNS de
/etc/resolv.conf
Como Funciona a Resolucao de Nomes?
A resolucao de nomes no Linux e gerenciada pelo NSS (Name Service Switch). O arquivo /etc/nsswitch.conf lista as fontes de resolucao em ordem de prioridade na entrada hosts:.
$ grep ^hosts /etc/nsswitch.conf hosts: files mdns4_minimal [NOTFOUND=return] dns
files=/etc/hostsmdns4_minimal= mDNS (Avahi) para dominios.localdns= servidores de nomes definidos em/etc/resolv.conf
Fluxo de resolucao:
Aplicacao chama getaddrinfo("example.com")
|
1. Buscar em /etc/hosts
-> Correspondencia encontrada: retornar IP imediatamente
-> Sem correspondencia: continuar
|
2. Consultar resolvedor DNS (nameserver em /etc/resolv.conf)
-> Retornar respostaFormato e Padroes de Uso de /etc/hosts
Formato do arquivo
endereco-IP hostname [aliases ...]
$ cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 myhost.local myhost ::1 localhost ip6-localhost ip6-loopback
Redirecionar um dominio para localhost em desenvolvimento
Um padrao comum ao testar contra um dominio de producao localmente:
# Redirecionar example.com para servidor de desenvolvimento local 127.0.0.1 example.com 127.0.0.1 api.example.com
Bloquear dominios indesejados
Apontar um dominio para 0.0.0.0 impede que conexoes o alcancem:
0.0.0.0 ads.example.com
Mudancas em /etc/hosts entram em vigor imediatamente — nao e necessario limpar cache DNS.
Configuracoes de /etc/resolv.conf
Diretivas principais
| Diretiva | Proposito |
|---|---|
nameserver |
Endereco IP do servidor DNS a consultar (ate 3) |
search |
Sufixos de dominio adicionados a hostnames simples (db01 -> db01.example.com) |
domain |
Versao de dominio unico de search (legado) |
$ cat /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 search example.com
Nota sobre Ubuntu — systemd-resolved
No Ubuntu 20.04 e posterior, /etc/resolv.conf geralmente e um symlink para um stub gerenciado pelo systemd-resolved:
$ ls -la /etc/resolv.conf lrwxrwxrwx 1 root root 39 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
Editar o alvo do symlink diretamente sera sobrescrito na proxima reinicializacao. Use resolvectl em vez disso:
# Mostrar configuracao DNS atual $ resolvectl status # Definir DNS para uma interface especifica $ resolvectl dns eth0 8.8.8.8
Verifique se /etc/resolv.conf e um symlink com ls -la /etc/resolv.conf antes de edita-lo. Se for um symlink, use resolvectl em vez de editar diretamente.
Controlando a Prioridade com /etc/nsswitch.conf
Edite a linha hosts: em /etc/nsswitch.conf para alterar a ordem de resolucao:
# Padrao no Ubuntu hosts: files mdns4_minimal [NOTFOUND=return] dns # Consultar DNS primeiro (incomum) hosts: dns files
Alterar a linha hosts: afeta a resolucao de nomes para todas as aplicacoes no sistema. Registre o valor original antes de fazer mudancas.
Depurando a Resolucao de Nomes
getent hosts — resolve atraves do nsswitch.conf
dig e nslookup consultam o DNS diretamente, ignorando /etc/hosts. Use getent hosts quando precisar confirmar o que o sistema operacional realmente resolve.
# Resolver usando a cadeia completa do nsswitch.conf (incluindo /etc/hosts) $ getent hosts example.com 93.184.216.34 example.com # Verificar se uma entrada de /etc/hosts esta funcionando $ getent hosts myapp.local 127.0.0.1 myapp.local
# Apenas DNS (ignora /etc/hosts) $ dig example.com $ nslookup example.com # Cadeia de resolucao completa (inclui /etc/hosts) $ getent hosts example.com
resolvectl — inspecionar estado do systemd-resolved
# Mostrar servidores DNS e dominios de busca por interface $ resolvectl status # Testar resolucao para um dominio especifico $ resolvectl query example.com
Cenarios Praticos
Cenario 1: Apontar um dominio de producao para localhost
# Adicionar entrada em /etc/hosts $ sudo sh -c 'echo "127.0.0.1 api.myapp.com" >> /etc/hosts' # Verificar $ getent hosts api.myapp.com 127.0.0.1 api.myapp.com
Remova a entrada apos os testes:
$ sudo sed -i '/api.myapp.com/d' /etc/hosts
Cenario 2: Mudar para um servidor DNS personalizado
Para ambientes onde /etc/resolv.conf nao e gerenciado pelo systemd-resolved:
$ sudo nano /etc/resolv.conf # Adicionar ou alterar nameserver 1.1.1.1 # Cloudflare DNS nameserver 8.8.8.8 # Google DNS
Verificar:
$ dig @1.1.1.1 example.com
Resumo — Referencia Rapida de Resolucao de Nomes
| Verificacao | Comando |
|---|---|
| Ordem de resolucao | grep ^hosts /etc/nsswitch.conf |
| Conteudo do arquivo hosts | cat /etc/hosts |
| Configuracao do resolvedor DNS | cat /etc/resolv.conf |
| Verificar se resolv.conf e symlink | ls -la /etc/resolv.conf |
| Configuracoes DNS (Ubuntu) | resolvectl status |
| Testar resolucao incluindo hosts | getent hosts <dominio> |
| Testar apenas DNS | dig <dominio> |
Solucao de problemas comuns
getent hostsresolve masdig/nslookupnao -> entrada existe em/etc/hosts- Nenhum resolve -> problema na configuracao DNS ou no
resolv.conf - Ubuntu: edicoes em
/etc/resolv.confperdidas apos reinicializacao -> gerenciado pelosystemd-resolved; useresolvectlpara mudancas persistentes