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.
# 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.
#!/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
- getent resolve mas dig nao: o nome esta em /etc/hosts ou no cache local. Use dig para ver o que o DNS diz de verdade.
- dig resolve mas getent nao: /etc/hosts tem uma entrada negativa ou nsswitch esta sem
dns. Confira a linha hosts. - Mudou o DNS e nada mudou: cache com TTL longo. Aguarde o TTL ou reinicie o resolvedor local (systemd-resolved, nscd). Nao edite resolv.conf manualmente sem checar se e symlink.
- resolv.conf voltou ao original apos reboot: NetworkManager ou DHCP reescreveu. Configure via NetworkManager ou netplan.
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
Fontes: resolv.conf(5), nsswitch.conf(5), dig(1). Veja tambem o handshake TLS passo a passo e processos, portas e conexoes.