Saltar al contenido principal

Zabbix

Monitoreo6.4 LTSBlue Team

Plataforma enterprise de monitoreo distribuido con auto-discovery, dashboards avanzados, correlación de eventos y API REST completa.

¿Qué es Zabbix y ventajas vs Nagios?

Arquitectura, componentes y casos de uso

Zabbix es una plataforma de monitoreo enterprise open-source creada en 2001. A diferencia de Nagios, Zabbix incluye su propio sistema de almacenamiento de métricas, dashboards nativos y correlación de eventos sin plugins externos.

Diferencias clave con Nagios: • Configuración: Nagios usa archivos .cfg; Zabbix usa Web UI + Base de datos • Métricas históricas: Nagios necesita RRDtool; Zabbix las almacena nativamente • Dashboards: Nagios tiene UI básica; Zabbix tiene dashboards completamente personalizables • Escalabilidad: Nagios maneja cientos de hosts; Zabbix maneja miles de hosts • API: Nagios tiene API limitada; Zabbix tiene REST API completa

Componentes principales: • Zabbix Server: Núcleo que procesa datos y genera alertas • Zabbix Database: MySQL/PostgreSQL para métricas históricas • Zabbix Web Frontend: PHP — interfaz de configuración y dashboards • Zabbix Agent 2: Daemon en los hosts monitoreados (moderno, escrito en Go) • Zabbix Proxy: Para monitoreo distribuido en sedes remotas

¿Cuándo elegir Zabbix? Más de 50 hosts, necesitas dashboards visuales, auto-discovery de red, monitoreo de métricas de negocio, o integración con ticketing (Jira, ServiceNow).

bash
# Arquitectura Zabbix:
#
# ┌──────────────────────────────────────────────────┐
# │              ZABBIX SERVER                       │
# │   Trapper | Poller | IPMI | SNMP | JMX           │
# └──────────────────┬───────────────────────────────┘
#                    │
#       ┌────────────┴────────────┐
#       ▼                         ▼
# ┌───────────────┐     ┌─────────────────────┐
# │  DATABASE     │     │   WEB FRONTEND      │
# │ MySQL/PgSQL   │     │  PHP + Nginx        │
# │ (métricas)    │     │  (dashboards)       │
# └───────────────┘     └─────────────────────┘
#
# Flujo de datos:
# Host con Agent → envía métricas cada 30s
# → Zabbix Server las recibe y guarda en BD
# → Evalúa triggers (condiciones de alerta)
# → Si trigger activo → acción (email, script, webhook)
# → Web frontend muestra gráficas en tiempo real

# Modos de recolección:
# PASSIVE: Zabbix Server consulta al agente (por defecto)
# ACTIVE:  El agente envía datos al servidor (mejor para firewalls)

💡Para instalaciones nuevas usa Zabbix 6.4 LTS (Long Term Support). Las versiones LTS tienen soporte por 5 años y son más estables para producción.

Instalación con Docker Compose

Stack completo levantado en minutos

Docker Compose es la forma recomendada para instalar Zabbix. Levanta todos los componentes (server, base de datos, frontend, agente) con un solo comando.

Lo que incluye este stack: • Zabbix Server: Núcleo de procesamiento y alertas • MySQL 8.0: Base de datos para métricas e historial • Zabbix Web con Nginx: Interfaz de configuración y dashboards • Zabbix Agent 2: Para monitorear el propio servidor donde corre

Requisitos mínimos: • Docker 20.10+ y Docker Compose 2.x • 4 GB RAM para el stack completo • 20 GB disco (las métricas crecen con el tiempo)

Configuración de retención: Por defecto Zabbix guarda métricas por 90 días. En producción ajusta según tu capacidad de disco. Con TimescaleDB (extensión de PostgreSQL) el rendimiento de consultas históricas mejora hasta 10x.

Acceso inicial: URL: http://localhost:8080 | Usuario: Admin | Password: zabbix ¡Cambia la contraseña inmediatamente!

