MANUAL: Mikrotik, colección de scripting

Cómo respaldar tu túnel IKEv2 con dos dominios DDNS mediante un script​


Debido a las caídas de los DDNS de Mikrotik, he buscado la forma de poder tener un respaldo para que mi túnel IKEv2 pueda seguir levantado en caso de que vuelvan a caer.

Las pruebas las he realizado en un túnel que tengo en producción tipo IKEv2 (con varias LANs interconectadas y un túnel EoIP) entre mi casa (Despacho), que sería la parte HQ del enlace y un apartamento que visito con regularidad por temas de trabajo aparte de la época vacacional, este último sería la parte Branch del enlace.

Esta es la configuración:

Lado HQ

Partimos que ya existe un túnel IPSec/IKEv2 funcionando con Certificados tipo *.sn.mynetname.net.
Ver este post para más información sobre este tipo de túnel: https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-ikev2-vpn-fondo.570958/

Creamos en HQ un segundo pack de Certificados: CA, VPN Server y Cliente, configurado con un DDNS distinto al *.sn.mynetname.net. En mi caso voy añadir un DDNS tipo NoIP (*.sytes.net).

Creamos un nuevo Identity:

Bash:
/ip ipsec identity
add auth-method=digital-signature certificate=vpn-server-noip comment=router-branch-noip \
generate-policy=port-strict match-by=certificate mode-config=ike2-conf-branch \
peer=ike2-peer policy-template-group=ike2-template-group\
remote-certificate=c1@prueba.sytes.net

Con esto ya hemos terminado en el lado HQ.

Lado Branch

Sobre el nuevo pack de Certificados creados y exportados en HQ, importamos Certificados CA y Cliente.

Creamos nuevo Peer y nueva Identity:

Bash:
# Creamos un nuevo peer que apunta al dominio DDNS creado.
/ip ipsec peer
add address=prueba.sytes.net exchange-mode=ike2 name=ike2-noip-peer profile=ike2-profile

# Nueva Identity con el certificado cliente de DDNS NoIP
/ip ipsec identity
add auth-method=digital-signature certificate=vpn-client-noip generate-policy=port-strict \
mode-config=request-only peer=ike2-noip-peer policy-template-group=ike2-template-group

Para conmutar manualmente, primero desactivas el Peer de <*.sn.mynetname.net> y después desactivas la Identity correspondiente.

Ahora vamos a activar, primero la Identity de <prueba.sytes.net> y después el Peer (el peer inicia la conexión desde este lado).

1631213921080.png


1631214066437.png



Si en algún momento vemos que alguna de las policies existentes no pasan a estado "established" solo hay que desactivarlas y volverlas a activar individualmente. Con esto quedan levantadas.

1631214154803.png



Bueno, para rizar el rizo, he creado un script totalmente funcional para automatizar la tarea de conmutar los Peers y las Identities de cada proveedor y así en caso de caída de uno de ellos, el script lo detectaría y lo cambiaría al proveedor que estuviera online. De esta forma el tunel IKEv2 levanta solito y las Policies las resetea para levanten igualmente.

Aparte de lo expuesto anteriormente, he creado en el lado "Branch" del túnel nuevas Policies para que apunten a cada dominio (cada Peer apunta a un dominio diferente), es decir, habría que crearlas por duplicado, tal como está en la imagen siguiente, y además etiquetar cada Policy para mejorar la funcionalidad del script.

OB9fQALzhX.png



