MANUAL: Mikrotik, colección de scripting

Que versión de RouterOS tienes?

Edito: veo que estás mezclando scripts, es imposible que te funcione si llamas a una variable que no está declarada.

Pruébalo así:

Código:
:global tempSystem [/system health get temperature]
# Para versiones de RouterOS >7.0 anular la anterior línea por la siguiente
# :global tempSystem [/system health get [find name=temperature] value]
:local DeviceName [/system identity get name]
:local tempMax "30";

:if ($tempSystem >= $tempMax) do={
:log error "Alerta de Temperatura ALTA: $tempSystem C";

# START Send Email
/tool e-mail send to="destinatario@gmail.com" subject="\E2\9A\A0 Router Mikrotik $DeviceName: Alerta de temperatura" body="Temperatura alta: $tempSystem";
# END Send Email

} else={
:log warning "La temperatura está dentro de los valores normales: $tempSystem C"
}

S@lu2.
Muchas gracias!!
Lo pruebo y te digo.
Una duda tonta de novato, con poner este script, la temperatura se monitoriza de forma continua, o es necesario activar el script en schedule cada x tiempo?

Saludos
 
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"
}
Buenas tardes,

Este script funciona con el el firmware version 7?
Lo ultimo que veo en el log es No-IP: Enviando actualizacion de HOSTNAME , parece que se queda en el /tool por algun error.

Edito: funciona, era un tema de permisos del script, solo le habia puesto lectura. Una vez activo los permisos para todo a funcionado. Que permisos serian necesarios para la ejecución?
Hace falta alguna tarea para que se ejecute o con el script es suficiente?

Gracias
 
Última edición:
Que permisos serian necesarios para la ejecución?
Hace falta alguna tarea para que se ejecute o con el script es suficiente?

Gracias
Los permisos que te dan por defecto es suficiente, pero por lo general con read, write, policy y test sería suficiente, ya lo vas probando.

La ejecución de los scripts necesitan el Scheduler para programarlos, ya depende de las necesidades de cada uno para establecer los horarios.

S@lu2.
 
Los permisos que te dan por defecto es suficiente, pero por lo general con read, write, policy y test sería suficiente, ya lo vas probando.

La ejecución de los scripts necesitan el Scheduler para programarlos, ya depende de las necesidades de cada uno para establecer los horarios.

S@lu2.
Por defecto como vienen todos los permisos activados menos el dude por eso quite algunos. De momento con read, write, policy y test funciona bien.
Tambien he puesto un Scheduler y se activa segun periodo que le he puesto de repeticion, gracias :)

Sobre el sript de actualizar la IP de No-IP tengo una duda. Primero defines como Global la variable currentIP y en cambio luego como Local nuevamente, entiendo que lo suyo seria dejarlo como Global y donde se define como local poner :set y dejarlo como previusIP para verlo en Environment los dos?
 
Por defecto como vienen todos los permisos activados menos el dude por eso quite algunos. De momento con read, write, policy y test funciona bien.
Tambien he puesto un Scheduler y se activa segun periodo que le he puesto de repeticion, gracias :)

Sobre el sript de actualizar la IP de No-IP tengo una duda. Primero defines como Global la variable currentIP y en cambio luego como Local nuevamente, entiendo que lo suyo seria dejarlo como Global y donde se define como local poner :set y dejarlo como previusIP para verlo en Environment los dos?
Tienes razón,

Se ha colado la variable global currentIP ya he actualizado el post eliminándola, gracias.
La única global válida es previousIP

S@lu2.
 
Última edición:
Mantener el dominio DDNS de DynDNS actualizado con nuestra IP Pública

Encontré este script hace algún tiempo por internet y creo que es interesante para aquellos que utilizamos este servicio.

*la :p es que cambia los ": p" por un emoticono

# Cambiar las variables con vuestros datos de cliente de DynDNS
:local username "Usuario DynDNS"
:local password "Contraseña DynDNS"
:local hostname "pericodelospalotes.dyndns.org"

:global dyndnsForce
:global previousIP

# Muestra la IP previa en el log
:log info ("UpdateDynDNS: previousIP = $previousIP")

# Se obtiene la actual dirección IP de internet
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
:delay 1
:local result [/file get dyndns.checkip.html contents]