bash
mkdir -p ~/zabbix && cd ~/zabbix

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  zabbix-db:
    image: mysql:8.0
    container_name: zabbix-mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_secure_2024
      MYSQL_ROOT_PASSWORD: root_secure_2024
    volumes:
      - zabbix-db:/var/lib/mysql
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_bin
      --default-authentication-plugin=mysql_native_password
    networks: [zabbix-net]

  zabbix-server:
    image: zabbix/zabbix-server-mysql:ubuntu-6.4-latest
    restart: unless-stopped
    ports: ["10051:10051"]
    environment:
      DB_SERVER_HOST: zabbix-db
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_secure_2024
      ZBX_CACHESIZE: 256M
      ZBX_HISTORYCACHESIZE: 64M
    depends_on: [zabbix-db]
    networks: [zabbix-net]

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.4-latest
    restart: unless-stopped
    ports: ["8080:8080"]
    environment:
      DB_SERVER_HOST: zabbix-db
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_secure_2024
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: America/Mexico_City
      ZBX_SERVER_NAME: "Mi Monitoring"
    depends_on: [zabbix-server]
    networks: [zabbix-net]

  zabbix-agent:
    image: zabbix/zabbix-agent2:ubuntu-6.4-latest
    restart: unless-stopped
    environment:
      ZBX_HOSTNAME: "zabbix-server-host"
      ZBX_SERVER_HOST: zabbix-server
    networks: [zabbix-net]

volumes:
  zabbix-db:
networks:
  zabbix-net:
    driver: bridge
EOF

docker-compose up -d
docker-compose logs -f zabbix-server   # Ver logs
# Acceder a http://localhost:8080  |  Admin / zabbix

💡En producción usa TimescaleDB (PostgreSQL) en lugar de MySQL para métricas de alta frecuencia. Mejora el rendimiento de consultas históricas hasta 10x.

Templates, Items y Triggers

El corazón de la configuración Zabbix

La configuración gira en torno a tres conceptos que debes dominar:

Items (Métricas a recolectar): Define QUÉ dato recolectar y CON QUÉ FRECUENCIA. Ejemplos: system.cpu.util cada 30s, vm.memory.size[available] cada 60s, net.if.in[eth0] cada 60s.

Triggers (Condiciones de alerta): Define CUÁNDO generar una alerta basándose en valores de items: • avg(system.cpu.util,5m) > 90: CPU promedio > 90% en 5 minutos • last(vm.memory.size[pavailable]) < 10: menos del 10% RAM libre

Templates (Plantillas reutilizables): Agrupan items, triggers y gráficas para un tipo de dispositivo. Al aplicar "Linux by Zabbix agent" a un host, automáticamente monitoreas CPU, RAM, disco, red, procesos, y más de 50 métricas.

Zabbix incluye 400+ templates oficiales para: Apache, Nginx, MySQL, PostgreSQL, Docker, Kubernetes, AWS, Azure, VMware, Cisco, Juniper, F5, y más.

Tip de configuración: Usa el "Expression builder" en la UI para construir expresiones de triggers sin errores de sintaxis.

bash
# ── INSTALAR AGENTE EN HOST REMOTO (Ubuntu 22.04) ─────
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
sudo dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
sudo apt update && sudo apt install -y zabbix-agent2

sudo nano /etc/zabbix/zabbix_agent2.conf
# Cambiar:
# Server=192.168.1.10           ← IP de tu Zabbix Server
# ServerActive=192.168.1.10     ← Para modo activo
# Hostname=mi-servidor-web      ← Debe coincidir en Zabbix UI

sudo systemctl enable --now zabbix-agent2

# ── AÑADIR HOST EN WEB UI ──────────────────────────────
# Configuration → Hosts → Create host
# Host name:    mi-servidor-web
# Groups:       Linux servers
# Interface → Type: Agent | IP: 192.168.1.100 | Port: 10050
# Templates → Add: "Linux by Zabbix agent"
# → Update

# ── CREAR TRIGGERS PERSONALIZADOS ─────────────────────
# Configuration → Hosts → [host] → Triggers → Create trigger

# Trigger 1: CPU alta sostenida
# Expression: avg(/mi-servidor/system.cpu.util,10m)>85
# Recovery:   avg(/mi-servidor/system.cpu.util,5m)<70
# Severity: High

# Trigger 2: Disco crítico
# Expression: last(/mi-servidor/vfs.fs.size[/,pfree])<5
# Severity: Disaster

# Trigger 3: Apache caído
# Expression: last(/mi-servidor/net.tcp.service[http,,80])=0
# Severity: High

# ── API REST ZABBIX ────────────────────────────────────
# Obtener token de autenticación:
curl -s -X POST http://localhost:8080/api_jsonrpc.php \
  -H "Content-Type: application/json-rpc" \
  -d '{"jsonrpc":"2.0","method":"user.login",
       "params":{"username":"Admin","password":"zabbix"},"id":1}'

