# Plantilla de Zabbix para Cisco MAC Monitor
# ==========================================
## Discovery Rule
```xml
Cisco MAC Discovery
EXTERNAL
cisco_mac_discovery.sh
5m
Descubre puertos de switches Cisco con direcciones MAC conectadas
MAC Count on {#DEVICE_HOSTNAME} port {#PORT_NAME}
CALCULATED
cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}]
0
UNSIGNED
{#MAC_COUNT}
Número de direcciones MAC en el puerto
MAC Addresses on {#DEVICE_HOSTNAME} port {#PORT_NAME}
CALCULATED
cisco.mac.addresses[{#DEVICE_HOSTNAME},{#PORT_NAME}]
0
TEXT
{#MAC_ADDRESSES}
Lista de direcciones MAC en formato JSON
VLANs on {#DEVICE_HOSTNAME} port {#PORT_NAME}
CALCULATED
cisco.mac.vlans[{#DEVICE_HOSTNAME},{#PORT_NAME}]
0
TEXT
{#VLANS}
VLANs presentes en el puerto
Last Update {#DEVICE_HOSTNAME} port {#PORT_NAME}
CALCULATED
cisco.mac.lastupdate[{#DEVICE_HOSTNAME},{#PORT_NAME}]
0
TEXT
{#LAST_UPDATE}
Timestamp de última actualización
{Template Cisco MAC:cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}].change()}>0
MAC count changed on {#DEVICE_HOSTNAME} port {#PORT_NAME}
INFO
El número de direcciones MAC en el puerto ha cambiado
{Template Cisco MAC:cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}].last()}>5
Too many MACs on {#DEVICE_HOSTNAME} port {#PORT_NAME}
WARNING
Demasiadas direcciones MAC en un solo puerto (posible loop o hub)
{Template Cisco MAC:cisco.mac.addresses[{#DEVICE_HOSTNAME},{#PORT_NAME}].change()}>0
MAC addresses changed on {#DEVICE_HOSTNAME} port {#PORT_NAME}
INFO
Las direcciones MAC en el puerto han cambiado
MAC Count - {#DEVICE_HOSTNAME} {#PORT_NAME}
- cisco.mac.count[{#DEVICE_HOSTNAME},{#PORT_NAME}]
```
## Items Adicionales (nivel de host)
```xml
-
Cisco MAC Monitor - Total Devices
DEPENDENT
cisco.mac.total_devices
cisco_mac_discovery.sh
JSONPATH
$.total_devices
Número total de dispositivos monitorizados
-
Cisco MAC Monitor - Total Ports
DEPENDENT
cisco.mac.total_ports
cisco_mac_discovery.sh
JSONPATH
$.total_ports
Número total de puertos con MACs
-
Cisco MAC Monitor - Last Timestamp
DEPENDENT
cisco.mac.timestamp
cisco_mac_discovery.sh
JSONPATH
$.timestamp
Timestamp de la última ejecución
```
## Triggers de Host
```xml
{Template Cisco MAC:cisco.mac.timestamp.nodata(15m)}>0
Cisco MAC Monitor - No data received
WARNING
No se han recibido datos del monitor MAC en los últimos 15 minutos
{Template Cisco MAC:cisco.mac.total_devices.last()}<1
Cisco MAC Monitor - No devices monitored
HIGH
No hay dispositivos siendo monitorizados
```
## Macros de Template
```xml
{$CISCO.MAC.MAX_PER_PORT}
5
Máximo número de MACs permitidas por puerto
{$CISCO.MAC.DATA_TIMEOUT}
15m
Timeout para considerar datos obsoletos
{$CISCO.MAC.DISCOVERY_INTERVAL}
5m
Intervalo de discovery
```
## Scripts de Actions
### Script para notificaciones con detalles de MACs
```bash
#!/bin/bash
# Script para enviar detalles de cambios MAC
DEVICE="{ALERT.SUBJECT}"
PORT="{ITEM.KEY1}"
MAC_DATA="{ITEM.VALUE}"
# Formatear mensaje
MESSAGE="
Cambio detectado en tabla MAC:
Dispositivo: ${DEVICE}
Puerto: ${PORT}
Timestamp: $(date)
Direcciones MAC actuales:
${MAC_DATA}
"
# Enviar notificación (ejemplo con email)
echo "${MESSAGE}" | mail -s "Alerta MAC - ${DEVICE}" admin@empresa.com
```
### Script para análisis de MACs no autorizadas
```python
#!/usr/bin/env python3
import json
import sys
# Cargar lista de MACs autorizadas
authorized_macs = {
"aa:bb:cc:dd:ee:01": "Servidor Principal",
"aa:bb:cc:dd:ee:02": "Workstation Admin",
# ... más MACs autorizadas
}
# Obtener datos del item
mac_data = sys.argv[1] if len(sys.argv) > 1 else "{}"
try:
macs = json.loads(mac_data)
unauthorized = []
for mac_entry in macs:
mac = mac_entry.get('mac')
if mac and mac not in authorized_macs:
unauthorized.append({
'mac': mac,
'vlan': mac_entry.get('vlan'),
'type': mac_entry.get('type')
})
if unauthorized:
print(f"MACs no autorizadas detectadas: {len(unauthorized)}")
for mac in unauthorized:
print(f" - {mac['mac']} (VLAN {mac['vlan']})")
else:
print("Todas las MACs están autorizadas")
except Exception as e:
print(f"Error procesando datos MAC: {e}")
```
## Configuración de Web Scenarios
```xml
Cisco MAC Monitor Container Health
5m
Check Container Status
http://localhost:8080/health
200
OK
```
## Dashboard Widget
```json
{
"type": "graph",
"name": "Cisco MAC Activity",
"fields": {
"source_type": "1",
"itemid": {
"cisco.mac.total_ports": "Total Ports with MACs"
}
}
}
```
## Media Types para Alertas
### Webhook para Slack
```json
{
"name": "Cisco MAC Slack Alert",
"type": "webhook",
"parameters": {
"url": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
"channel": "#network-alerts",
"message": "🚨 Cisco MAC Alert\nDevice: {ALERT.SUBJECT}\nMessage: {ALERT.MESSAGE}\nTime: {DATE} {TIME}"
}
}
```
### Webhook para Teams
```json
{
"name": "Cisco MAC Teams Alert",
"type": "webhook",
"parameters": {
"url": "https://outlook.office.com/webhook/YOUR/TEAMS/WEBHOOK",
"title": "Cisco MAC Monitor Alert",
"text": "Device: {ALERT.SUBJECT}\\nStatus: {TRIGGER.STATUS}\\nMessage: {ALERT.MESSAGE}"
}
}
```