# Actualiza el resultado de la IP actual
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:local currentIP [:pick $result $startLoc $endLoc]
:log info "UpdateDynDNS: currentIP = $currentIP"

# Determina si es necesario actualizar DynDNS y actualiza en caso necesario

:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={
:set dyndnsForce false
:set previousIP $currentIP
:log info "$currentIP or $previousIP"
/tool fetch user=$username password=$password mode=http address="members.dyndns.org" \
src-path="nic/update?system=dyndns&hostname=$hostname&myip=$currentIP&wildcard=no" \
dst-path="/dyndns.txt"
:delay 1
:local result [/file get dyndns.txt contents]
:log info ("UpdateDynDNS: Dyndns Actualizacion necesaria")
:log info ("UpdateDynDNS: Dyndns resultado de la actualizacion: ".$result)
:put ("Dyndns Resultado de la actualizacion: ".$result)
} else={
:log info ("UpdateDynDNS: No es necesario actualizar la IP")
}
 
add interval=1d name=logging on-event=clear-logs \ policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-date=jan/01/2021 start-time=00:00:00
Gracias una vez más. Al aplicar ese código me devuelve un error en línea 1. ¿qué hago mal?

Código:
[admin@MikroTik] > add interval=1d name=logging on-event=clear-logs \
\... policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
\...     start-date=jan/01/2021 start-time=00:00:00
bad command name add (line 1 column 1)
[admin@MikroTik] >

Gracias
 
tal vez falte añadir lo de /system scheduler... y, en mi caso, actualizo la fecha del start date a una actualizada.

Código:
/system scheduler
add interval=1d name=logging on-event=clear-logs \
\... policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
\...     start-date=feb/20/2022 start-time=00:00:00

Espero que funcione.
Slts.
 
tal vez falte añadir lo de /system scheduler... y, en mi caso, actualizo la fecha del start date a una actualizada.

Código:
/system scheduler
add interval=1d name=logging on-event=clear-logs \
\... policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
\...     start-date=feb/20/2022 start-time=00:00:00

Espero que funcione.
Slts.
¡Muchas gracias!
Lamentablemente, algo sigue sin funcionar. He considerado interesante tratar de aplicar este script para que limpie los logs todas las noches, ya que desconozco si, por el contrario, los almacena hasta que se llena la memoria interna.


Código:
[admin@MikroTik] > /system scheduler
[admin@MikroTik] /system/scheduler> add interval=1d name=logging on-event=clear-logs \
\... \... policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
expected end of command (line 2 column 1)
[admin@MikroTik] /system/scheduler> \...     start-date=feb/20/2022 start-time=00:00:00

Gracias
 
Los logs solo pintan 100 o 1000 líneas, dependiendo de la versión de RouterOS.
Incluso mejor que borrarlos, es modificar el tópico para que sólo pinte mensajes de warning y de error, y no escriba nada en info. Así no os perderéis mensajes que sí son recomendable que veáis.

ejemplo, parar el topic info:

Código:
/system logging set [find topics=info] disabled=yes

Saludos!
 
Muy buenas,

Añadida modificación del script: Notificar las conexiones al servidor DHCP vía telegram

Esta modificación permite conocer a qué interfaz wireless se ha conectado un host a nuestro DHCP. Muy útil si quieres saber a dónde te has conectado en casa/oficina cuando tienes varios APs gestionados por CAPsMAN.

Para ello coteja las direcciones MAC obtenidas por DHCP al conectarse mediante la variable $leaseActMAC y la compara con la MAC de Registration Table (CAPsMAN) y si coincide pedimos el valor de la interfaz wireless a la que se ha conectado.

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 interFace [/caps-man/registration-table get [find where mac-address=$leaseActMAC] interface]
     
        # START Send Telegram Module
        :local MessageText "\E2\84\B9 <b>Despacho: Info DHCP</b> %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Radio: $interFace %0D%0A Comentario: $Comment";
        :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        # END Send Telegram Module
     
        :log info "Enviada alerta DHCP de $"lease-hostname" $leaseActMAC"
    } on-error={:log error "Fallo de notificación a Telegram"}
}

Resultado:

1645810227748.png


S@lu2.
 
