Bloque 3 — Troubleshooting real: RCODE ≠ Root Cause
Objetivo del Bloque 3
Ir al laboratorio práctico del Bloque 3 ↓
Analizar transacciones DNS que no producen el resultado esperado y utilizar la evidencia disponible para formular hipótesis de troubleshooting.
Durante este bloque aprenderemos a distinguir entre diferentes síntomas —como NXDOMAIN, SERVFAIL, respuestas vacías, consultas sin respuesta o respuestas lentas— sin asumir que el síntoma observado identifica por sí solo la causa del problema.
Un código de respuesta nos dice qué resultado produjo DNS. El troubleshooting comienza cuando preguntamos:
¿Por qué produjo ese resultado?
3.1 Cuando una transacción DNS no se comporta como esperamos
Hasta ahora hemos trabajado con una transacción sencilla:
QUERY → RESPONSE
Pero una captura real puede mostrar situaciones diferentes:
QUERY → NXDOMAIN
QUERY → SERVFAIL
QUERY → NOERROR / 0 Answers
QUERY → ?
QUERY ─────────────→ RESPONSE
demasiado tiempo
Todas representan comportamientos distintos. Nuestro trabajo no será únicamente reconocerlos, sino investigar qué evidencia tenemos y qué podría explicarlos.
3.2 NXDOMAIN
NXDOMAIN indica que la respuesta DNS contiene RCODE = 3.
En Wireshark podemos localizar estas respuestas con:
dns.flags.rcode == 3
Encontrar un NXDOMAIN responde qué respondió DNS, pero no explica todavía por qué ocurrió.
Posibles explicaciones
- el nombre realmente no existe;
- el usuario escribió mal el nombre;
- una aplicación generó un nombre incorrecto;
- existe un problema relacionado con un sufijo de búsqueda;
- algún proceso está generando nombres automáticamente.
Por eso debemos observar la transacción completa antes de formular una hipótesis.
WHO 172.16.20.145
WHAT host123.example.com / A
WHERE 172.16.20.11
RESULT NXDOMAIN
Preguntas de troubleshooting
- ¿El nombre consultado es correcto?
- ¿El cliente preguntó al resolver esperado?
- ¿El mismo nombre produce el mismo resultado desde otro resolver?
- ¿La respuesta realmente contiene RCODE 3?
- ¿Existe alguna diferencia entre el nombre esperado y el observado?
NXDOMAIN describe el resultado. El troubleshooting comienza cuando investigamos por qué ese nombre produjo ese resultado.
3.3 SERVFAIL
SERVFAIL corresponde a RCODE = 2. En Wireshark podemos
localizar estas respuestas con:
dns.flags.rcode == 2
SERVFAIL no identifica por sí solo la causa. Puede aparecer, por ejemplo, cuando:
- el resolver no logra completar la resolución;
- existe un problema con un servidor autoritativo;
- ocurre un timeout durante la recursión;
- hay un problema de delegación;
- falla una validación DNSSEC.
¿En qué parte del proceso de resolución falló la consulta?
Qué observar
WHO ¿Quién hizo la consulta?
WHAT ¿Qué nombre y tipo fueron consultados?
WHERE ¿Qué resolver respondió?
RESULT SERVFAIL
TIME ¿La respuesta llegó inmediatamente o después de una espera?
Un SERVFAIL inmediato y uno que aparece después de varios segundos pueden orientar investigaciones diferentes.
OBSERVATION
Resolver responde SERVFAIL
↓
HYPOTHESIS
El resolver recibió la consulta,
pero no pudo completar la resolución
↓
VALIDATE
Comparar con otro resolver
Revisar autoritativos
Revisar delegación
Revisar DNSSEC
SERVFAIL nos dice que la resolución falló. El troubleshooting debe descubrir dónde y por qué.
3.4 NODATA
NODATA puede parecer similar a NXDOMAIN, pero representa una situación diferente.
Podemos localizar respuestas de este tipo con:
dns.flags.rcode == 0 && dns.count.answers == 0
| Resultado | Significado |
|---|---|
| NXDOMAIN | El nombre no existe. |
| NODATA | El nombre existe, pero no hay información del tipo solicitado. |
Ejemplo
Supongamos que existe:
host.example.com AAAA 2001:db8::10
pero preguntamos:
host.example.com A
El servidor puede responder:
RCODE: NOERROR
Answers: 0
Eso no significa necesariamente que haya un problema. El nombre existe, pero no tiene un registro del tipo solicitado.
Qué debemos preguntar
- ¿El nombre existe?
- ¿Qué QTYPE solicitó el cliente?
- ¿Existe otro tipo de registro para ese nombre?
- ¿La aplicación esperaba A, AAAA u otro tipo?
NODATA no significa que el nombre no exista; significa que no existe información del tipo solicitado.
3.5 Consultas sin respuesta
Una consulta sin respuesta visible en la captura puede localizarse con:
dns.flags.response == 0 && !dns.response_in
Encontrar una Query sin respuesta correlacionada no significa automáticamente que el servidor DNS esté caído.
Posibles explicaciones
- el servidor realmente no respondió;
- hubo pérdida de paquetes;
- un firewall bloqueó la consulta o la respuesta;
- existe un problema de routing;
- la captura dejó fuera parte de la transacción;
- la respuesta tomó una ruta que no estamos capturando.
¿Tenemos evidencia suficiente para afirmar que el servidor no respondió?
Qué observar
WHO ¿Quién hizo la consulta?
WHAT ¿Qué nombre y tipo fueron consultados?
WHERE ¿A qué servidor se envió?
RESPONSE No existe respuesta correlacionada en la captura
TIME ¿Cuánto tiempo abarca la captura después de la Query?
OBSERVATION
Query enviada a 172.16.20.11
No existe Response In
↓
HYPOTHESIS
La respuesta no llegó al cliente
o no fue observada en este punto de captura
↓
VALIDATE
Revisar conectividad
Revisar firewall
Comparar con otra captura
Probar otro resolver
Una consulta sin respuesta es evidencia de una transacción incompleta, no una prueba automática de que el servidor DNS esté caído.
3.6 Slow Responding Name Servers
Una transacción puede producir una respuesta correcta y aun así provocar un problema si tarda demasiado.
QUERY ───────────────────────── RESPONSE
latency
Para nuestro análisis nos interesa medir cuánto tiempo pasó entre una Query y su Response correspondiente.
Podemos comparar varias transacciones y buscar aquellas que se alejan del comportamiento habitual.
Transaction A 18 ms
Transaction B 24 ms
Transaction C 21 ms
Transaction D 1.8 s
La transacción D merece atención, pero el tiempo por sí solo no identifica la causa.
Posibles explicaciones
- latencia de red;
- resolución recursiva que necesita consultar varios servidores;
- un servidor autoritativo lento;
- retransmisiones;
- pérdida de paquetes;
- problemas de conectividad aguas arriba;
- carga en el resolver.
OBSERVATION
Response correcta
RCODE = NOERROR
TIME = mucho mayor que otras transacciones
↓
HYPOTHESIS
Existe un problema de latencia durante la resolución
↓
VALIDATE
Comparar otros nombres
Comparar otros resolvers
Revisar dónde aparece la demora
Buscar retransmisiones o pérdida
3.7 Diagnosticar una transacción completa
El último paso es reunir toda la evidencia y construir una hipótesis de troubleshooting.
La investigación comienza organizando la evidencia con el modelo que ya conocemos:
| Dimensión | Evidencia |
|---|---|
| WHO | 172.16.20.145 |
| WHAT | app.example.com / A / IN |
| WHERE | 172.16.20.11:53 |
| RESPONSE | sin respuesta correlacionada |
| RESULT | no disponible |
| TIME | no aplica |
Eso describe qué observamos, pero todavía no explica por qué ocurrió.
OBSERVE
Registrar lo que realmente aparece en la captura, sin interpretar todavía.
Query enviada
No existe Response In
CLASSIFY
Identificar el tipo de comportamiento observado.
NXDOMAIN
SERVFAIL
NODATA
SIN RESPUESTA
RESPUESTA LENTA
HYPOTHESIZE
Proponer una explicación posible. Una hipótesis todavía no es una conclusión.
VALIDATE
Buscar evidencia adicional que confirme o descarte la hipótesis.
- repetir la consulta;
- probar otro resolver;
- comparar con otra captura;
- revisar conectividad o firewall;
- revisar servidores autoritativos;
- comparar tiempos de respuesta.
Ejemplo completo
OBSERVATION
Query: app.example.com / A
Resolver: 172.16.20.11
Response: SERVFAIL
Time: 2.4 s
↓
CLASSIFICATION
SERVFAIL + response time high
↓
HYPOTHESIS
El resolver recibió la consulta,
pero tuvo dificultades para completar
la resolución aguas arriba
↓
VALIDATION
Consultar otro resolver
Revisar servidores autoritativos
Revisar delegación
Revisar conectividad aguas arriba
El objetivo del troubleshooting no es encontrar rápidamente una etiqueta para el problema. Es construir una explicación respaldada por evidencia.
Lab 2 — Todo falla, pero no de la misma manera
En el laboratorio aplicaremos este método para comparar distintos comportamientos que, desde la perspectiva del usuario, podrían parecer simplemente “DNS no funciona”.
En el Bloque 4 cambiaremos la unidad de análisis: dejaremos de observar únicamente transacciones individuales y comenzaremos a buscar patrones entre muchas transacciones DNS.
Laboratorio práctico — Bloque 3
Compara NXDOMAIN, ausencia de respuesta y cambios de resolver sin confundir síntoma con causa.
Objetivo del laboratorio
Comparar distintos comportamientos DNS que desde la perspectiva de un usuario podrían parecer simplemente:
“DNS no funciona”.
Utilizaremos dig y Wireshark para demostrar que errores
aparentemente similares pueden producir evidencia completamente distinta.
Durante el laboratorio aplicaremos dos modelos:
y:
Antes de comenzar
Necesitarás:
diginstalado;- Wireshark;
- conectividad de red;
- una interfaz de captura identificada;
- permiso para capturar tráfico en tu workstation.
192.0.2.1 en uno de los escenarios.
Esta dirección pertenece al bloque TEST-NET-1 reservado para
documentación y pruebas.
Preparar Wireshark
Inicia una captura en la interfaz desde la que tu equipo tiene conectividad.
Aplica primero este Display Filter:
dns
Mantén la captura activa mientras realizas las pruebas.
Escenario 1 — NXDOMAIN
Nuestro primer escenario será una consulta hacia un nombre que sabemos que no debe existir.
Ejecuta:
dig @1.1.1.1 nombre-inexistente-lab.invalid A
El TLD .invalid está reservado precisamente para nombres
que deben considerarse inválidos.
Qué esperamos encontrar
NXDOMAIN
Si quieres aislar únicamente respuestas NXDOMAIN, utiliza:
dns.flags.rcode == 3
Investiga la transacción
| Elemento | Tu evidencia |
|---|---|
| WHO | Source IP del cliente |
| WHAT | QNAME / QTYPE |
| WHERE | Resolver consultado |
| RESPONSE | ¿Existe una Response? |
| RESULT | RCODE |
| TIME | Tiempo Query ↔ Response |
Ahora interpreta la evidencia
| Observation | La Query recibió una Response con RCODE NXDOMAIN. |
|---|---|
| Interpretation | El resolver sí respondió. No estamos observando ausencia de servicio DNS. |
| Hypothesis | El nombre consultado no existe en la resolución realizada. |
| Next Test | Validar el nombre o realizar una consulta diferente para comprobar que el resolver continúa funcionando. |
Escenario 2 — No Response
Ahora realizaremos una prueba completamente diferente.
Ejecuta:
dig @192.0.2.1 example.com A +time=2 +tries=1
+time=2 limita a 2 segundos el tiempo de espera por intento.+tries=1 hace que dig realice un solo intento.Las utilizamos para que una prueba diseñada para no recibir respuesta termine rápidamente.
En este caso estamos enviando la consulta hacia una dirección reservada para documentación y no esperamos obtener una respuesta DNS normal.
Qué buscamos en Wireshark
Localiza la Query correspondiente.
Después busca su Response.
Dependiendo del entorno, podrías observar únicamente la Query DNS o también mensajes de red generados por otros componentes.
Analiza
| Observation | Se observa una Query DNS, pero no una Response DNS correspondiente. |
|---|---|
| Interpretation | No tenemos evidencia de que el resolver consultado haya respondido. |
| Hypothesis | Podría existir un problema de reachability, filtrado, pérdida, servicio o simplemente un destino que no presta DNS. |
| Next Test | Consultar un resolver conocido y comparar el resultado. |
Comparación — NXDOMAIN vs No Response
Ahora compara los dos primeros escenarios.
| Evidencia | NXDOMAIN | No Response |
|---|---|---|
| Query visible | Sí | Sí |
| Response visible | Sí | No necesariamente |
| RCODE | NXDOMAIN | No existe RCODE observable sin Response |
| El resolver respondió | Sí | No tenemos evidencia de respuesta |
| Conocemos la Root Cause | No necesariamente | No |
Ambos escenarios pueden ser descritos por un usuario como “DNS no funciona”, pero la evidencia es completamente diferente.
Escenario 3 — Cambiar una sola variable
Una técnica básica de troubleshooting consiste en cambiar una sola variable y comparar.
Primero consulta Cloudflare:
dig @1.1.1.1 example.com A
Después consulta Google:
dig @8.8.8.8 example.com A
Hemos mantenido:
Cliente
QNAME
QTYPE
y cambiamos únicamente:
Compara
| 1.1.1.1 | 8.8.8.8 | |
|---|---|---|
| Response | ¿? | ¿? |
| RCODE | ¿? | ¿? |
| Answers | ¿? | ¿? |
| TTL | ¿? | ¿? |
| Time | ¿? | ¿? |
Escenario 4 — UDP vs TCP
Este escenario es opcional si el tiempo del workshop es limitado.
Primero ejecuta una consulta normal:
dig @1.1.1.1 example.com A
Después ejecuta exactamente la misma consulta utilizando TCP:
dig +tcp @1.1.1.1 example.com A
Hemos conservado:
WHO
WHAT
WHERE
y cambiamos:
En Wireshark identifica qué transporte utilizó cada transacción y compara:
- Response;
- Result;
- Time.
Desafío final — No adivines
Para una de las transacciones observadas, completa mentalmente o por escrito:
Antes de escribir una Root Cause, pregúntate:
¿La evidencia realmente demuestra esa causa o solamente la hace posible?
Resultado esperado
Al terminar este laboratorio deberás poder distinguir claramente entre:
y utilizar:
como parte de un proceso de troubleshooting reproducible.
Siguiente paso
En este laboratorio analizamos transacciones individuales para comprender por qué un resultado no equivale automáticamente a una causa.
En el Bloque 4 cambiaremos nuevamente la escala del análisis.
Un paquete puede parecer normal. El patrón puede contar otra historia.