💡Usa la función "Test" en la UI de Zabbix para probar expresiones antes de activarlas. Evita el flapping configurando hysteresis (umbral de recuperación diferente al de alarma).

Dashboards, Mapas y API REST

Visualización avanzada e integraciones

Zabbix destaca por sus capacidades de visualización y su potente API REST que permite integración con cualquier herramienta.

Dashboards en Zabbix 6.4+: Completamente personalizables con widgets arrastrables: gráficas en tiempo real, mapas de red con estado visual, tabla de problemas activos, contadores y medidores, mapas geográficos y alertas recientes.

Network Maps (Mapas de Red): Crea mapas visuales de la topología de red donde cada nodo muestra su estado en tiempo real. Perfecto para NOC (Network Operations Center).

API REST: Permite automatizar casi cualquier operación: crear hosts, obtener alertas, actualizar configuración, integrarse con CMDB y ticketing. Usa JSON-RPC sobre HTTP/S.

Integración con Grafana: Grafana + Zabbix es una combinación muy popular: Zabbix recolecta y almacena, Grafana visualiza con dashboards hermosos. Instala el plugin "alexanderzobnin-zabbix-app" en Grafana.

Integraciones populares: PagerDuty/OpsGenie para escalado, Jira/ServiceNow para tickets automáticos, Telegram/Slack para notificaciones en tiempo real.

bash
# ── API REST: Operaciones comunes ──────────────────────

# 1. Login y obtener token
AUTH=$(curl -s -X POST http://localhost:8080/api_jsonrpc.php \
  -H "Content-Type: application/json-rpc" \
  -d '{"jsonrpc":"2.0","method":"user.login",
       "params":{"username":"Admin","password":"zabbix"},"id":1}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])")

# 2. Listar hosts activos
curl -s -X POST http://localhost:8080/api_jsonrpc.php \
  -H "Content-Type: application/json-rpc" \
  -d "{"jsonrpc":"2.0","method":"host.get",
       "params":{"output":["hostid","host","status"]},
       "auth":"$AUTH","id":2}" | python3 -m json.tool

# 3. Obtener alertas activas
curl -s -X POST http://localhost:8080/api_jsonrpc.php \
  -H "Content-Type: application/json-rpc" \
  -d "{"jsonrpc":"2.0","method":"problem.get",
       "params":{"output":"extend","sortfield":["eventid"],
       "sortorder":"DESC","limit":10},
       "auth":"$AUTH","id":3}" | python3 -m json.tool

# ── SCRIPT PYTHON PARA CREAR HOST ─────────────────────
cat > create_host.py << 'PYEOF'
import requests

URL = "http://localhost:8080/api_jsonrpc.php"
HDR = {"Content-Type": "application/json-rpc"}

# Login
token = requests.post(URL, headers=HDR, json={
    "jsonrpc":"2.0","method":"user.login",
    "params":{"username":"Admin","password":"zabbix"},"id":1
}).json()["result"]

# Crear host
result = requests.post(URL, headers=HDR, json={
    "jsonrpc":"2.0","method":"host.create",
    "params":{
        "host":"nuevo-servidor",
        "interfaces":[{"type":1,"main":1,"useip":1,
                       "ip":"192.168.1.200","dns":"","port":"10050"}],
        "groups":[{"groupid":"2"}],
        "templates":[{"templateid":"10001"}]
    },
    "auth":token,"id":2
}).json()
print("Creado:", result)
PYEOF
python3 create_host.py

💡Grafana con el plugin de Zabbix es una combinación poderosa. Zabbix recolecta y almacena los datos; Grafana crea dashboards más visuales y personalizables.

Labs Prácticos

Intermedio 30 min

Lab 1: Auto-discovery y onboarding automático de hosts

Objetivo

Configurar Zabbix Network Discovery para escanear la subred y registrar automáticamente nuevos hosts cuando se detecta el agente.

Escenario

Tu empresa agrega servidores periódicamente. En lugar de registrarlos manualmente en Zabbix cada vez, quieres que aparezcan solos cuando tienen el agente instalado.

Pasos

1

Crear Discovery Rule para la subred 192.168.1.0/24

2

Crear Action que procese hosts descubiertos automáticamente

3

Configurar qué Template aplicar según el OS detectado

4

Instalar agente en un servidor de prueba

5

Verificar que aparece automáticamente en Zabbix

