Monitorización SNMP del servidor DNS en Windows Server: por qué el DNS‑Server‑MIB no funciona y alternativas soportadas

¿Intentas sondear por SNMP un servidor DNS de Windows y siempre recibes “No Such Object available on this agent at this OID”? No te falta ningún paso oculto: el agente SNMP nativo de Windows no publica el DNS‑Server‑MIB del IETF. Aquí tienes el porqué y cómo monitorizarlo correctamente (con o sin SNMP).

Índice

Diagnóstico rápido

Síntoma: consultas snmpget/snmpwalk a OIDs del DNS‑Server‑MIB (p. ej. 1.3.6.1.2.1.32.1.1.3.2 para contar respuestas “no name”/NXDOMAIN) devuelven No Such Object en Windows Server 2012 R2/2016/2019/2022 con el rol DNS y la característica SNMP instalados.

Causa: el servicio SNMP nativo de Windows no implementa el DNS‑Server‑MIB ni incluye un proveedor SNMP específico para el rol DNS Server. Solo ofrece MIB‑II básico y algunos contadores de sistema; por tanto, esos OIDs no existen para ese agente.

Conclusión: no estás omitiendo ningún paso. Para obtener métricas de DNS (NXDOMAIN, SERVFAIL, etc.) debes usar interfaces nativas de Windows (PowerShell/PerfMon/Eventos/WMI) o bien añadir un agente SNMP de terceros o un puente SNMP que exponga esas métricas.

¿Por qué ocurre “No Such Object” con el DNS‑Server‑MIB?

SNMP funciona por MIBs (árboles de OIDs). Un agente solo puede responder a OIDs que implemente. El árbol 1.3.6.1.2.1 (mib-2) incluye múltiples módulos estandarizados; el de DNS Server es uno de ellos, pero el agente de Windows no lo carga ni lo soporta. Al consultar un OID inexistente para ese agente, este responde formalmente con No Such Object.

Dato clave: instalar el archivo .mib en tu NMS solo sirve para traducir nombres; no hace que el agente remoto implemente ese MIB. Si el agente no lo expone, el resultado seguirá siendo No Such Object.

Qué sí expone el agente SNMP de Windows (y qué no)

Módulo / áreaSoporte en el agente nativoNotas
MIB‑II (system, interfaces, ip, tcp, udp, snmp)PresenteResponde a 1.3.6.1.2.1.1 (system) y otros básicos.
Host‑Resources‑MIBParcial/LimitadoAlgunos contadores de CPU/mem/almacenamiento pueden estar disponibles.
DNS‑Server‑MIBNoEjemplos como 1.3.6.1.2.1.32.1.1.3.2 (NXDOMAIN) devuelven No Such Object.
SNMPv3NoEl agente nativo solo soporta v1/v2c; para v3 usa agentes de terceros.
WMI SNMP ProviderNo aplicaEs para que WMI consulte dispositivos SNMP, no para exponer WMI por SNMP.

Opciones de solución

Opción A (recomendada): monitoriza DNS sin SNMP

Aprovecha las interfaces nativas de Windows Server DNS: PowerShell, Contadores de rendimiento (PerfMon), y Eventos. La mayoría de NMS modernos integran WMI/WinRM o agentes propios para recoger estos datos.

PowerShell: estadísticas ricas y soportadas

El módulo DnsServer expone estadísticas del servicio, incluyendo códigos de respuesta (NoError, NameError/NXDOMAIN, ServFail, etc.), tipos de consulta, tráfico UDP/TCP y más.

# Estadísticas completas del servicio DNS
Get-DnsServerStatistics -ComputerName <ServidorDNS> | Format-List *

Para reiniciar contadores y medir por intervalos:

# Poner a cero contadores
Clear-DnsServerStatistics -ComputerName <ServidorDNS>

Esperar X minutos y volver a leer para obtener deltas

Start-Sleep -Seconds 300
Get-DnsServerStatistics -ComputerName \<ServidorDNS> </code></pre>