Última edición:
Hola, tengo una raspberry donde está corriendo piHole, pero resulta que como siempre cuando estoy lejos de casa es cuando pasan las cosas estuve pensando en hacer un script que me vaya chequeando cada cierto tiempo por ejemplo 5 minutos si el host está levantado (se me ha dado el caso que las mujeres limpiando me han apagado la raspeberry o me han aflojado el cable de red que no entra muy bien) y en ese caso todos empiezan a gritar porque al no tener DNS no tienen internet, el caso es si logro detectar que el host está caído pudiera cambiar en el servidor DHCP el servidor DNS y para que apunte al router principal, he estado probando ponerle los dos IP, el del piHole y luego el del router pero me he dado cuenta que en muchas ocasiones las peticiones las hace al router en vez de al piHole, por eso solo dejé el del piHole.
Me pudiera alguno de los entendidos darme una mano, es que en estos momento no tengo mucho tiempo para dedicarle a estudiarlo. Gracias.
 
Hola, tengo una raspberry donde está corriendo piHole, pero resulta que como siempre cuando estoy lejos de casa es cuando pasan las cosas estuve pensando en hacer un script que me vaya chequeando cada cierto tiempo por ejemplo 5 minutos si el host está levantado (se me ha dado el caso que las mujeres limpiando me han apagado la raspeberry o me han aflojado el cable de red que no entra muy bien) y en ese caso todos empiezan a gritar porque al no tener DNS no tienen internet, el caso es si logro detectar que el host está caído pudiera cambiar en el servidor DHCP el servidor DNS y para que apunte al router principal, he estado probando ponerle los dos IP, el del piHole y luego el del router pero me he dado cuenta que en muchas ocasiones las peticiones las hace al router en vez de al piHole, por eso solo dejé el del piHole.
Me pudiera alguno de los entendidos darme una mano, es que en estos momento no tengo mucho tiempo para dedicarle a estudiarlo. Gracias.
Tienes el pi-hole mal configurado en el dhcp. Si lo tuvieras bien, ese comportamiento no se da. Entrega en el dhcp el pi-hole como dns primario, y uno público o el router como secundario, y fin del problema. Si optas por anunciar el router como dns secundario, asegúrate de que su dns padre es público, y de que están permitidas las peticiones dns al propio router marcando el “allow remote request”

Saludos!
 
Gracias pokoyo, esa fue la primera versión que usé, si te fijas lo comenté ahí, lo que pasa es que aunque el primer dns sea el de pi hole, no se que pasa que en muchas ocasiones quien responde es el secundario es decir el del router que si tiene como dns de consulta uno público y tiene activado el Allow Remote Request. Incluso pensé y de hecho lo puse como primer dns del router al del pi hole y luego los públicos, de tal manera que si en realidad el Pihole está caído cuando consulte al router, el router tampoco podrá consultar al Pihole por lo que responderá con los siguientes, los públicos, y de no estar caído éste consulte al Pihole por lo que si o si tendrá que responder con el Pihole, lo que pasa es que esa configuración no me convence,no me gusta. Que tu crees?
 
El router no entiende de primarios ni secundarios en IP > DNS. Ahí sólo deberías tener DNS públicos, puesto que los consulta alternativamente. Es decir, ni pongas ahí el pi-hole, ni el pi-hole mezclado con uno público. En IP > DNS, sólo servidores públicos.

Sin embargo, en el DHCP, cuando entregas servidores DNS, los sistemas operativos sí que reconocen primario y secundario, y normalmente el secundario no se usa, a menos que el primario falle.

Por eso te digo que, con casi total seguridad, tienes el tema mal configurado.

Créeme que he probado todas las combinaciones que se te ocurran, y es la única que no deja tirado el router sin DNS y al mismo tiempo funciona, en una situación donde la máquina del pi-hole se vaya al garete y no responda.

Saludos!
 
Si, en el servidor DHCP es donde lo ponía, en el primario el PIHOLE y en el secundario del router, pero aún así muchas veces cogía el secundario, me doy cuenta porque empiezan a salir los anuncios. De todas maneras como estaré una semana fuera de casa lo dejaré así, luego me pondré a estudiar los script..
Muchas gracias
 