Bash:
{
# Dirección IP del cualquier host activo del lado HQ
:local HOST "192.168.88.247"
# DDNS del router Mikrotik
:local DDNSMK "dXXXXXXXXXX9.sn.mynetname.net"
# Otro DDNS de respaldo
:local DDNSNOIP "prueba.sytes.net"
:local LOCATION "Despacho"
# Obtener el Peer activo
:local PEER [/ip ipsec active-peers get 0 id];
# Interface de la Red remota
:local GW "bridge-local"
# Tiempo de espera del ping. Aumente o disminuya según sea necesario
:local TIMEOUT "100ms"
# Número de pings a enviar
:local COUNT "10"
# Número de respuestas requeridas
:local LESSTHAN "8"

:log info "IKEv2: Tunnel Check Started"
:log info "IKEv2: Looking for $HOST at $LOCATION"

# Hacemos ping a una IP de la LAN del router HQ para comprobar si el túnel está levantado
# Si está caído ejecuta dos condicionales "IF".
:if ([/ping interface=$GW $HOST interval=$TIMEOUT count=$COUNT]<$LESSTHAN) do={
log error "IKEv2: Tunnel with $LOCATION is down, modifying DDNS...";

# Primera condición: comprueba si hay conectividad con el DDNS de Mikrotik.
# Si está levantado, omite esta condifión "IF" y pasa a la segunda.
# Si está caído ejecuta los siguientes comandos para conmutar al DDNS No-IP.
:if ([/ping $DDNSMK interval=$TIMEOUT count=$COUNT]<$LESSTHAN) do={

log info "IKEv2: Peer & Identity changed to <$DDNSNOIP>";
/ip ipsec peer disable 0
:delay 1s
/ip ipsec identity disable 0
:delay 2s
/ip ipsec identity enable 1
:delay 1s
/ip ipsec peer enable 1
:delay 5s

log info "IKEv2: Reset Policies...";
# A veces al conmutar de Peer e Identity, algunos Policies quedan en "no phase2"
# Reseteamos sólo los policies activos 
foreach i in=[/ip ipsec policy find ph2-state!=established !template !invalid] do={
ip ipsec policy disable number=$i
delay 10
ip ipsec policy enable number=$i
}

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Apartamento:</b> IKEv2 tunnel is Down%0APeer & Identity changed to:%0A$DDNSNOIP";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module
}

# Segunda condición: comprueba si hay conectividad con el DDNS de No-IP.
# Si está levantado, omite esta condifión "IF".
# Si está caído ejecuta los siguientes comandos para conmutar al DDNS Mikrotik.
:if ([/ping $DDNSNOIP interval=$TIMEOUT count=$COUNT]<$LESSTHAN) do={

log info "IKEv2: Peer & Identity changed to <$DDNSMK>";
/ip ipsec peer disable 1
:delay 1s
/ip ipsec identity disable 1
:delay 2s
/ip ipsec identity enable 0
:delay 1s
/ip ipsec peer enable 0
:delay 5s

log info "IKEv2: Reset Policies...";
# A veces al conmutar de Peer e Identity, algunos Policies quedan en "no phase2"
# Reseteamos sólo los policies activos 
foreach i in=[/ip ipsec policy find ph2-state!=established !template !invalid] do={
ip ipsec policy disable number=$i
delay 10
ip ipsec policy enable number=$i
}

# START Send Telegram Module
:local MessageText "\E2\9A\A0 <b>Apartamento:</b> IKEv2 tunnel is Down%0APeer & Identiy changed to:%0A$DDNSMK";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module
}
log info "IKEv2: Ready!";

} else {

:log warning "IKEv2: tunnel to $LOCATION is OK. Nothing to do";
/ip ipsec active-peers print

# START Send Telegram Module
:local MessageText "\E2\9C\85 <b>Apartamento:</b> IKEv2 tunnel is UP%0AActive Peer:%0A$PEER";
:local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
$SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module
}

}

Y eso es todo, espero que esta aportación le ayude a alguien si se encuentra en la misma situación, o simplemente quieres asegurar que el DDNS de Mikrotik no nos vuelve a dejar unos días sin acceso a nuestros "chacharros". No todo el mundo puede permitirse tener dos operadoras en casa/oficina o bien pagarse una IP fija.

S@lu2.
 
Última edición:
Script para actualizar la dirección WAN IP en tu DDNS de NoIP

Bash:
# No-IP automatic Dynamic DNS update

:local noipuser "usuario-noip"
:local noippass "contraseña-noip"
:local noiphost "host-noip"
:local inetinterface "pppoe-out1"
# aquí metes tu interfaz WAN que conecta a internet, en mi caso "pppoe-out1"

:global currentIP
:global previousIP

:if ([/interface get $inetinterface value-name=running]) do={
:local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address]
:for i from=( [:len $currentIP] - 1) to=0 do={
:if ( [:pick $currentIP $i] = "/") do={
:set currentIP [:pick $currentIP 0 $i]
}
}