bash — práctica
# ZABBIX WEB UI: Configuration → Discovery → Create rule
# Name:       Descubrimiento LAN
# IP range:   192.168.1.1-254
# Delay:      1h
# Checks:     Zabbix agent (port 10050, key: system.uname)
#             ICMP ping

# CREAR ACTION (Configuration → Actions → Discovery)
# Name:    Auto-registrar hosts Linux
# Conditions: Discovery status = Host UP
#             Received value contains "Linux"
# Operations:
#   1. Add host
#   2. Add to host group: Linux Servers
#   3. Link template: Linux by Zabbix agent
#   4. Enable host

# INSTALAR AGENTE EN NUEVO SERVIDOR
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
sudo dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
sudo apt update && sudo apt install -y zabbix-agent2

sudo nano /etc/zabbix/zabbix_agent2.conf
# Server=192.168.1.10
# ServerActive=192.168.1.10
# Hostname=nuevo-servidor-web

sudo systemctl enable --now zabbix-agent2

# DEPLOY MASIVO (script para múltiples servidores)
for SERVER in 192.168.1.101 192.168.1.102 192.168.1.103; do
    ssh root@$SERVER "apt install -y zabbix-agent2 && \
      sed -i 's/Server=127.0.0.1/Server=192.168.1.10/' /etc/zabbix/zabbix_agent2.conf && \
      sed -i 's/Hostname=Zabbix server/Hostname=$(hostname)/' /etc/zabbix/zabbix_agent2.conf && \
      systemctl enable --now zabbix-agent2"
    echo "✓ Agente instalado en $SERVER"
done

Resultado esperado

Nuevos servidores con el agente instalado aparecerán automáticamente en Zabbix con el template Linux aplicado. Cero configuración manual por servidor.

Intermedio 40 min

Lab 2: Dashboard con métricas de negocio

Objetivo

Crear dashboard que muestre métricas de infraestructura y negocio: usuarios conectados, TPS y errores de aplicación.

Escenario

El equipo directivo quiere ver usuarios conectados, transacciones por segundo y errores de aplicación en tiempo real, no solo si los servidores están up.

Pasos

1

Crear UserParameters en el agente para métricas de negocio

2

Crear Items en Zabbix para cada métrica

3

Construir dashboard con widgets de diferentes tipos

4

Crear trigger para caída brusca de TPS

5

Compartir el dashboard con el equipo directivo

bash — práctica
# USERPARAMETERS EN EL SERVIDOR (/etc/zabbix/zabbix_agent2.conf)
UserParameter=app.users.connected,mysql -u app -ppass -e "SELECT COUNT(*) FROM sessions WHERE last_seen > DATE_SUB(NOW(), INTERVAL 5 MINUTE);" 2>/dev/null | tail -1
UserParameter=app.transactions.per.second,cat /var/log/app/transactions.log | awk -v now=$(date +%s) '$1 > now-60' | wc -l
UserParameter=app.errors.last.hour,grep -c "ERROR" /var/log/app/app.log 2>/dev/null || echo 0
UserParameter=app.response.time,curl -s -o /dev/null -w "%{time_total}" http://localhost/health

sudo systemctl restart zabbix-agent2

# CREAR ITEMS EN ZABBIX UI
# Configuration → Hosts → [host] → Items → Create item
# app.users.connected   | Tipo: Zabbix agent | Intervalo: 1m
# app.transactions.per.second | Intervalo: 1m
# app.errors.last.hour  | Intervalo: 5m

# DASHBOARD (Monitoring → Dashboards → Create)
# Widgets:
# - "Item value" grande: Usuarios actuales
# - "Graph": TPS últimas 2 horas
# - "Graph": Errores últimas 24 horas
# - "Problems": Alertas activas
# - "Map": Mapa de red

# TRIGGER: Caída brusca de TPS
# Expression:
# avg(/mi-servidor/app.transactions.per.second,1h) * 0.5
#   > last(/mi-servidor/app.transactions.per.second)
# Alerta si TPS cae a menos del 50% del promedio horario

Resultado esperado

Dashboard ejecutivo que muestra infraestructura y negocio en tiempo real. Alertas antes de que el impacto sea visible para los usuarios.

Avanzado 45 min

Lab 3: Monitoreo de contenedores Docker

Objetivo

Configurar Zabbix Agent 2 para monitorear contenedores Docker: estado, CPU/RAM, reinicios y crash loops.

Escenario

