/etc/hosts e /etc/resolv.conf: Entendendo a Prioridade de Resolucao DNS

/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:

  1. Verificar /etc/hosts — se uma correspondencia for encontrada, retornar imediatamente
  2. 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/hosts
  • mdns4_minimal = mDNS (Avahi) para dominios .local
  • dns = 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 resposta

Formato 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 hosts resolve mas dig / nslookup nao -> entrada existe em /etc/hosts
  • Nenhum resolve -> problema na configuracao DNS ou no resolv.conf
  • Ubuntu: edicoes em /etc/resolv.conf perdidas apos reinicializacao -> gerenciado pelo systemd-resolved; use resolvectl para mudancas persistentes

Proxima Leitura