Monitorear la velocidad WAN (Download/Upload), la latencia (Ping) y la estabilidad (Jitter) de un enlace de Internet, ejecutando mediciones periódicas desde un Proxy Zabbix (XaviX) y enviando los resultados al servidor principal.
speedtest-cli instalados.zabbix_server o zabbix_proxy).sudo apt update
sudo apt install -y zabbix-sender python3-pip
sudo pip3 install speedtest-cli
Verifica la instalación:
which zabbix_sender
which speedtest-cli
Crear o editar el archivo principal:
sudo nano /usr/local/bin/wan_probe.sh
#!/usr/bin/env bash
# WAN Probe (SpeedTest) -> Zabbix via Trapper | ITS4ALL
set -u
export LC_ALL=C
# --- Zabbix / rutas ---
ZBX_HOST="ALDLNO-WAN-PROBE"
ZBX_TARGET="127.0.0.1"
ZBX_PORT="10051"
LOG="/var/log/wan_probe.log"
SPEEDTEST="/usr/bin/speedtest-cli"
SENDER="/usr/bin/zabbix_sender"
PINGBIN="$(command -v ping || echo /bin/ping)"
# (Opcional) fija un servidor de Ookla para evitar fallos de descubrimiento
# Obtén IDs con: speedtest-cli --list | head -n 30
SERVER_ID="" # ej: SERVER_ID="12345" (déjalo vacío si no quieres fijar)
ts(){ date '+%Y-%m-%d %H:%M:%S'; }
run_speedtest() {
if [[ -n "${SERVER_ID}" ]]; then
"$SPEEDTEST" --simple --server "$SERVER_ID"
else
"$SPEEDTEST" --simple
fi
}
echo "$(ts) :: START" >> "$LOG"
# 1) Ejecutar speedtest con reintento si falla
RES="$(run_speedtest 2>>"$LOG" || true)"
if [[ -z "$RES" || "$(printf '%s' "$RES" | grep -i 'error')" ]]; then
echo "$(ts) :: speedtest error -> retry in 5s" >> "$LOG"
sleep 5
RES="$(run_speedtest 2>>"$LOG" || true)"
fi
# 2) Parsear métricas de speedtest
PING="$(printf '%s' "$RES" | awk '/^Ping:/{print $2}')"
DOWN="$(printf '%s' "$RES" | awk '/^Download:/{print $2}')"
UP="$(printf '%s' "$RES" | awk '/^Upload:/{print $2}')"
# 3) Jitter (mdev) independiente de speedtest con fallback de destino
JITTER="$("$PINGBIN" -c 20 -i 0.2 8.8.8.8 2>/dev/null | awk -F'/' '/(rtt|round-trip)/{print $7}' | awk '{print $1}')"
if [[ -z "$JITTER" ]]; then
JITTER="$("$PINGBIN" -c 20 -i 0.2 1.1.1.1 2>/dev/null | awk -F'/' '/(rtt|round-trip)/{print $7}' | awk '{print $1}')"
fi
JITTER="${JITTER/,/.}"
# 4) Validar: solo enviar si hay número
send_if_num() {
local key="$1" val="$2"
if [[ "$val" =~ ^[0-9]+([.][0-9]+)?$ ]]; then
"$SENDER" -z "$ZBX_TARGET" -p "$ZBX_PORT" -s "$ZBX_HOST" -k "$key" -o "$val" >>"$LOG" 2>&1
else
echo "$(ts) :: WARN $key vacío/no numérico, no se envía" >> "$LOG"
fi
}
send_if_num net.speedtest.download "$DOWN"
send_if_num net.speedtest.upload "$UP"
send_if_num net.speedtest.ping "$PING"
send_if_num net.speedtest.jitter "$JITTER"
echo "$(ts) :: SUMMARY D=${DOWN:-x} U=${UP:-x} P=${PING:-x} J=${JITTER:-x}" >> "$LOG"
Aplicar permisos y preparar log:
sudo chmod +x /usr/local/bin/wan_probe.sh
sudo touch /var/log/wan_probe.log && sudo chmod 664 /var/log/wan_probe.log
Editar el crontab de root:
sudo crontab -e
Agregar:
*/30 * * * * /usr/local/bin/wan_probe.sh >> /var/log/wan_probe.log 2>&1
Verificar:
sudo crontab -l
💡 El redireccionamiento
>> /var/log/wan_probe.log 2>&1mantiene historial de cada corrida.
ALDLNO-WAN-PROBERuta: Configuration → Hosts → ALDLNO-WAN-PROBE → Items → Create item
Crear los siguientes ítems tipo Zabbix trapper:
| Nombre | Key | Tipo | Tipo de Información | Unidades | Update Interval |
|---|---|---|---|---|---|
| Speedtest Download | net.speedtest.download | Zabbix trapper | Numeric (float) | Mbps | – |
| Speedtest Upload | net.speedtest.upload | Zabbix trapper | Numeric (float) | Mbps | – |
| Speedtest Ping | net.speedtest.ping | Zabbix trapper | Numeric (float) | ms | – |
| Speedtest Jitter | net.speedtest.jitter | Zabbix trapper | Numeric (float) | ms | – |
| Nombre | Expresión | Severidad | Descripción |
|---|---|---|---|
| WAN Download Speed below 50 Mbps | last(/ALDLNO-WAN-PROBE/net.speedtest.download)<50 |
Average | Se activa si la descarga cae por debajo de 50 Mbps |
| WAN Upload Speed below 10 Mbps | last(/ALDLNO-WAN-PROBE/net.speedtest.upload)<10 |
Average | Se activa si la subida cae por debajo de 10 Mbps |
| WAN Latency above 120 ms | last(/ALDLNO-WAN-PROBE/net.speedtest.ping)>120 |
Warning | Se activa si la latencia excede 120 ms |
| WAN Jitter above 30 ms | last(/ALDLNO-WAN-PROBE/net.speedtest.jitter)>30 |
Warning | Se activa si el jitter supera 30 ms |
| WAN Probe data not received in 2 hours | nodata(/ALDLNO-WAN-PROBE/net.speedtest.download,2h)=1 |
High | Se activa si el probe deja de enviar datos |
bash /usr/local/bin/wan_probe.sh
tail -n 50 /var/log/wan_probe.log
Prueba manual de ítems:
zabbix_sender -z 127.0.0.1 -s "ALDLNO-WAN-PROBE" -k net.speedtest.download -o 10
zabbix_sender -z 127.0.0.1 -s "ALDLNO-WAN-PROBE" -k net.speedtest.upload -o 3
zabbix_sender -z 127.0.0.1 -s "ALDLNO-WAN-PROBE" -k net.speedtest.ping -o 250
zabbix_sender -z 127.0.0.1 -s "ALDLNO-WAN-PROBE" -k net.speedtest.jitter -o 50
/usr/local/bin/wan_probe.sh cada 30 minutos.ITS4ALL – WAN Probe con estos ítems y triggers.GUAYAMA-WAN-PROBE, YABUCOA-WAN-PROBE, etc.).speedtest-cli falla frecuentemente, define un SERVER_ID o cambia a la utilidad oficial Ookla Speedtest CLI.Autor: Equipo Técnico ITS4ALL
Versión: 1.2 (Producción Estable con manejo de errores y reintento)
Última actualización: 2025-10-19