Hola, tengo una raspberry donde está corriendo piHole, pero resulta que como siempre cuando estoy lejos de casa es cuando pasan las cosas estuve pensando en hacer un script que me vaya chequeando cada cierto tiempo por ejemplo 5 minutos si el host está levantado (se me ha dado el caso que las mujeres limpiando me han apagado la raspeberry o me han aflojado el cable de red que no entra muy bien) y en ese caso todos empiezan a gritar porque al no tener DNS no tienen internet, el caso es si logro detectar que el host está caído pudiera cambiar en el servidor DHCP el servidor DNS y para que apunte al router principal, he estado probando ponerle los dos IP, el del piHole y luego el del router pero me he dado cuenta que en muchas ocasiones las peticiones las hace al router en vez de al piHole, por eso solo dejé el del piHole.
Me pudiera alguno de los entendidos darme una mano, es que en estos momento no tengo mucho tiempo para dedicarle a estudiarlo. Gracias.
Hola, respecto a lo que comentas de chequear una IP si está levantada e informarte, puedes utilizar la herramienta de mikrotik "Netwatch" para chequear cuando cualquier IP esté UP o Down.

Mas info: https://wiki.mikrotik.com/wiki/Manual:Tools/Netwatch

En este mismo hilo hay un script que lo puedes tomar como referencia: https://www.adslzone.net/foro/mikrotik.199/manual-mikrotik-coleccion-scripting.575217/page-7#post-3624183

S@lu2.
 

Script para informar cuando un usuario se ha logueado en el router (1/2)​

Este script recupera las sesiones activas realizadas por cualquier vía, como winbox, ssh, etc. y envía un correo electrónico al administrador informando del número de sesiones activas.

Requiere permisos: read, write, policy, test.
Programar la llamada al script cada 10-15 min (a gusto de cada usuario)

Bash:
# written by Sergei Eremenko (https://github.com/SmartFinn)
# modified by @diamuxin

:global TokensOfLoggedUsers
# :local emailAddress "destinatario@gmail.com"
:local token
:local tokenList
:local newSession
:local msgBody ""

/user active {
  :foreach session in=[find via!="api"] do={
    :set token ([get $session name]."-".[get $session via]."-".[get $session when]);
    :set tokenList ($token.",".$tokenList);
    :set newSession true;
    :foreach savedToken in=$TokensOfLoggedUsers do={
      :if ($savedToken = $token) do={
        :set newSession false;
      }
    };
    :if ($newSession) do={
      :set msgBody ($msgBody.[get $session name]." logged in from ".[get $session address]);
      :set msgBody ($msgBody." via ".[get $session via]." at ".[get $session when]."\r\n");
    }
  }
};
if ($msgBody != "") do={
  :local msgSubj ("New user(s) logged in to ".[/system identity get name]);
  :set msgBody ($msgBody."\r\n"."At ".[/system clock get time]);
  :set msgBody ($msgBody.", ".[/user active print count-only]." management session(s)");
  :set msgBody ($msgBody." is active on ".[/system identity get name]);
# La siguiente línea del script original se sustituye por el módulo Email
# /tool e-mail send to=$emailAddress subject=$msgSubj body=$msgBody;

# START Send Email Module
  :local SendTo "destinatario@gmail.com";
  :local Subject $msgSubj;
  :local MessageText $msgBody;
  :local FileName "";
  :local SendEmail [:parse [/system script get SendEmailFunction source]];
  $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module

};

:set TokensOfLoggedUsers [:toarray $tokenList];

Recibimos un email como este:

Ver el adjunto 85332

Script para informar sobre intentos fallidos de Login y bloquea la IP (2/2)​

Como continuación al anterior script, el siguiente informa por correo electrónico sobre los intentos fallidos de Login (configurable, en este caso con más de 2 intentos) y acto seguido mete las IPs "atacantes" en una lista de direcciones y se bloquea el acceso al router a través de una regla de firewall.

Creamos una regla específica de Logging que recopila los topics "critical,system,error" que provocan cada evento de fallo de login.

Bash:
/system logging action
add name=failedauth target=memory
/system logging
add action=failedauth topics=critical,system,error

Creamos un script con el nombre: CheckFailureLoginUser

Bash:
# By PhallaCCMT (phallaccmt.blogsport.com)
# Modified by @diamuxin