<h4>PerfMon: contadores en tiempo real</h4>
<p>El objeto de rendimiento <strong>“DNS Server”</strong> expone contadores listos para NMS/colección (consultables con <code>Get-Counter</code>, <code>typeperf</code>, o agentes). Ejemplos frecuentes:</p>
<ul>
  <li>Consultas recibidas totales / por segundo.</li>
  <li>Respuestas NoError/NXDOMAIN/SERVFAIL (según versión/edición).</li>
  <li>Recursiones realizadas / expiradas.</li>
  <li>Tráfico UDP/TCP y uso de caché.</li>
</ul>
<pre><code class="language-powershell"># Ejemplos de consulta de contadores
Get-Counter -Counter '\DNS Server\Total Query Received'
Get-Counter -Counter '\DNS Server\Recursive Queries'
</code></pre>

<h4>Eventos: alertas y diagnósticos</h4>
<p>El canal <em>Microsoft‑Windows‑DNS‑Server</em> registra condiciones operativas: fallos de actualización dinámica, errores de resolución, problemas de zona, etc. Úsalo para alertar sin sondeos frecuentes.</p>
<pre><code class="language-powershell"># Últimos eventos relevantes de DNS
Get-WinEvent -LogName 'Microsoft-Windows-DNS-Server/Audit' -MaxEvents 50 |
  Select-Object TimeCreated, Id, LevelDisplayName, Message
</code></pre>

<h4>Mapa de métricas: cómo obtener lo que SNMP no ofrece</h4>
<table>
  <thead>
    <tr>
      <th>Métrica deseada</th>
      <th>PowerShell</th>
      <th>PerfMon</th>
      <th>Notas</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Respuestas NXDOMAIN</td>
      <td><code>Get-DnsServerStatistics</code> (códigos de respuesta)</td>
      <td>Según versión, contador específico</td>
      <td>Úsalo para detectar fallos de resolución o patrones de abuso.</td>
    </tr>
    <tr>
      <td>Respuestas SERVFAIL</td>
      <td><code>Get-DnsServerStatistics</code></td>
      <td>Depende de contadores expuestos</td>
      <td>Señal temprana de problemas upstream/recursión.</td>
    </tr>
    <tr>
      <td>Consultas por segundo</td>
      <td>Delta de <code>Get-DnsServerStatistics</code></td>
      <td><code>\DNS Server\Total Query Received</code></td>
      <td>Proyecta capacidad y detecta picos.</td>
    </tr>
    <tr>
      <td>Recursiones / timeouts</td>
      <td><code>Get-DnsServerStatistics</code></td>
      <td><code>\DNS Server\Recursive Queries</code></td>
      <td>Clave al operar como recursor.</td>
    </tr>
    <tr>
      <td>Uso de caché</td>
      <td><code>Get-DnsServerCache</code> (consultas puntuales)</td>
      <td>Contadores de aciertos (según versión)</td>
      <td>Evalúa eficacia de caché y TTLs.</td>
    </tr>
  </tbody>
</table>

<h4>Implementación práctica (modelo por intervalos)</h4>
<ol>
  <li>Programa cada 1–5 minutos:
    <ul>
      <li>Leer <code>Get-DnsServerStatistics</code>.</li>
      <li>Calcular el delta respecto a la muestra anterior (p. ej., NXDOMAIN/s).</li>
      <li>Publicar en tu NMS vía WinRM/agent o escribir en archivo/endpoint.</li>
    </ul>
  </li>
  <li>Define umbrales (por ejemplo, NXDOMAIN &gt; 10% del total durante ≥5 min) y notificaciones.</li>
  <li>Complementa con eventos críticos del canal DNS‑Server para alertas inmediatas.</li>
</ol>

<h3>Opción B: necesitas SNMP sí o sí</h3>
<p>Si tu plataforma de monitorización exige SNMP para DNS, tienes tres caminos viables:</p>