:if ($currentIP != $previousIP) do={
:log info "No-IP: la IP actual $currentIP es distinta a la IP anterior, se necesita actualización"
:set previousIP $currentIP

:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP"
:local noiphostarray
:set noiphostarray [:toarray $noiphost]
:foreach host in=$noiphostarray do={
:log info "No-IP: Enviando actualizacion de $host"
/tool fetch url=($url . "&hostname=$host") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
:log info "No-IP: Es necesario actualizar. la dirección $host se actualizará con la IP $currentIP"
}
} else={
:log info "No-IP: La IP anterior $previousIP es igual a la IP actual, no es necesario actualizar"
}
} else={
:log info "No-IP: El interface $inetinterface en este momento no está operativo, no ha sido posible actualizar"
}

Muchas gracias por este script, la verdad que me parece muy interesante. He creado los dos scripts necesarios (sólo quiero que me avise por telegram) y por supuesto en telegram he creado el bot. El bot parece que funciona, ya que en paralelo he configurado también el script de aviso de log-in y log-out, y me avisa por telegram. Pero avisa si manualmente pincho en "run script". De lo contrario no lo hace automáticamente. Igualmente no he recibido aviso de cambio de IP WAN (aunque esto ya sabemos que no ocurre muy a menudo).

Mi pregunta es: una vez creados los scripts en la sección script, hay que irse a la sección scheduler y crear una entrada que ejecute los scripts cuando le indiquemos?
 
Muchas gracias por este script, la verdad que me parece muy interesante. He creado los dos scripts necesarios (sólo quiero que me avise por telegram) y por supuesto en telegram he creado el bot. El bot parece que funciona, ya que en paralelo he configurado también el script de aviso de log-in y log-out, y me avisa por telegram. Pero avisa si manualmente pincho en "run script". De lo contrario no lo hace automáticamente. Igualmente no he recibido aviso de cambio de IP WAN (aunque esto ya sabemos que no ocurre muy a menudo).

Mi pregunta es: una vez creados los scripts en la sección script, hay que irse a la sección scheduler y crear una entrada que ejecute los scripts cuando le indiquemos?
Un ejemplo:

1632299411305.png

En "On Event" pones el nombre del script tal cual lo creaste.
Este Schedule ejecuta el script "WANIP" todos los días a las 10 de la mañana.

S@lu2.
 
Os dejo 2 scripts que hacen sonar el speaker de los mikrotik para componer una melodia, no tienen demasiada utilidad pero me han parecido curiosos.

C:
#
# Star Wars Main Theme
# MikroTik Music
#
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=932 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=1000ms;
:delay 1010ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1047 length=667ms;
:delay 677ms;
:delay 333ms;

:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=932 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=1000ms;
:delay 1010ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1047 length=667ms;
:delay 677ms;

C:
#
# Super Mario theme
# MikroTik Music
#


:beep frequency=660 length=100ms;
:delay 150ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=510 length=100ms;
:delay 100ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=770 length=100ms;
:delay 550ms;
:beep frequency=380 length=100ms;
:delay 575ms;

:beep frequency=510 length=100ms;
:delay 450ms;
:beep frequency=380 length=100ms;
:delay 400ms;
:beep frequency=320 length=100ms;
:delay 500ms;
:beep frequency=440 length=100ms;
:delay 300ms;
:beep frequency=480 length=80ms;
:delay 330ms;
:beep frequency=450 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 200ms;
:beep frequency=660 length=80ms;
:delay 200ms;
:beep frequency=760 length=50ms;
:delay 150ms;
:beep frequency=860 length=100ms;
:delay 300ms;
:beep frequency=700 length=80ms;
:delay 150ms;
:beep frequency=760 length=50ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 300ms;
:beep frequency=520 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 150ms;
:beep frequency=480 length=80ms;
:delay 500ms;

:beep frequency=510 length=100ms;
:delay 450ms;
:beep frequency=380 length=100ms;
:delay 400ms;
:beep frequency=320 length=100ms;
:delay 500ms;
:beep frequency=440 length=100ms;
:delay 300ms;
:beep frequency=480 length=80ms;
:delay 330ms;
:beep frequency=450 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 200ms;
:beep frequency=660 length=80ms;
:delay 200ms;
:beep frequency=760 length=50ms;
:delay 150ms;
:beep frequency=860 length=100ms;
:delay 300ms;
:beep frequency=700 length=80ms;
:delay 150ms;
:beep frequency=760 length=50ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 300ms;
:beep frequency=520 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 150ms;
:beep frequency=480 length=80ms;
:delay 500ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 220ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=200ms;
:delay 300ms;

