Diagnóstico y resolución de fallos DNS
Introducción
Los fallos de resolución DNS son uno de los problemas más frecuentes en administración de sistemas: el servicio está activo pero no se puede acceder por nombre. Con un método sistemático y las herramientas adecuadas, se diagnostican en minutos.
Metodología de diagnóstico
Sigue este orden para aislar el problema:
# 1. ¿Hay conectividad IP básica?
ping -c 3 8.8.8.8 # si falla → problema de red, no de DNS
# 2. ¿El propio nombre de máquina resuelve?
hostname -f
ping -c 1 $(hostname)
# 3. ¿/etc/hosts tiene algo que interfiera?
grep nombre-a-resolver /etc/hosts
# 4. ¿Qué servidor DNS está configurado?
cat /etc/resolv.conf
resolvectl status # si hay systemd-resolved
# 5. ¿El servidor DNS responde?
dig @$(awk '/^nameserver/{print $2; exit}' /etc/resolv.conf) google.com +short
# 6. ¿La resolución falla solo para un dominio concreto?
dig nombre-problemático.com # consulta al resolver local
dig @8.8.8.8 nombre-problemático.com # consulta a DNS público
# 7. ¿Cuál es el orden de resolución?
grep ^hosts /etc/nsswitch.conf
Seguir la cadena completa con dig +trace
Muestra la delegación desde los root servers hasta el servidor autoritativo, sin usar caché ni resolver local. Útil para detectar problemas de propagación o configuración de zona:
dig +trace google.com
# Verás la cadena completa:
# . (root) → .com (TLD) → google.com (autoritativo) → respuesta final
Problemas comunes y soluciones
1. /etc/resolv.conf vacío o con servidor incorrecto
# Síntoma: dig falla, ping por IP funciona
cat /etc/resolv.conf # comprobar si hay nameserver
# Solución temporal (se pierde al reiniciar en sistemas gestionados)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# Solución persistente en Ubuntu con Netplan:
# añadir nameservers en /etc/netplan/xx.yaml y ejecutar:
sudo netplan apply
2. systemd-resolved caído o con caché corrupta
systemctl status systemd-resolved
systemctl restart systemd-resolved
resolvectl flush-caches
3. Entrada incorrecta en /etc/hosts
# Síntoma: un nombre resuelve a la IP equivocada
grep nombre /etc/hosts
# Si existe una entrada errónea, editarla o eliminarla:
sudo nano /etc/hosts
4. El servidor DNS interno no resuelve nombres públicos
# Comparar resolución interna vs. externa
dig nombre.empresa.com # usa el DNS configurado
dig @8.8.8.8 nombre.empresa.com # usa DNS público
# Si el DNS interno no reenvía consultas externas (forwarders),
# solo resolverá los nombres de la zona interna
5. El TTL de la caché da respuestas antiguas
# Ver el TTL restante en la respuesta de dig
dig google.com | grep -A5 'ANSWER SECTION'
# El número antes de IN es el TTL en segundos
# Limpiar la caché de systemd-resolved
resolvectl flush-caches
resolvectl statistics # verificar que Cache Size bajó a 0
6. Orden de resolución incorrecto en nsswitch.conf
# Síntoma: /etc/hosts no tiene efecto
cat /etc/nsswitch.conf | grep ^hosts
# Si dice "dns files" en vez de "files dns", /etc/hosts queda ignorado
# Corrección: editar y poner "files dns" primero
Resumen de comandos de diagnóstico
dig nombre.com # consulta al resolver del sistema
dig +short nombre.com # solo la IP de respuesta
dig @8.8.8.8 nombre.com # consulta a un DNS específico
dig +trace nombre.com # traza completa desde root servers
dig -x 1.2.3.4 # resolución inversa
host nombre.com # consulta rápida
nslookup nombre.com # compatible con entornos Windows
resolvectl query nombre.com # consulta a systemd-resolved
resolvectl status # estado del resolver y DNS por interfaz
resolvectl flush-caches # limpiar caché DNS
cat /etc/resolv.conf # servidor DNS configurado
grep ^hosts /etc/nsswitch.conf # orden de resolución
grep nombre /etc/hosts # entradas locales estáticas