<h4>1) Instalar un agente SNMP de terceros que publique métricas de DNS</h4>
<ul>
  <li>Elige un agente que implemente DNS‑Server‑MIB o un MIB propio bien documentado.</li>
  <li>Valida <em>antes</em> de desplegar: haz <code>snmpwalk</code> de prueba y comprueba que existen OIDs para NXDOMAIN, SERVFAIL, QPS, etc.</li>
  <li>Prefiere agentes con soporte SNMPv3 para cifrado y control de acceso robusto.</li>
</ul>

<h4>2) Puente SNMP: Net‑SNMP + PowerShell (rápido y flexible)</h4>
<p>Idea: un servicio intermedio lee estadísticas de DNS (PowerShell/PerfMon) y las expone por SNMP bajo un árbol OID propio.</p>
<ol>
  <li><strong>Instala Net‑SNMP</strong> para Windows en el servidor DNS (o en un proxy cercano).</li>
  <li><strong>Escribe un script</strong> que devuelva las métricas que te interesan (por ejemplo, NXDOMAIN, SERVFAIL, QPS).</li>
  <li><strong>Configura <em>extend</em>/ <em>pass_persist</em> o AgentX</strong> para exponer los valores por SNMP.</li>
</ol>

<h5>Ejemplo mínimo con <em>extend</em> (rápido)</h5>
<p>Con <em>extend</em>, las salidas se publican en el árbol <code>.1.3.6.1.4.1.8072.1.3.2</code> y el NMS las puede leer como texto/enteros simples.</p>
<pre><code class="language-powershell"># C:\Scripts\dns_stats.ps1 (salida simple, una línea = una métrica)
$stats = Get-DnsServerStatistics
Ejemplos de campos (ajusta a tu entorno)
$nxd = $stats.ResponseStats.NameError
$servfail = $stats.ResponseStats.ServerFailure
$total = $stats.Questions
$qps = [math]::Round(($total - (Get-Content C:\Scripts\lasttotal.txt | % { [int]$ })) / 60, 2)
Set-Content C:\Scripts\last_total.txt $total
"NXDOMAIN=$nxd`nSERVFAIL=$servfail`nQPS=$qps"
</code></pre>
<pre><code># snmpd.conf (Net-SNMP)
agentAddress  udp:161
rocommunity   public 127.0.0.1
extend       dnsStats  powershell.exe -NoProfile -File C:\Scripts\dns_stats.ps1
</code></pre>
<p>Consulta desde tu NMS:</p>
<pre><code class="language-bash">snmpwalk -v2c -c public &lt;ip-servidor&gt; 1.3.6.1.4.1.8072.1.3.2.1.2
</code></pre>
<p>Ventaja: implementación rápida. Inconveniente: los valores aparecen como texto; algunos NMS requieren normalizar/parsing.</p>

<h5>Ejemplo con <em>pass_persist</em> (estructurado)</h5>
<p>Para devolver enteros bajo un subárbol propio (por ejemplo <code>.1.3.6.1.4.1.99999.1</code>), usa <em>pass_persist</em> y un script que hable el “protocolo” simple de Net‑SNMP:</p>
<pre><code># snmpd.conf
passpersist .1.3.6.1.4.1.99999.1 powershell.exe -NoProfile -File C:\Scripts\dnssnmp_passpersist.ps1
</code></pre>
<pre><code class="language-powershell"># C:\Scripts\dnssnmppasspersist.ps1 (esqueleto)
$oidBase = '.1.3.6.1.4.1.99999.1'
$map = @{
  "$oidBase.1.0" = @{ name='NXDOMAIN';  getter={ (Get-DnsServerStatistics).ResponseStats.NameError } }
  "$oidBase.2.0" = @{ name='SERVFAIL';  getter={ (Get-DnsServerStatistics).ResponseStats.ServerFailure } }
  "$oidBase.3.0" = @{ name='QPS';       getter={  # calcula QPS desde deltas...
      $now = Get-DnsServerStatistics
      $cur = $now.Questions
      $prev = 0; if (Test-Path C:\Scripts\prev.txt) { $prev = [int](Get-Content C:\Scripts\prev.txt) }
      Set-Content C:\Scripts\prev.txt $cur
      [int](($cur - $prev) / 60)
    } }
}
Bucle: lee órdenes de Net-SNMP por stdin y responde por stdout
$input.ReadLine() | ForEach-Object {
  while ($_) {
    if ($_ -match '^PING$') { Write-Output 'PONG'; break }
    elseif ($_ -match '^get (.+)$') {
      $oid=$Matches[1]; if ($map.ContainsKey($oid)) {
        $val = & ($map[$oid].getter)
        Write-Output "OID $oid"
        Write-Output "TYPE gauge"
        Write-Output "VALUE $val"
      } else { Write-Output 'NONE' }
    }
    elseif ($_ -match '^getnext (.+)$') {
      $next = ($map.Keys | Sort-Object | Where-Object { $_ -gt $Matches[1] } | Select-Object -First 1)
      if ($next) {
        $val = & ($map[$next].getter)
        Write-Output "OID $next"
        Write-Output "TYPE gauge"
        Write-Output "VALUE $val"
      } else { Write-Output 'NONE' }
    }
    $_ = $input.ReadLine()
  }
}
</code></pre>
<p>Ventaja: valores numéricos listos y OIDs estables para gráficos/umbrales. Inconveniente: más trabajo inicial.</p>

