/etc/hosts e /etc/resolv.conf: Entendendo a Prioridade de Resolução DNS

/etc/hosts e /etc/resolv.conf: Entendendo a Prioridade de Resolução DNS

O Que São /etc/hosts e /etc/resolv.conf?

/etc/hosts é um arquivo local estático que mapeia nomes de host para endereços IP sem envolver o DNS. /etc/resolv.conf configura o resolvedor DNS, especificando quais servidores de nomes consultar. A ordem de resolução — qual fonte é verificada primeiro — é controlada pela linha hosts: no /etc/nsswitch.conf. O padrão é files dns, o que significa que o arquivo hosts tem prioridade sobre o DNS.

Resumo Rápido

Ordem de resolução para hosts: files dns:

  1. Verificar /etc/hosts — se uma correspondência for encontrada, retornar imediatamente
  2. Consultar servidores DNS de /etc/resolv.conf

Como Funciona a Resolução de Nomes?

A resolução de nomes no Linux é gerenciada pelo NSS (Name Service Switch). O arquivo /etc/nsswitch.conf lista as fontes de resolução em ordem de prioridade na entrada hosts:.

$ grep ^hosts /etc/nsswitch.conf
hosts:          files mdns4_minimal [NOTFOUND=return] dns
  • files = /etc/hosts
  • mdns4_minimal = mDNS (Avahi) para domínios .local
  • dns = servidores de nomes definidos em /etc/resolv.conf

Fluxo de resolução:

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 resposta

Formato e Padrões 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 domínio para localhost em desenvolvimento

Um padrão comum ao testar contra um domínio de produção localmente:

# Redirecionar example.com para servidor de desenvolvimento local
127.0.0.1   example.com
127.0.0.1   api.example.com

Bloquear domínios indesejados

Apontar um domínio para 0.0.0.0 impede que conexões o alcancem:

0.0.0.0     ads.example.com

Mudanças em /etc/hosts entram em vigor imediatamente — não é necessário limpar cache DNS.

Configurações de /etc/resolv.conf

Diretivas principais

Diretiva Propósito
nameserver Endereço IP do servidor DNS a consultar (até 3)
search Sufixos de domínio adicionados a hostnames simples (db01 -> db01.example.com)
domain Versão de domínio único 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 é 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 será sobrescrito na próxima reinicialização. 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 é um symlink com ls -la /etc/resolv.conf antes de editá-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 resolução:

# Padrao no Ubuntu
hosts: files mdns4_minimal [NOTFOUND=return] dns

# Consultar DNS primeiro (incomum)
hosts: dns files

Alterar a linha hosts: afeta a resolução de nomes para todas as aplicações no sistema. Registre o valor original antes de fazer mudanças.

Depurando a Resolução de Nomes

getent hosts — resolve através 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

Cenários Práticos

Cenário 1: Apontar um domínio de produção 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 após os testes:

$ sudo sed -i '/api.myapp.com/d' /etc/hosts

Cenário 2: Mudar para um servidor DNS personalizado

Para ambientes onde /etc/resolv.conf não é 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 — Referência Rápida de Resolução de Nomes

Verificação Comando
Ordem de resolução grep ^hosts /etc/nsswitch.conf
Conteúdo do arquivo hosts cat /etc/hosts
Configuração do resolvedor DNS cat /etc/resolv.conf
Verificar se resolv.conf é symlink ls -la /etc/resolv.conf
Configurações DNS (Ubuntu) resolvectl status
Testar resolução incluindo hosts getent hosts <dominio>
Testar apenas DNS dig <dominio>

Solução de problemas comuns

  • getent hosts resolve mas dig / nslookup não -> entrada existe em /etc/hosts
  • Nenhum resolve -> problema na configuração DNS ou no resolv.conf
  • Ubuntu: edições em /etc/resolv.conf perdidas após reinicialização -> gerenciado pelo systemd-resolved; use resolvectl para mudanças persistentes

Próxima Leitura