Tu equipo migró a microservicios. Necesitas saber cuándo un contenedor se reinicia (señal de crash loop) y recibir alertas si lleva caído más de 2 minutos.

Pasos

1

Configurar Zabbix Agent 2 con el plugin de Docker

2

Añadir usuario zabbix al grupo docker

3

Importar el template oficial de Docker en Zabbix

4

Crear triggers para contenedores críticos

5

Simular fallo de contenedor para probar alertas

bash — práctica
# INSTALAR AGENT 2 CON SOPORTE DOCKER
sudo apt install zabbix-agent2 zabbix-agent2-plugin-*
sudo usermod -aG docker zabbix

sudo nano /etc/zabbix/zabbix_agent2.conf
# Plugins.Docker.Endpoint=unix:///var/run/docker.sock

sudo systemctl restart zabbix-agent2

# VERIFICAR
zabbix_agent2 -t docker.containers.discovery

# IMPORTAR TEMPLATE EN ZABBIX UI
# Configuration → Templates → Import
# Descargar: https://git.zabbix.com/.../template_app_docker.yaml

# VINCULAR AL HOST
# Configuration → Hosts → [host] → Templates
# Buscar: "Docker by Zabbix agent 2" → Add → Update

# TRIGGERS PERSONALIZADOS
# Contenedor caído > 2 minutos:
last(/docker-host/docker.container_info[webapp,Status])="exited"
and now()-last_change(/docker-host/docker.container_info[webapp,Status])>120

# Crash loop (demasiados reinicios):
last(/docker-host/docker.container_info[webapp,RestartCount])>5

# Memoria excesiva (> 2GB):
last(/docker-host/docker.containers.memory[webapp,rss])>2147483648

# SIMULAR FALLO Y PROBAR
docker stop webapp
# Esperar 2 minutos → verificar alerta en Zabbix

Resultado esperado

Zabbix mostrará todos los contenedores con métricas individuales. Alertas automáticas si un contenedor crítico cae o entra en crash loop.

Avanzado 50 min

Lab 4: Integración con Slack y tickets automáticos Jira

Objetivo

Enviar alertas formateadas a Slack y crear tickets en Jira automáticamente cuando Zabbix detecte problemas críticos.

Escenario

Cuando Zabbix detecta un problema HIGH/CRITICAL quieres: notificación inmediata en #alertas de Slack + ticket en Jira asignado al on-call engineer.

Pasos

1

Crear Webhook de Slack para el canal #alertas

2

Crear Media Type personalizado en Zabbix para Slack

3

Crear script de integración con API de Jira

4

Configurar Action con condiciones y operaciones

5

Probar el flujo con un problema simulado

bash — práctica
# MEDIA TYPE SLACK EN ZABBIX
# Administration → Media types → Create media type
# Name: Slack Alertas | Type: Webhook
# Parameters: webhook_url, message, severity, host, status

# Script del webhook:
var params = JSON.parse(value);
var color = params.status === "OK" ? "good" :
            params.severity === "WARNING" ? "warning" : "danger";
var payload = JSON.stringify({
    attachments: [{
        color: color,
        title: params.status + ": " + params.host,
        text: params.message,
        footer: "Zabbix | " + new Date().toISOString()
    }]
});
var req = new HttpRequest();
req.addHeader("Content-Type: application/json");
var result = req.post(params.webhook_url, payload);
if (req.getStatus() !== 200) throw "Error: " + result;
return "OK";

# SCRIPT JIRA (/usr/lib/zabbix/alertscripts/create_jira.sh)
#!/bin/bash
curl -s -u "admin@empresa.com:API_TOKEN" \
  -X POST "https://empresa.atlassian.net/rest/api/2/issue" \
  -H "Content-Type: application/json" \
  -d "{"fields":{
    "project":{"key":"OPS"},
    "summary":"[ZABBIX] $2",
    "description":"$3",
    "issuetype":{"name":"Bug"},
    "priority":{"name":"High"},
    "assignee":{"name":"oncall-engineer"}
  }}"

# ACTION EN ZABBIX
# Configuration → Actions → Trigger actions → Create
# Conditions: Trigger severity >= High | Status = Problem
# Operations:
#   1. Send message via "Slack Alertas"
#   2. Run remote command: create_jira.sh

Resultado esperado

Alertas formateadas a Slack + ticket en Jira automático cuando hay problemas críticos. El on-call engineer ve todo sin entrar a Zabbix.

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.