<h4>3) Escribir un “SNMP extension agent” (avanzado)</h4>
<p>Windows permite cargar DLLs de extensión en el servicio SNMP para exponer OIDs adicionales. Es la vía más limpia si quieres un árbol estándar y rendimiento alto, pero requiere desarrollo en C/C++ y gestión cuidadosa de registro/servicio. Recomendado solo en entornos con requisitos muy estrictos.</p>

<h2>Verificaciones rápidas</h2>
<p>Antes de culpar a la configuración, descarta los básicos:</p>
<ol>
  <li><strong>¿El agente responde?</strong>
    <pre><code class="language-bash">snmpwalk -v2c -c &lt;comunidad&gt; &lt;ip-servidor&gt; 1.3.6.1.2.1.1  # system.*

¿El OID de DNS existe?

snmpwalk -v2c -c &lt;comunidad&gt; &lt;ip-servidor&gt; 1.3.6.1.2.1.32
“No Such Object” ⇒ el agente no implementa DNS-Server-MIB

¿Comunidad/ACL correctas? El servicio SNMP de Windows usa comunidades v1/v2c y listas de hosts permitidos. Un timeout suele indicar bloqueo/firewall o ACL, no “objeto inexistente”.
SNMPv3. El agente nativo no soporta v3; si tu NMS lo exige, usa agente de terceros o Net‑SNMP.

Buenas prácticas de seguridad y operación

  • Evita exponer SNMP a Internet. Limítalo a redes de gestión. Filtra por IP y usa solo comunidades de solo lectura.
  • Prefiere v3 cuando uses SNMP con agentes de terceros (auth/priv).
  • Observabilidad complementaria. Combina métricas (estadísticas) con eventos para tener alertas inmediatas de fallos lógicos (p. ej., zona no cargada).
  • Series temporales. Calcula deltas/ratios (NXDOMAIN%, QPS) y define umbrales alineados a tu patrón de tráfico normal.
  • Documenta el mapeo de OIDs. Si implementas un puente SNMP, fija el árbol OID y documenta cada métrica para futuras integraciones.

Errores comunes y cómo resolverlos

SíntomaPosible causaAcción recomendada
No Such Object al consultar 1.3.6.1.2.1.32...MIB no implementadoUsa PowerShell/PerfMon/Eventos o añade agente/puente SNMP.
Timeout en todas las consultasFirewall/ACL o servicio SNMP caídoHabilita UDP/161, revisa comunidades/hosts permitidos, verifica servicio.
Valores siempre ceroLectura de contadores acumulativos sin deltasCalcula diferencia entre muestras para tasas por segundo/minuto.
NMS muestra nombres de OID pero no datosMIB cargado solo en el NMSRecuerda: cargar MIB ≠ implementar. Valida con snmpwalk.