:local logBuffer "failedauth"
:local failthreshold 2
:local blocklist "Lst_AttemptLoginIP"
:local GTime [:pick [/system clock get time] 0 8]
:local DeviceName [/system identity get name];

# ----------------------------------------------------------------------------------------

:local attackiparray {0}
:local attackcountarray {0}
:local logEntryTopics
:local logEntryTime
:local logEntryMessage
:local clearedbuf
:local lines
:local datetime [/system clock get date]
:set clearedbuf 0

:local i 0
:foreach rule in=[/log print as-value where buffer=($logBuffer)] do={
# Now all data is collected in memory..

# Clear log buffer right away so new entries come in
   :if ($clearedbuf = 0) do={
      /system logging action {
         :set lines [get ($logBuffer) memory-lines]
         set ($logBuffer) memory-lines 1
         set ($logBuffer) memory-lines $lines
      }
      :set clearedbuf 1
   }
# End clear log buffer

   :set logEntryTime ""
   :set logEntryTopics ""
   :set logEntryMessage ""

:set logEntryTime ($rule->"time")
:set logEntryTopics ($rule->"topics")
:set logEntryMessage ($rule->"message")

:if ($logEntryMessage~"login failure") do={

:local attackip [:pick $logEntryMessage ([:find $logEntryMessage "from "]+5) ([:find $logEntryMessage " via"])]

:local x 0
:foreach ip in=$attackiparray do={
  :if ($ip = $attackip) do={
    :set ($attackcountarray->$x) (($attackcountarray->$x)+1)
  } else={
    :set ($attackiparray->$i) $attackip
    :set ($attackcountarray->$i) 1
  }
:set x ($x+1)
}
}
:set i ($i+1)
# end foreach rule
}
:local z 0
:foreach ip in=$attackiparray do={
  :if ($attackcountarray->$z > $failthreshold) do={
    :set ($attackcountarray->$z) 0
    /ip firewall address-list add address=($attackiparray->$z) list=$blocklist timeout=86400

    # START Send Email Module
    :local SendTo "destinatario@gmail.com";
    :local Subject "\E2\9A\A0 MikroTik alert on $datetime";
    :local MessageText "Your Router ($DeviceName) is attempt login by: $attackiparray at $GTime. Now it has been add to block list.";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
    # END Send Email Module

  }
:set ($attackcountarray->$z) 0
:set z ($z+1)
}

Creamos la tarea de programación del script con el mismo nombre: CheckFailureLoginUser (aunque puedes llamarlo como quieras)

Bash:
/system scheduler
add interval=20s name=CheckFailureLoginUser on-event=CheckFailureLoginUser \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-date=aug/18/2021 start-time=12:00:00

Por último la regla de firewall que bloquea los accesos de la address list: Lst_AttemptLoginIP

Bash:
/ip firewall filter
add action=drop chain=input comment="Drop Attempt Login User" disabled=yes src-address-list=Lst_AttemptLoginIP

Cuando el script detecta (se ejecuta cada 20s) que hay varios intentos fallidos de Login (>2) bloquea la IP y nos informa con un correo electrónico como este:

Ver el adjunto 85374

Efectivamente, desde esa IP ya no se puede acceder, ni vía Winbox ni por SSH.

Editado 10/dic/2021: Scripts compatibles con versión 7.1

a) Script para informar cuando un usuario se ha logueado en el router (1/2)


Bash:
# written by Sergei Eremenko (https://github.com/SmartFinn)
# modified by @diamuxin

:global TokensOfLoggedUsers
# :local emailAddress "destinatario@gmail.com"
:local token
:local tokenList
:local newSession
:local msgBody ""

/user active {
  :foreach session in=[find via!="api"] do={
    :set token ([get $session name]."-".[get $session via]."-".[get $session when]);
    :set tokenList ($token.",".$tokenList);
    :set newSession true;
    :foreach savedToken in=$TokensOfLoggedUsers do={
      :if ($savedToken = $token) do={
        :set newSession false;
      }
    };
    :if ($newSession) do={
      :set msgBody ($msgBody.[get $session name]." logged in from ".[get $session address]);
      :set msgBody ($msgBody." via ".[get $session via]." at ".[get $session when]."\r\n");
    }
  }
};
if ($msgBody != "") do={
  :local msgSubj ("New user(s) logged in to ".[/system identity get name]);
  :set msgBody ($msgBody."\r\n"."At ".[/system clock get time]);
  :set msgBody ($msgBody.", ".[/user active print count-only]." management session(s)");
  :set msgBody ($msgBody." is active on ".[/system identity get name]);
# La siguiente línea del script original se sustituye por el módulo Email
# /tool e-mail send to=$emailAddress subject=$msgSubj body=$msgBody;

# START Send Email
/tool e-mail send to="destinatario@gmail.com" subject="$msgSubj" body="$msgBody" file="";
# END Send Email

};