:beep frequency=1020 length=80ms;
:delay 300ms;
:beep frequency=1020 length=80ms;
:delay 150ms;
:beep frequency=1020 length=80ms;
:delay 300ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 420ms;

:beep frequency=585 length=100ms;
:delay 450ms;

:beep frequency=550 length=100ms;
:delay 420ms;

:beep frequency=500 length=100ms;
:delay 360ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 220ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=200ms;
:delay 300ms;

:beep frequency=1020 length=80ms;
:delay 300ms;
:beep frequency=1020 length=80ms;
:delay 150ms;
:beep frequency=1020 length=80ms;
:delay 300ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 420ms;

:beep frequency=585 length=100ms;
:delay 450ms;

:beep frequency=550 length=100ms;
:delay 420ms;

:beep frequency=500 length=100ms;
:delay 360ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=500 length=60ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=500 length=60ms;
:delay 350ms;
:beep frequency=500 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=430 length=80ms;
:delay 150ms;
:beep frequency=380 length=80ms;
:delay 600ms;

:beep frequency=500 length=60ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=500 length=60ms;
:delay 350ms;
:beep frequency=500 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 150ms;
:beep frequency=660 length=80ms;
:delay 550ms;

:beep frequency=870 length=80ms;
:delay 325ms;
:beep frequency=760 length=80ms;
:delay 600ms;

:beep frequency=500 length=60ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=500 length=60ms;
:delay 350ms;
:beep frequency=500 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=430 length=80ms;
:delay 150ms;
:beep frequency=380 length=80ms;
:delay 600ms;

:beep frequency=660 length=100ms;
:delay 150ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=510 length=100ms;
:delay 100ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=770 length=100ms;
:delay 550ms;
:beep frequency=380 length=100ms;
:delay 575ms;
 
Os dejo 2 scripts que hacen sonar el speaker de los mikrotik para componer una melodia, no tienen demasiada utilidad pero me han parecido curiosos.

C:
#
# Star Wars Main Theme
# MikroTik Music
#
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=932 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=1000ms;
:delay 1010ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1047 length=667ms;
:delay 677ms;
:delay 333ms;

:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=698 length=167ms;
:delay 177ms;
:beep frequency=932 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=1000ms;
:delay 1010ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1047 length=167ms;
:delay 177ms;
:beep frequency=1865 length=1000ms;
:delay 1010ms;
:beep frequency=1397 length=500ms;
:delay 510ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1175 length=167ms;
:delay 177ms;
:beep frequency=1245 length=167ms;
:delay 177ms;
:beep frequency=1047 length=667ms;
:delay 677ms;

C:
#
# Super Mario theme
# MikroTik Music
#


:beep frequency=660 length=100ms;
:delay 150ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=510 length=100ms;
:delay 100ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=770 length=100ms;
:delay 550ms;
:beep frequency=380 length=100ms;
:delay 575ms;

:beep frequency=510 length=100ms;
:delay 450ms;
:beep frequency=380 length=100ms;
:delay 400ms;
:beep frequency=320 length=100ms;
:delay 500ms;
:beep frequency=440 length=100ms;
:delay 300ms;
:beep frequency=480 length=80ms;
:delay 330ms;
:beep frequency=450 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 200ms;
:beep frequency=660 length=80ms;
:delay 200ms;
:beep frequency=760 length=50ms;
:delay 150ms;
:beep frequency=860 length=100ms;
:delay 300ms;
:beep frequency=700 length=80ms;
:delay 150ms;
:beep frequency=760 length=50ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 300ms;
:beep frequency=520 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 150ms;
:beep frequency=480 length=80ms;
:delay 500ms;

:beep frequency=510 length=100ms;
:delay 450ms;
:beep frequency=380 length=100ms;
:delay 400ms;
:beep frequency=320 length=100ms;
:delay 500ms;
:beep frequency=440 length=100ms;
:delay 300ms;
:beep frequency=480 length=80ms;
:delay 330ms;
:beep frequency=450 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 200ms;
:beep frequency=660 length=80ms;
:delay 200ms;
:beep frequency=760 length=50ms;
:delay 150ms;
:beep frequency=860 length=100ms;
:delay 300ms;
:beep frequency=700 length=80ms;
:delay 150ms;
:beep frequency=760 length=50ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 300ms;
:beep frequency=520 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 150ms;
:beep frequency=480 length=80ms;
:delay 500ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 220ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=200ms;
:delay 300ms;