Plantilla de implementación (sin SNMP)

  1. Descubrimiento: inventaría servidores con rol DNS y habilita PowerShell Remoting/WinRM seguro.
  2. Recolección:
    • Estadísticas: Get-DnsServerStatistics cada 60–300 s.
    • Contadores: agrega los del objeto DNS Server.
    • Eventos: suscríbete a canales de DNS‑Server (Error/Warning/Audit).
  3. Procesamiento:
    • Calcula deltas (NXDOMAIN/s, QPS) y porcentajes.
    • Guarda en TSDB/CMDB o envía a tu NMS.
  4. Alertado:
    • Umbrales por ratio (p. ej., NXDOMAIN% > 10%).
    • Alertas por eventos críticos (zona no cargada, recursion fail).
  5. Visualización: panel con QPS, distribución de RCODE, recursiones y top de consultas fallidas.

Plantilla de implementación (con SNMP)

  1. Elegir estrategia: agente de terceros (ideal si soporta v3) o puente Net‑SNMP + PowerShell.
  2. Definir OIDs: fija un árbol (.1.3.6.1.4.1.<empresa>) y mapea NXDOMAIN/SERVFAIL/QPS a OIDs únicos.
  3. Probar con snmpwalk: snmpwalk -v2c -c <comunidad> <ip> .1.3.6.1.4.1.<empresa>
  4. Documentar el mapeo: nombre, OID, tipo y semántica (acumulativo vs. instantáneo).
  5. Seguridad: restringe fuente de consultas y, si es posible, usa SNMPv3.

Preguntas frecuentes

¿Basta con cargar “DNS‑Server‑MIB” en el NMS? No. Solo añade nombres legibles. Si el agente no implementa ese MIB, seguirá devolviendo No Such Object.

¿El “SNMP WMI Provider” ayuda a exponer métricas de DNS por SNMP? No. Permite a WMI consultar dispositivos SNMP, no al revés.

¿Hay cambios entre Windows Server 2012 R2, 2016, 2019 o 2022? En todos los casos, el agente SNMP nativo no publica DNS‑Server‑MIB. La recomendación de usar PowerShell/PerfMon/Eventos o agentes SNMP de terceros se mantiene.

Necesito SNMPv3 por política corporativa. Usa un agente SNMP de terceros compatible o Net‑SNMP (como proxy o en el propio servidor) con v3 activado; el agente nativo de Windows no tiene v3.

Guía de pruebas paso a paso

  1. Verifica el agente: snmpget -v2c -c <comunidad> <ip> 1.3.6.1.2.1.1.1.0 # sysDescr.0
  2. Comprueba un módulo básico: snmpwalk -v2c -c <comunidad> <ip> 1.3.6.1.2.1.2 # interfaces
  3. Intenta el MIB de DNS (para confirmar la limitación): snmpwalk -v2c -c <comunidad> <ip> 1.3.6.1.2.1.32.1.1.3.2 Resultado esperado: No Such Object
  4. Elige estrategia de monitorización (A sin SNMP, B con SNMP) y aplica la plantilla correspondiente.

Resumen ejecutivo

El error No Such Object al consultar OIDs del DNS‑Server‑MIB no se debe a una mala configuración: Windows Server no publica ese MIB de fábrica. Para medir métricas como NXDOMAIN o SERVFAIL tienes dos rutas sólidas:

  1. Interfaces nativas de Windows (recomendado): PowerShell (Get-DnsServerStatistics), PerfMon y Eventos. Son soportadas, ricas en datos y más seguras que SNMP v2c.
  2. SNMP obligatorio: instala un agente SNMP de terceros que exponga DNS o construye un puente SNMP (Net‑SNMP + PowerShell/AgentX) bajo un árbol OID propio y documentado.

Con cualquiera de las dos, tendrás métricas accionables (QPS, NXDOMAIN%, fallos de recursión) y alertas oportunas, sin perder tiempo buscando un MIB que el agente de Windows nunca implementó.

Índice