>_ josetilabs.com
← blog

06 nov 2026 · linux, rede, dns · 4 min

o que é dns, e por que o cache mente para você

DNS traduz nome em IP, mas o caminho tem varias camadas de cache e override. dig pergunta so ao DNS; getent passa por NSS, /etc/hosts e resolv.conf. Cache mente quando o TTL ainda nao expirou.

O que o DNS faz

DNS e um banco de dados distribuido que responde qual IP corresponde a um nome. A pergunta e simples, a resposta nao: entre voce e o servidor autoritativo ha /etc/hosts, nsswitch.conf, resolv.conf, um stub resolver local e caches em varios niveis. Cada um pode devolver uma resposta diferente ou guardar uma resposta velha. Veja resolv.conf(5) e nsswitch.conf(5).

A ordem real da resolucao

Quando um programa chama getaddrinfo(), a glibc segue /etc/nsswitch.conf. Na maioria dos sistemas a linha e:

hosts: files dns

Ou seja: primeiro /etc/hosts, depois DNS. Se /etc/hosts tiver uma entrada para o nome, o DNS nem e consultado. Isso explica por que dig example.com e getent hosts example.com podem dar resultados diferentes: dig ignora /etc/hosts e nsswitch.conf e pergunta direto ao servidor de /etc/resolv.conf.

/etc/resolv.conf

Lista ate 3 nameservers, na ordem. O resolver tenta o primeiro; se ele nao responder (timeout), tenta o segundo. Atencao: se o primeiro responder com NXDOMAIN, isso conta como resposta e o segundo nao e consultado. Um servidor interno quebrado que nega seus nomes internos nao sera resgatado pelo secundario.

O arquivo tambem define search, que acrescenta dominio a nomes curtos. Um nome com menos de ndots (padrao 1) pontos tenta cada sufixo da search list antes de perguntar o nome cru. Isso gera consultas inesperadas e, em ambientes com sufixo publico, risco de man-in-the-middle.

O cache e o TTL

A resposta DNS traz um TTL em segundos. Qualquer cache no caminho (stub resolver, resolvedor recursivo, CDN) pode guardar a resposta por esse tempo. Para saber se voce esta lendo cache, repita a consulta e veja o TTL diminuir: se cai, e cache; se fica igual, e resposta fresca do autoritativo.

bash
# TTL em segundos na resposta
dig +noall +answer example.com @1.1.1.1
# example.com.  183  IN  A  93.184.216.34

Mudou o DNS e nao propagou? Nao e propagacao, e cache expirando. Records nao viajam para fora; caches simplesmente expiram e perguntam de novo. Tudo aparece em todos os lugares dentro de um TTL a partir da ultima busca de cada cache.

O artefato

Script que imprime resolv.conf, nsswitch.conf, testa getent em localhost e nome inexistente, checa se dig esta disponivel e simula cache com TTL.

bash
#!/usr/bin/env bash
set -u

echo "== 1. /etc/resolv.conf (o que o resolver le) =="
if [ -r /etc/resolv.conf ]; then
  ls -l /etc/resolv.conf
  cat /etc/resolv.conf
else
  echo "arquivo ausente: glibc usa apenas 127.0.0.1 e o dominio local"
fi

echo

echo "== 2. /etc/nsswitch.conf (a ordem real) =="
if [ -r /etc/nsswitch.conf ]; then
  grep -E '^[[:space:]]*hosts:' /etc/nsswitch.conf || echo "sem linha hosts:; glibc usa 'files dns'"
else
  echo "arquivo ausente: glibc usa padrao 'files dns'"
fi

echo

echo "== 3. getent hosts (passa pelo NSS, como um app de verdade) =="
for nome in localhost example.invalid; do
  printf '%-20s -> ' "$nome"
  getent hosts "$nome" || echo "(sem resposta)"
done

echo

echo "== 4. dig (so DNS, ignora /etc/hosts e nsswitch) =="
if command -v dig >/dev/null 2>&1; then
  dig +short example.com A | head -3
else
  echo "dig nao instalado neste ambiente (apt install dnsutils)."
  echo "no seu sistema: dig example.com A"
fi

echo

echo "== 5. simulacao de cache com TTL =="
CACHE=/tmp/dns-cache.txt
echo "example.com 93.184.216.34 60" > "$CACHE"
agora=$(date +%s)
expira=$((agora + 60))
echo "gravado: example.com -> 93.184.216.34, expira em $expira"
# primeira consulta: cache hit
if grep -q '^example.com' "$CACHE"; then
  echo "consulta 1: cache HIT (nao foi ao DNS)"
fi
# segunda consulta apos 'expirar' o TTL
sleep 1
agora2=$(date +%s)
if [ "$agora2" -ge "$expira" ]; then
  echo "consulta 2: cache EXPIROU, vai ao DNS de novo"
else
  echo "consulta 2: ainda no TTL, cache HIT (faltam $((expira - agora2))s)"
fi
echo "limpando cache"
rm -f "$CACHE"
echo "pronto."

Como verificar

Rode o script. A saida deve mostrar a ordem files dns, o localhost resolvendo via /etc/hosts e example.invalid sem resposta. Se dig estiver instalado, ele imprime um IP de example.com. A simulacao mostra cache hit e o countdown do TTL.

Se der errado

FAQ

dig e getent dão respostas diferentes, qual esta certo? Depende do que voce quer testar. Para saber o que um aplicativo vai experimentar, use getent ou resolvectl. Para saber o que o DNS contem, use dig.

O que e TTL e quem define? O servidor autoritativo define, em segundos. Caches respeitam esse valor (ou menos, nunca mais).

Por que o segundo nameserver nao salvou? Porque o primeiro respondeu, mesmo que com NXDOMAIN. NXDOMAIN e resposta, nao falha.

Posso desligar o cache? Voce pode baixar o TTL, mas nao desligar o cache do stub resolver sem alterar a configuracao do resolvedor. Em systemd-resolved, resolvectl flush-caches limpa.

search e domains, qual a diferenca? search acrescenta sufixo a nomes curtos; domain define o dominio local. Use search para multiplos sufixos, domain para um so.

Figura

Diagrama mostrando a ordem da resolução: aplicação chama getaddrinfo, NSS lê nsswitch.conf, files consulta /etc/hosts, dns consulta /etc/resolv.conf, cache devolve ou encaminha, servidor autoritativo responde
Ordem real de uma resolucao: cada camada pode responder ou passar adiante. dig pula as tres primeiras.

Fontes: resolv.conf(5), nsswitch.conf(5), dig(1). Veja tambem o handshake TLS passo a passo e processos, portas e conexoes.

Leia também

// Por e-mail

Os textos publicados aqui também vão por e-mail. O envio ainda não começou: quem deixar o endereço agora entra na primeira lista.

Guardo só o seu e-mail, a data e o registro desta autorização. Sem cookies, sem rastreador e nada compartilhado com terceiros. Detalhes na política de privacidade.