:beep frequency=1020 length=80ms;
:delay 300ms;
:beep frequency=1020 length=80ms;
:delay 150ms;
:beep frequency=1020 length=80ms;
:delay 300ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 420ms;

:beep frequency=585 length=100ms;
:delay 450ms;

:beep frequency=550 length=100ms;
:delay 420ms;

:beep frequency=500 length=100ms;
:delay 360ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 220ms;

:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=200ms;
:delay 300ms;

:beep frequency=1020 length=80ms;
:delay 300ms;
:beep frequency=1020 length=80ms;
:delay 150ms;
:beep frequency=1020 length=80ms;
:delay 300ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=760 length=100ms;
:delay 100ms;
:beep frequency=720 length=100ms;
:delay 150ms;
:beep frequency=680 length=100ms;
:delay 150ms;
:beep frequency=620 length=150ms;
:delay 300ms;

:beep frequency=650 length=150ms;
:delay 300ms;
:beep frequency=380 length=100ms;
:delay 150ms;
:beep frequency=430 length=100ms;
:delay 150ms;

:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=430 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 100ms;
:beep frequency=570 length=100ms;
:delay 420ms;

:beep frequency=585 length=100ms;
:delay 450ms;

:beep frequency=550 length=100ms;
:delay 420ms;

:beep frequency=500 length=100ms;
:delay 360ms;

:beep frequency=380 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 300ms;
:beep frequency=500 length=100ms;
:delay 150ms;
:beep frequency=500 length=100ms;
:delay 300ms;

:beep frequency=500 length=60ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=500 length=60ms;
:delay 350ms;
:beep frequency=500 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=430 length=80ms;
:delay 150ms;
:beep frequency=380 length=80ms;
:delay 600ms;

:beep frequency=500 length=60ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=500 length=60ms;
:delay 350ms;
:beep frequency=500 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 150ms;
:beep frequency=660 length=80ms;
:delay 550ms;

:beep frequency=870 length=80ms;
:delay 325ms;
:beep frequency=760 length=80ms;
:delay 600ms;

:beep frequency=500 length=60ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=500 length=60ms;
:delay 350ms;
:beep frequency=500 length=80ms;
:delay 150ms;
:beep frequency=580 length=80ms;
:delay 350ms;
:beep frequency=660 length=80ms;
:delay 150ms;
:beep frequency=500 length=80ms;
:delay 300ms;
:beep frequency=430 length=80ms;
:delay 150ms;
:beep frequency=380 length=80ms;
:delay 600ms;

:beep frequency=660 length=100ms;
:delay 150ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=510 length=100ms;
:delay 100ms;
:beep frequency=660 length=100ms;
:delay 300ms;
:beep frequency=770 length=100ms;
:delay 550ms;
:beep frequency=380 length=100ms;
:delay 575ms;
Me apunto al de Star Wars! Lástima que mis routers no tengan sonido. Cachiss...
 
Añadida la versión 2.0 del script: Notificar las conexiones al servidor DHCP vía telegram

En esta nueva versión, asigna direcciones IP estáticas automáticamente a cualquier dispositivo que se conecte a nuestra LAN vía DHCP y le coloca una etiqueta con la fecha y hora. Además nos informa vía Telegram.

Incluye un pequeño script que elimina las IP estáticas que no han sido utilizadas en 100 semanas y además elimina la entrada DNS correspondiente a la concesión DHCP que se elimina.

S@lu2.
 

Monitorización de eventos específicos en el Log y notificación en Telegram​


Si deseas monitorizar los eventos específicos de tu registro de Mikrotik como: "excessive broadcast, loop, link down, fcs errors, etc" e intentos fallidos de inicio de sesión, este script te ayudará a un mayor control de tu sistema.

Puedes filtrar palabras dentro de los mensajes de su Log en la siguiente línea del script:

Bash:
:local startBuf [:toarray [/log find message~" failure" || message~"loop" || \
message~"down" || message~"fcs" || message~"excessive" || message~"logged" || \
message~"system"]]

y enviará todos los eventos deseados a tu bot/grupo de Telegram.

Pasos a seguir:

