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.

RCODE ≠ ROOT CAUSE

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.

OBSERVE ↓ CLASSIFY ↓ HYPOTHESIZE ↓ VALIDATE
El síntoma es evidencia, no diagnóstico. Un NXDOMAIN puede ser válido, un SERVFAIL puede tener múltiples causas y una consulta sin respuesta no significa automáticamente que el servidor DNS esté caído.

3.2 NXDOMAIN

NXDOMAIN indica que la respuesta DNS contiene RCODE = 3. En Wireshark podemos localizar estas respuestas con:

dns.flags.rcode == 3
Respuesta NXDOMAIN en Wireshark con Reply code No such name 3
Wireshark muestra el resultado NXDOMAIN como Reply code 3.

Encontrar un NXDOMAIN responde qué respondió DNS, pero no explica todavía por qué ocurrió.

Posibles explicaciones

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
ONE NXDOMAIN ≠ DNS FAILURE
ONE NXDOMAIN ≠ ATTACK

Preguntas de troubleshooting

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
Respuesta SERVFAIL en Wireshark con Reply code Server failure 2
Una respuesta SERVFAIL indica que la resolución no pudo completarse.

SERVFAIL no identifica por sí solo la causa. Puede aparecer, por ejemplo, cuando:

SERVFAIL ≠ DNS SERVER DOWN
¿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.

NOERROR + 0 Answers ≠ NXDOMAIN
NOERROR + 0 Answers ≠ DNS FAILURE

Qué debemos preguntar

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.

QUERY → ? ≠ DNS SERVER DOWN

Posibles explicaciones

¿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.

Wireshark mostrando el campo dns.time entre una consulta DNS y su respuesta
Wireshark muestra el tiempo entre Query y Response mediante el campo dns.time. En este ejemplo se observan 196.829 ms; el valor por sí solo no determina que exista un problema.

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.

SLOW RESPONSE ≠ SERVER FAILURE

Posibles explicaciones

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
CORRECT RESPONSE ≠ ACCEPTABLE RESPONSE TIME

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:

WHO → WHAT → WHERE → RESPONSE → RESULT → TIME
Dimensión Evidencia
WHO172.16.20.145
WHATapp.example.com / A / IN
WHERE172.16.20.11:53
RESPONSEsin respuesta correlacionada
RESULTno disponible
TIMEno aplica

Eso describe qué observamos, pero todavía no explica por qué ocurrió.

OBSERVE ↓ CLASSIFY ↓ HYPOTHESIZE ↓ VALIDATE

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.

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.
SYMPTOM → EVIDENCE → HYPOTHESIS → VALIDATION → ROOT CAUSE

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”.

Ir al laboratorio integrado del Bloque 3 ↓

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:

WHO → WHAT → WHERE → RESPONSE → RESULT → TIME

y:

OBSERVATION ↓ INTERPRETATION ↓ HYPOTHESIS ↓ NEXT TEST

Antes de comenzar

Necesitarás:

  • dig instalado;
  • Wireshark;
  • conectividad de red;
  • una interfaz de captura identificada;
  • permiso para capturar tráfico en tu workstation.
Utilizaremos 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

Query ↓ Response ↓ 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.
NXDOMAIN no significa que DNS esté caído. De hecho, recibir NXDOMAIN demuestra que existió una respuesta DNS.

Escenario 2 — No Response

Ahora realizaremos una prueba completamente diferente.

Ejecuta:

dig @192.0.2.1 example.com A +time=2 +tries=1
¿Qué hacen +time y +tries?

+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.

Query ↓ ?

Dependiendo del entorno, podrías observar únicamente la Query DNS o también mensajes de red generados por otros componentes.

Lo importante es no inventar una Response DNS cuando no existe. La ausencia de respuesta también es evidencia.

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:

WHERE → Resolver

Compara

1.1.1.1 8.8.8.8
Response ¿? ¿?
RCODE ¿? ¿?
Answers ¿? ¿?
TTL ¿? ¿?
Time ¿? ¿?
No esperamos necesariamente que uno falle. El objetivo es aprender a comparar evidencia después de modificar una sola variable.

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:

UDP ↔ TCP

En Wireshark identifica qué transporte utilizó cada transacción y compara:

  • Response;
  • Result;
  • Time.
La pregunta no es cuál transporte es “mejor”. La pregunta es si cambiar una variable modifica el comportamiento.

Desafío final — No adivines

Para una de las transacciones observadas, completa mentalmente o por escrito:

OBSERVATION ↓ INTERPRETATION ↓ HYPOTHESIS ↓ NEXT TEST

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:

RCODE ≠ Root Cause

y utilizar:

EVIDENCE ↓ HYPOTHESIS ↓ NEXT TEST

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.
EVENT ≠ PATTERN