:set TokensOfLoggedUsers [:toarray $tokenList];

b) Script para informar sobre intentos fallidos de Login y bloquea la IP (2/2)


Bash:
# Creamos un script con el nombre: CheckFailureLoginUser
# By PhallaCCMT (phallaccmt.blogsport.com)
# Modified by @diamuxin
:local logBuffer "failedauth"
:local failthreshold 2
:local blocklist "Lst_AttemptLoginIP"
:local GTime [:pick [/system clock get time] 0 8]
:local DeviceName [/system identity get name];
# ----------------------------------------------------------------------------------------
:local attackiparray {0}
:local attackcountarray {0}
:local logEntryTopics
:local logEntryTime
:local logEntryMessage
:local clearedbuf
:local lines
:local datetime [/system clock get date]
:set clearedbuf 0
:local i 0

:foreach rule in=[/log print as-value where buffer=($logBuffer)] do={

# Now all data is collected in memory..
# Clear log buffer right away so new entries come in
   :if ($clearedbuf = 0) do={
      /system logging action {
         :set lines [get ($logBuffer) memory-lines]
         set ($logBuffer) memory-lines 1
         set ($logBuffer) memory-lines $lines
      }
      :set clearedbuf 1
   }
# End clear log buffer

   :set logEntryTime ""
   :set logEntryTopics ""
   :set logEntryMessage ""

:set logEntryTime ($rule->"time")
:set logEntryTopics ($rule->"topics")
:set logEntryMessage ($rule->"message")
:if ($logEntryMessage~"login failure") do={
:local attackip [:pick $logEntryMessage ([:find $logEntryMessage "from "]+5) ([:find $logEntryMessage " via"])]
:local x 0

:foreach ip in=$attackiparray do={
  :if ($ip = $attackip) do={
    :set ($attackcountarray->$x) (($attackcountarray->$x)+1)
  } else={
    :set ($attackiparray->$i) $attackip
    :set ($attackcountarray->$i) 1
  }
:set x ($x+1)
}
}
:set i ($i+1)
# end foreach rule
}
:local z 0
:foreach ip in=$attackiparray do={
  :if ($attackcountarray->$z > $failthreshold) do={
    :set ($attackcountarray->$z) 0
    /ip firewall address-list add address=($attackiparray->$z) list=$blocklist timeout=86400

    # START Send Email
    /tool e-mail send to="destinatario@gmail.com" subject="\E2\9A\A0 MikroTik alert on $datetime" body="Your Router ($DeviceName) is attempt login by: $attackiparray at $GTime. Now it has been add to block list." file="";
    # END Send Email

   }
:set ($attackcountarray->$z) 0
:set z ($z+1)
}

Hola!
Tengo un router que nos enviaba un log con las conexiones del dia que se hacian con las VPN pero desde la 7.1 no me funciona, el log que me envia todos los dias contienen los registros de todos los dias desde que actualize el mikrotik, aunque borro el fichero vuelve a generarlo con todos los datos... me encuentro desconcertado, creo que fue un error actualizar
estoy viendo el tuyo y lo he probado, me conecto, ejecuto el script y me notifica, me desconecto, me vuelvo a conectar y paso el script y no me notifica de esta nueva conexion
Mis conocimientos de scripts son algo basicos, quiero hacer el script que genere un reporte de conexiones-desconexiones diarias de las VPN y que notifique cuales estan activas o que envie mail cuando se conecta y desconecta un usuario
como podria adaptarlo?

edito: es lunes y acabo de darme cuenta que este es el script de logarse via winbox, ssh... pero no de las VPN. cagada, por eso no me notificaba, era la conexion winbox
 
Última edición:
Arriba