1- Agrega un nuevo script con el nombre "LogFilter"
2- Copie y pegue el código adjunto.
3- Edite la sección de SETUP y configure su Bot de telegram y el ChatID. Además de las palabras para filtrar eventos.
4- Ejecute el script por primera vez manualmente y el propio script creará una tarea de programación para que se ejecute cada minuto.

Bash:
# BEGIN SETUP Edit Here
:local myserver ([/system identity get name])
:local scheduleName "LogFilter"
:local bot "WRITE YOUR BOT ID"
:local ChatID "WRITE YOUR CHAT ID"
:local startBuf [:toarray [/log find message~" failure" || message~"loop" || message~"down" || message~"fcs" || message~"excessive" || message~"logged" || message~"system"]]
:local removeThese [:toarray ""]
# END SETUP

# warn if schedule does not exist and create it
:if ([:len [/system scheduler find name="$scheduleName"]] = 0) do={
    /log warning "[LogFilter] Alert : Schedule does not exist. Creating schedule ...."
    /system scheduler add name=$scheduleName interval=60s start-date=oct/08/2021 start-time=12:00:00 on-event=LogFilter
    /log war ning "[LogFilter] Alert : Schedule created ."
}

# get last time
:local lastTime [/system scheduler get [find name="$scheduleName"] comment]
# for checking time of each log entry
:local currentTime
# log message
:local message
# final output
:local output

:local keepOutput false
# if lastTime is empty, set keepOutput to true
:if ([:len $lastTime] = 0) do={
  :set keepOutput true
}

:local counter 0
# loop through all log entries that have been found
:foreach i in=$startBuf do={

    # loop through all removeThese array items
    :local keepLog true
    :foreach j in=$removeThese do={
    # if this log entry contains any of them, it will be ignored
        :if ([/log get $i message] ~ "$j") do={
        :set keepLog false
        }
    }

    :if ($keepLog = true) do={
        :set message [/log get $i message]
        # LOG DATE
        # depending on log date/time, the format may be different. 3 known formats
        # format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default
        :set currentTime [ /log get $i time ]

        # format of 00:00:00 which shows up on current day's logs
        :if ([:len $currentTime] = 8 ) do={
            :set currentTime ([:pick [/system clock get date] 0 11]." ".$currentTime)
        } else={
        # format of jan/01 00:00:00 which shows up on previous day's logs
            :if ([:len $currentTime] = 15 ) do={
                :set currentTime ([:pick $currentTime 0 6]."/".[:pick [/system clock get date] 7 11]." ".[:pick $currentTime 7 15])
            }
        }

        # if keepOutput is true, add this log entry to output
        :if ($keepOutput = true) do={
            :set output ($output.$currentTime." ".$message." %0A%0A ")
        }
        :if ($currentTime = $lastTime) do={
            :set keepOutput true
            :set output ""
        }
    }                                                                                                                            

    :if ($counter = ([:len $startBuf])-1) do={
        :if ($keepOutput = false) do={
            :if ([:len $message] > 0) do={
            :set output ($output.$currentTime." ".$message)
            }
        }
    }

    :set counter ($counter + 1)
}

if ([:len $output] > 0) do={
    /system scheduler set [find name="$scheduleName"] comment=$currentTime
    /tool fetch url="https://api.telegram.org/bot$bot/sendMessage\?chat_id=$ChatID&text=$myserver%0A%0A$output" keep-result=no;
}

Eso es todo.
S@lu2.
 
Última edición:
Añadida la versión 2.0 del script: Notificar las conexiones al servidor DHCP vía telegram

En esta nueva versión, asigna direcciones IP estáticas automáticamente a cualquier dispositivo que se conecte a nuestra LAN vía DHCP y le coloca una etiqueta con la fecha y hora. Además nos informa vía Telegram.

Incluye un pequeño script que elimina las IP estáticas que no han sido utilizadas en 100 semanas y además elimina la entrada DNS correspondiente a la concesión DHCP que se elimina.

S@lu2.
Muchas gracias!! Voy a probarlo
 
No consigo enviar notificaciones por Telegram. Si copio el comando y en vez de las variables introduzco directamente los valores y lo pego en el terminal envia el mensaje sin problemas.
En cambio, copia tal cual es script en el DHCP server, conecto un equipo y en el log da error:

Alerta DHCP: Fallo de notificación a Telegram

El principio he creado el script en system-scripts con el nombre MyTGBotSendMessage y despues en DHCP server, he copiado el script tal cual esta:

Código:
:local BotToken "XXXX:XXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;

:log info "Enviado Mensaje Telegram";

Código:
/ip dhcp-server lease
:if ($leaseBound = 1) do={
    :do {
        # Variables
        :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
        :local DeviceName [/system identity get name];
        # START Send Telegram Module
        :local MessageText "\E2\84\B9 <b>$DeviceName:</b> Info DHCP</b> %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Comentario: $Comment";
        :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        #END Send Telegram Module
        :log info "Alerta DHCP: $"lease-hostname" $leaseActMAC se ha conectado"
    } on-error={:log error "Alerta DHCP: Fallo de notificación a Telegram"}
}

Se me esta escapando algo? Gracias
 
No consigo enviar notificaciones por Telegram. Si copio el comando y en vez de las variables introduzco directamente los valores y lo pego en el terminal envia el mensaje sin problemas.
En cambio, copia tal cual es script en el DHCP server, conecto un equipo y en el log da error:

Alerta DHCP: Fallo de notificación a Telegram

El principio he creado el script en system-scripts con el nombre MyTGBotSendMessage y despues en DHCP server, he copiado el script tal cual esta:

Código:
:local BotToken "XXXX:XXXXXXXXXXXXXXXXX";
:local ChatID "XXXXXX";
:local parseMode "HTML";
:local SendText $MessageText;

/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$ChatID&parse_mode=$parseMode&text=$SendText" keep-result=no;

:log info "Enviado Mensaje Telegram";

Código:
/ip dhcp-server lease
:if ($leaseBound = 1) do={
    :do {
        # Variables
        :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
        :local DeviceName [/system identity get name];
        # START Send Telegram Module
        :local MessageText "\E2\84\B9 <b>$DeviceName:</b> Info DHCP</b> %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Comentario: $Comment";
        :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        #END Send Telegram Module
        :log info "Alerta DHCP: $"lease-hostname" $leaseActMAC se ha conectado"
    } on-error={:log error "Alerta DHCP: Fallo de notificación a Telegram"}
}

Se me esta escapando algo? Gracias
Pues había un pequeño error en el código (las cosas del copy-paste), ya está corregido en el post original y probado.

Pega de nuevo este código en el campo "script" del DHCP Server:

Bash:
/ip dhcp-server lease
:if ($leaseBound = 1) do={
    :do {
        # Variables
        :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
        :local DeviceName [/system identity get name];
        # START Send Telegram Module
        :local MessageText "\E2\84\B9 <b>$DeviceName: Info DHCP</b> %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Comentario: $Comment";
        :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        #END Send Telegram Module
        :log info "Alerta DHCP: $"lease-hostname" $leaseActMAC se ha conectado"
    } on-error={:log error "Alerta DHCP: Fallo de notificación a Telegram"}
}

S@lu2.
 
Última edición:
Si quieres que sólo te avise de las Leases de nuevos dispositivos ajenos a los que actualmente tienes registrados:

Bash:
# Primero, asegúrate que tus propios dispositivos tengan IP estática, si no...
/ip dhcp-server lease make-static [find where dynamic]

# Ahora reemplaza esta línea de tu script actual:
:if ($leaseBound = 1) do={

# Por esta:
:if ($leaseBound = 1 && [ get [ find where mac-address=$leaseActMAC ] dynamic ] = true) do={
Igual estoy equivocado, pero en vez de true no tendria que ser false?
 
Igual estoy equivocado, pero en vez de true no tendria que ser false?
No es así.

Código:
:if ($leaseBound = 1 && [ get [ find where mac-address=$leaseActMAC ] dynamic ] = true) do={

Esta línea, te está diciendo que para que se ejecute lo que hay dentro de "do={}" deben cumplirse dos condiciones: la primera que tus dispositivos se conecten al DHCP y la segunda que la concesión del lease sea del tipo "dinámica". No sería de aplicación a los dispositivos que tengan aplicado el "make static".

Sin embargo, la siguiente línea, sería de aplicación para todas las leases, tanto dinámicas como estáticas.

Código:
:if ($leaseBound = 1) do={

Te animo a que lo vayas probando en tu propio equipo, es la mejor forma de entender este tipo de scripts (así lo hice yo sin conocer nada de programación).

S@lu2.
 
Última edición:
Arriba