Mikrotik Script para bloquear intentos de login

Leyendo en el foro de mikrotik me encontre con este script que monitorea el log en busca errores , Y bloquea en base a la cantidad de intentos de acceso. Lo interesante es que podemos configurarlo para detectar distintos tipos de acceso. Por ejemplo los famosos intentos de acceso por VPN Ipsec que dicen «phase1 negotiation failed…». O los accesos erroneos por winbox nos dirian «login failure for user», etc.

Paso 1, importar script pegando esto en la terminal.

/sys script 
add dont-require-permissions=no name=LoginAttempBlocker owner=usuario policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="# Check if exist drop \
    firewall rule and add\r\
    \n/ip firewall raw\r\
    \n:if ([:len [find where src-address-list=\"blockedUsers\"]] = 0) do={\r\
    \n    add action=drop chain=prerouting src-address-list=blockedUsers\r\
    \n}\r\
    \n\r\
    \n:global lastLogLogin\r\
    \n:if ([:typeof \$lastLogLogin] != \"num\") do={:set lastLogLogin 0}\r\
    \n\r\
    \n/log\r\
    \n:global maxattampt 3\r\
    \n:global errorArray [:toarray \"\"]\r\
    \n:global failmsg    \"login failure for user \"\r\
    \n:global frommsg    \" from \"\r\
    \n:global viamsg     \" via \"\r\
    \n:global listfail   \"blockedUsers\"\r\
    \n:local  id2num     do={:return [:tonum \"0x\$[:pick \$1 1 [:len \$1]]\"]}\r\
    \n\r\
    \n:foreach rlog in=[find where (([\$id2num \$\".id\"] > \$lastLogLogin) \\\r\
    \n                             and \\\r\
    \n                             (message~\"((25[0-5]|(2[0-4]|[01]\\\?[0-9]\\\?)[0-9])\\\\.){3}(25[0-5]|(2[0-4]|[01]\\\?[0-9]\\\?)[0-9])\"))] do={\r\
    \n    \r\
    \n    :set lastLogLogin [\$id2num \$rlog]\r\
    \n    :local rmess [get \$rlog message]\r\
    \n    :if ((\$rmess~\$failmsg) and (\$rmess~\$frommsg) and (\$rmess~\$viamsg)) do={\r\
    \n         :local userinside [:pick \$rmess ([:find \$rmess \$failmsg -1] + [:len \$failmsg]) [:find \$rmess \$frommsg -1]]\r\
    \n         :local ipinside   [:pick \$rmess ([:find \$rmess \$frommsg -1] + [:len \$frommsg]) [:find \$rmess \$viamsg -1]]\r\
    \n         :local intinside  [:pick \$rmess ([:find \$rmess \$viamsg -1] + [:len \$viamsg]) [:len \$rmess]]\r\
    \n         :if ([:typeof ((\$errorArray)->\$ipinside)] = \"nothing\") do={\r\
    \n             :set ((\$errorArray)->\$ipinside) 1\r\
    \n         } else={\r\
    \n             :set ((\$errorArray)->\$ipinside) (((\$errorArray)->\$ipinside) + 1) \r\
    \n         }\r\
    \n         :if (((\$errorArray)->\$ipinside) > (\$maxattampt - 1)) do={\r\
    \n             /ip firewall address-list\r\
    \n             :if ([:len [find where list=\$listfail and address=\$ipinside]] = 0) do={\r\
    \n                 add list=\$listfail address=\$ipinside comment=\"\$rmess\" timeout=24h\r\
    \n             }\r\
    \n         }\r\
    \n         \r\
    \n    }\r\
    \n}"

Paso 2, configurar el script editando las variables globales:

:global maxattampt 3
:global failmsg    "login failure for user "
:global frommsg    " from "
:global viamsg     " via "
:global listfail  "blockedUsers"

3 serian la cantidad de intentos que toleramos. (para bloquear en un cuarto intento).

login from user, from y via van a depender del mensaje en el log que querramos capturar. Si quieren filtrar intentos de acceso por winbox entonces dejarlo como esta.

blockedUsers es la lista del firewall que se crea dinamicamente con la/s IP del usuario que intenta acceder.

Paso 3, agregar tu script al calendario para que se ejecute cada 5 minutos o menos.

Esto hara que nuestro script lea el log cada 5 minutos. Mas ajustemos el tiempo, mas eficiente sera el chequeo de acceso. Si dentro de estos 5 minutos, hubo 3 o mas intentos, automaticamente se creara una regla en el Firewall Raw, y borrara todo el input desde la direccion IP dinamica detectada en la lista blockedUsers. Se entiende que en las proximas 24 hs caducara la direccion y volvera a tener acceso.

______________

origen: tech-nico.com

Mikrotik RouterOS NAT – Masquerade y Netmap

Existen varios tipos de NAT para diferentes propósitos. Todos conocemos el clásico «Masquerade«, que siempre utilizamos en los mikrotik de nuestros clientes, pero a veces trae algunos problemas extraños en la navegación que por suerte resuelve Netmap.

Además de action=masquerade también existe action=netmap. Los dos son muy similares entre si (hay una linea muy delgada entre uno y otro).

Tipos de NAT a grandes rasgos

  • Masquerade traduce desde 1 sola dirección publica, y permite un WAN con direcciones dinámicas. (también conocida como NAT dinámica).
  • Src-nat traduce de 1 a muchos. (Nat conocido para cuando hacemos port forwarding).
  • Netmap mapea de 1 a 1 Publica:Privada. (Conocida como NAT estatica).

Uno de los usos posibles NETMAP:

En mi escenario, mi proveedor superior routeaba las direcciones públicas a través de un punto a punto privado /29. De esta manera en tu WAN vas a tener una dirección IP Privada, y tu GW también va a ser privado. Entonces para poder tener salida con origen publico (hacia afuera), hay que configurar el GW público de tus abonados en una interfaz Privada. Los ISP que hacen esto realmente piensan en no desperdiciarnos ninguna dirección IP pública.

NOTA: Si el origen de la salida sería privado, muchos proveedores superiores que utilizan BGP, filtran el origen de tráfico en rangos privados.

Algunos ISP que han tenido que NATEAR en el escenario anterior (utilizando action=masquerade simplemente no funciona) lo que hacen es resolverlo agregar otro equipo Mikrotik dedicado al NATEO. Entonces de esa manera, le otorgan una dirección pública al equipo que dedican exclusivamente para NAT utilizando el clasico action masquerade.

Aquí es donde entra en acción NETMAP.

/ip firewall nat add action=netmap chain=srcnat comment="CGNAT rule" out-interface-list=WAN ipsec-policy=out,none src-address-list=nateados to-addresses=public/32

En Este ejemplo, esta habilitado ipsec passthrough para evitar problemas con servicios P2P, VPNs, Juegos (Xbox) etc.

Incluso en to-addresses podes setear por que dirección IP queres que se Nateen.

Para el que quiera profundizar les dejo este enlace que me gustó mucho:

Cambios en RouterOS 6.43: API Class con passwords en texto plano

Para todos los que estan usando las librerías de PHP de Denis Basta (como yo), luego de actualizar tu RouterOS a la version 6.43 «en adelante» van a tener el inconveniente de que la libreria deja de funcionar (de conectar mas bien). Esto se debe a que el Team de Mikrotik Modifico la manera en que RouterOS internamente almacena las contraseñas, ya que según explican en su foro ellos comparan al viejo Telnet inseguro que usa contraseñas en texto plano con el API inseguro, y el SHH con el API HTTPs. Esto genera un poco de controversia entre los que usan el API sin HTTPs ya que lo bueno era que al menos las contraseñas viajaban encriptadas.

A raíz de las ultimas vulnerabilidades y tantos ataques dirigidos a dispositivos con Mikrotik, han tenido que hacer muchos cambios que nos obliga a tener que ponernos las pilas e instalar un certificado en cada router para no ser víctimas de los ataques de diccionario (con MKBrutus u otros) que atacan el puerto 8728 (API inseguro). Seria muy importante tener también HTTPs en el dominio donde tengamos corriendo la libreria.

Si se fijan en el manual explican la diferencia entre lo que seria el antes y el después de la version 6.43. Incluso aclaran que en la version 6.45.1 ya se toma como obsoleto.

Por suerte hay un colega que edito la libreria de Denis Basta para que intente conectar primero de forma segura, si no tiene exito lo hace de manera plana. A editar nuestro codigo.!. Si se fijan en la linea 109 y 116 estan las 2 formas de loggeo.

Saludos!!!

____________________
Primero en tech-nico.com/blog

RouterOS IPv6 Vulnerable {todas las versiones}

Sin tan solo tenes IPv6 activado y no lo estas usando, sos vulnerable a un pseudo ataque por una vulnerabilidad que esta en el Kernel de RouterOS y al parecer (Segun Normis), al ser un kernel tan viejo es muy dificil parchearlo.

Problemas en el paraíso

Hay publicaciones oficiales de un experto en seguridad que dice haber notificado estas vulnerabilidades hace un año atras, con lo cual en los últimos dias se ha generado cierta tension en la comunidad de Mikrotik que se lee claramente en algunos hilos del foro.

Normis, quien esta en el team técnico de RouterOS dice que solo le enviaron un reporte genérico y un video, pero no esta muy claro y que no los ayuda demasiado a resolver los problemas. También dice que no hay 1 solo problema, son multiples y que los resolvieron en su mayoria, pero solicita a los que puedan reproducir la vulnerabilidad, envíen email al soporte describiendo la metodología usada, para poder incluir el fix antes de la version beta 22.

NORMIS responde:

We fixed the crashes that were reported to us. You said, we have not fixed «The CVE». I don’t know what you will publish in the CVE. You have only provided a video that doesn’t help at all. If you can reproduce an issue that we can’t reproduce, please email support and describe the method you used now, after beta 22.

NORMIS responde:

No. He did not send proof of concept for all issues, just a generic report about a crash. When he now said that CVE number such and such is not fixed, It was not clear, since we don’t know what he will publish in that CVE. There is not a single issue, there are multiple issues, we fixed most, now he has stumbled upon another (memory leak in some other condition). We are fixing the others as well.

Segun explica Maxi la vulnerabilidad se produce por un paquete IPv6 mal formado que provoca que el router genere un pico de memoria y se reinicie, y forwardeando este paquete genera un efecto en cadena increíble reiniciando todos los routers que se encuentren bajo ese mismo routeo IPv6.

Soluciones parciales:

Las soluciones hasta el momento, son parciales, hasta que salga el proximo beta. La solución para los que no estan usando IPv6 es simplemente desactivar el paquete y reiniciar el router.

Y la solución parcial para el que si esta utilizando IPv6 (como es mi caso), es agregar unas reglas en el firewall que segun pruebas de algunos participantes del foro están funcionando bien.

Until we release the next beta with memory exhaustion fix, this firewall config should stop any attack even with small amount of RAM:


/ipv6 firewall filter

add action=drop chain=forward connection-mark=drop connection-state=new

/ipv6 firewall mangle

add action=accept chain=prerouting connection-state=new dst-address=\ 2001:db8:3::/64 limit=2,5:packet

add action=mark-connection chain=prerouting connection-state=new dst-address=\ 2001:db8:3::/64 new-connection-mark=drop passthrough=yes

Reemplazar 2001:db8:3::/64 con el bloque IPv6 entregado por tu RIR

Update Beta

El sabado mientras yo redactaba este post, Mikrotik lanzo un beta con algunas correcciones:

What’s new in 6.45beta23 (2019-Apr-01 05:51):

MAJOR CHANGES IN v6.45:
———————-
!) ipv6 – fixed soft lockup when forwarding IPv6 packets;
!) ipv6 – fixed soft lockup when processing large IPv6 Neighbor table;

———————- 

Changes in this release:

*) ipsec – properly drop already established tunnel when address change detected;
*) ipv6 – adjust IPv6 route cache max size based on total RAM memory;
*) smb – fixed possible buffer overflow;

Saludos y a cuidar esos routers!!.

Tech-nico!!

Scripts Mikrotik | 2 esenciales para un sys admin: Ether state and Speedtest

2 Scripts que yo denomino «Criminales»

Hola amigos,  disculpen la ausencia, estamos con muchas implementaciones, pero no queria dejar pasar esta oportunidad de dejarles 2 script que trabajan de la mano y para mi gusto son increibles.

Script 1: Chequear el estado de un puerto ethernet

Este script esta pendiente del estado de un puerto de red que le configuremos. Es decir que esta atento a si el estado del puerto esa con link o sin link. Cuando el puerto hace link chequea que tenga salida a internet haciendo un ping a www.tech-nico.com.
Si tiene salida a internet, entonces ahi entra en juego el script nro 2.

[PHP]
# Nicolas: Tech-nico.com/blog
# CHEQUEAMOS ESTADO DE ETHERNET
:global etherNET;
:set $etherNET value=»ether1″;
:global «ether-state»;
:global «ether-laststate»;
/interface ethernet monitor $etherNET once do={:set «ether-state» $status};
:if ($»ether-state» != $»ether-laststate») do={
:log info («Interface $etherNET – link status cambio a: » . $»ether-state»);
:set «ether-laststate» $»ether-state»;
:do {
:put [:resolve www.tech-nico.com];
:if ($»ether-state»=»link-ok») do { :log warning («HACER TEST!!»); /system script run speedtest; }
} on-error={ :put «resolver failed»};
}
[/PHP]

Script 2: Hacer un test de velocidad descargando un archivo

En principio enciende la pantalla LCD del equipo (tenemos que usar algún equipo como un RB-2011) para mostrar la velocidad de download reflejada en la pantalla. Fíjense que tienen que editar la url donde dice archivo_pesado.tif y setear el servidor y nombre de archivo que ustedes tengan, y usen como prueba. Se recomienda algún video AVI pesado, (algo que pueda almacenar nuestro RB).

[PHP]
{
# Nicolas: Tech-nico.com/blog
# HACEMOS UN SPEEDTEST
/lcd backlight state=on;
local startTime [/system clock get time];
:global myurl «http://www.tech-nico.com/archivo_pesado.tif»;
/tool fetch url=$myurl mode=http;
local endTime [/system clock get time];
# subtract startTime from endTime to get time elapsed
local finalTime ( $endTime – $startTime );
# convert hours to seconds, add to sum
:local sum ( $sum + ( [ :pick $finalTime 0 2 ] * 60 * 60 ));
# convert minutes to seconds, add to sum
:set sum ( $sum + ( [ :pick $finalTime 3 5 ] * 60 ));
# add seconds to sum
:set sum ( $sum + [ :pick $finalTime 6 8 ] );
:local sise [[/file get [/file find name=archivo_pesado.tif] size] /1024];
:local sdonspped ((($sise / $sum ) * 8 ) /1024);
:local ddow ((($sdonspped *1000) /8) / 1024);
:global speedtest $sdonspped;
:log warning («My connection Speed «.[:pick $sdonspped 0 1] .».». [:pick $sdonspped 1 3] . » Mbps» );
:log error («My Speed Download = «. $ddow .» Kbps»);
}
[/PHP]

Casos de uso

La idea de estos 2 script es la siguiente:  Crear una herramienta para mostrarle al cliente «sin encender ninguna computadora», cual es el rendimiento de su conexion a internet. Por eso es un requisito fundamental usarlo con modelos de hardward que tengan pantalla LCD. Tambien porque en el mercado no existe ningun tester o appliance que haga algo tan basico como un testspeed y lo entregue de manera elegante en una pantallita LCD, Sin paracticamente configurar nada. Loco no?

Funcionamiento

En mi caso tengo configurado un usuario PPPoE en el ether1. El mismo puerto esta seteado en el Script 1 para chequear el estado de red. Una vez que es detectado el estado del ethernet como UP, hacemos un ping, y si el PPPoE client alcanzo a conectar, el ping a tech-nico.com nos va a dar OK, con lo cual finalmente se va a ejecutar el download.

Pd: Aclaro que la foto fue «gestionada» con google. Aclaro por si aparece el dueñ0.  😀

____________________
Primero en tech-nico.com/blog

Venta de equipos Mikrotik RB 2011 nuevos y usados

Venta equipamiento

Para el que le interese, estamos vendiendo junto con la Cooperativa Eléctrica de Guatraché (La Pampa), equipos Mikrotik RB-2011.

Historia de una red activa

En el año 2010 compramos 200 unidades con el propósito de brindar servicios de mayores capacidades. Con lo cual diseñamos una red de fibra troncal que utiliza routeo OSPF, MPLS, VPLS y VLANS. Hicimos un despliege de fibra hasta el nodo o como comúnmente se dice FTTn o FTTc. Se armaron varios punto a punto utilizando el puerto SFP de fibra que trae cada equipo. En el Nodo principal usamos Switches CRS 212 porque podes iluminar 10 SFP por switch y trae un puerto SFP plus para stackearlo con el router de border a 10 Gb por switch.

La red tuvo mucho éxito, incluso hasta el dia de hoy siento satisfacción personal al saber que todo lo propuesto y planificado funciono de maravillas y de hecho aun sigue en funcionamiento, pero se esta comenzando a reemplazar de a poco por una red pasiva (GPON) con splitters y cajas de distribución para FTTh (Fibra al hogar).

Nostalgia de un sys-admin

Parece mentira como vuelan los años, hoy en el 2018 se estandarizaron muchas cosas y mas que nada cambiaron las capacidades de las OLT. Los chasis permiten armar redes logicas mucho mas eficientes, ahora los spliteos en las redes incluso se hacen re diferentes a lo que se hacia en el 2010, (mucho mas eficientes, con menos perdidas de dbi, y mayor capacidad para el abonado final).

Publicacion en Mercado libre

Tenemos 100 unidades nuevas, sin abrir y el resto de los usados, se van vendiendo a medida que se reemplazan por GPON.

Equipo Nuevo: https://articulo.mercadolibre.com.ar/MLA-734905914-routerboard-mikrotik-rb-2011-uias-rm-sfp-rack-nuevo-sml-_JM

Equipo Usado:  https://articulo.mercadolibre.com.ar/MLA-734905914-routerboard-mikrotik-rb-2011-uias-rm-sfp-rack-nuevo-sml-_JM

____________
Primero en Tech-nico.com

RouterOS 6.41 incorpora TLS-Host para controlar sitios HTTPS que usen TCP

Alternativa para poder manejar fitros o queues en sitios con HTTPS

En la version 6.42rc (release candidate) segun afirman en el foro oficial de Mikrotik, ya esta en funcionamiento el parametro TLC-Host desde los filtros del firewall, con lo cual permite marcar/controlar o filtrar ciertos sitios HTTPS que corran en TCP, lo cual en este ultimo tiempo nos han sido un dolor de cabezas, tal como pasaba con los que querían controlar o ecualizar los videos de youtube; se lograba conseguir a medias tintas.
Segun aclara Maxi Dobaldez en el foro, si el cliente utiliza Chrome u Opera 16, (que estimo es un buen porcentaje de los internautas) el trafico no estaría utilizando TLS ya que usa el protocolo QUIC desarrollado por un crack de Google por el 2012, el cual hace un uso eficiente de UDP para no saturar la conexión y entregar los videos con mas velocidad.

¿Quien lo prueba?

Por ejemplo, para dropear por completo el uso de facebook bastaria con dos lineas como estas. (aclaro que no lo probe, por favor comentar)

 /ip firewall filter
add chain=forward dst-port=443 protocol=tcp tls-host=facebook.com action=reject
add chain=forward dst-port=443 protocol=tcp tls-host=*.facebook.com action=reject

RouterOS API class 1.4 [corregida]

Esto es un update

Para el que no esta familiarizado, esta es la librería que utilizamos en cada uno de los ejemplos del blog. Esta fue creada por Denis Basta,

  • Corregido el problema de la variable «$receiveddone» que venia vacía y arrojaba error. Descargar aqui!

Este no el lugar para esto pero me voy a desviar del asunto de este post para aclarar algo que quiero decirles desde hace mucho:

Siempre me gusta aclarar de donde salen las librerías o fuentes que utilizo, (no hagas lo que no te gusta que te hagan) porque me encuentro todo el tiempo con sitios que copian y pegan código de mi blog  y no son capaces citar la fuente. Sean consientes del tiempo que uno invierte para ayudar a los demás, simplemente para aportarle algo al mundo. A todos nos gusta Mikrotik, programación, o emprender cosas nuevas pero «esto es gratis», y mi tiempo vale tanto como el de ustedes,

Entonces,

  • si te gusta lo que publique por favor, deja al menos un comentario,
  • si vas copiar y pegar en otro sitio, agrega al menos un link de mi blog,

_____________________
Primero en Tech-nico.com
(Recuerda dejar un link cuando copies y pegues a otro sitio)

Script Mikrotik – Enviar mail cuando ping es mayor a 200ms

Minientrada

Algo para agregar a la navaja suiza de tus script (sysadmin only): 

Hola Amigos, hace mucho que no escribo, y en este caso, me pareció que vale la pena repostear. Este script de mikrotik hecho por un chino te envia un mail cuando el ping a cierta dirección supera los 200 ms; por ejemplo, si tenemos algun enlace o cliente que queremos monitorear cuando estamos durmiendo. Si sos nerd (como yo), No dejes escapar este script, es justo para vos.

#Mikrotik Ping more than 200ms to send mail
#https://ros.ac
#By:Ali
#From:China
:local Asunto "Alarma! Monitor de ping a IP"
#Configurar la IP a monitorear
:local addre 192.168.88.1;
#Configurar el Delay maximo tolerado
:local ms 200;
:local avgRtt;
/tool flood-ping $addre count=10 do={
  :if ($sent = 10) do={
    :set avgRtt $"avg-rtt"
}}
:if ($avgRtt >= $ms) do={
#Send mail
/tool e-mail send server=<Server IP> port=25 user=<user> password=<pass> to=to@mail.com from=from@mail.com subject=$Asunto body=("Monitoreando IP:$addre\ndelay:$avgRtt ms")
:log err "La alarma ha sido enviada.";
}

Atencion, configurar las siguientes variables para que funcione correctamente el script:

:local addre 192.168.88.1; —- Aqui setear la direccion IP a la que queremos monitorear.

:local ms 200; ———- Aqui los ms. Solo cambiar el nro 200 por el valor deseado.

Email Settings: ———– No Olvides configurar server, port, user, password, to y from.
________
Primero en tech-nico.com

[Actualizado] Mikrotik RouterOS Address-List Whatsapp

Mikrotik RouterOS Address-List Whatsapp,

Para todos aquellos que quieren ecualizar con QOS / priorizar, o bien filtrar Whatsapp, mas abajo les dejo el address-list listo para copiar y pegar en la consola de tu RouterOS.
De a cuerdo al CIDR con todos los bloques completos de IP que usa Whatsapp (que publico Maxi en su increible blog).

/ip firewall address 
add address=31.13.64.51/32 list=Whatsapp
add address=31.13.65.49/32 list=Whatsapp
add address=31.13.66.49/32 list=Whatsapp
add address=31.13.68.52/32 list=Whatsapp
add address=31.13.69.240/32 list=Whatsapp
add address=31.13.70.49/32 list=Whatsapp
add address=31.13.71.49/32 list=Whatsapp
add address=31.13.72.52/32 list=Whatsapp
add address=31.13.73.49/32 list=Whatsapp
add address=31.13.74.49/32 list=Whatsapp
add address=31.13.75.52/32 list=Whatsapp
add address=31.13.76.81/32 list=Whatsapp
add address=31.13.77.49/32 list=Whatsapp
add address=31.13.78.53/32 list=Whatsapp
add address=31.13.80.53/32 list=Whatsapp
add address=31.13.81.53/32 list=Whatsapp
add address=31.13.82.51/32 list=Whatsapp
add address=31.13.83.51/32 list=Whatsapp
add address=31.13.84.51/32 list=Whatsapp
add address=31.13.85.51/32 list=Whatsapp
add address=31.13.86.51/32 list=Whatsapp
add address=31.13.87.51/32 list=Whatsapp
add address=31.13.88.49/32 list=Whatsapp
add address=31.13.90.51/32 list=Whatsapp
add address=31.13.91.51/32 list=Whatsapp
add address=31.13.92.52/32 list=Whatsapp
add address=31.13.93.51/32 list=Whatsapp
add address=31.13.94.52/32 list=Whatsapp
add address=31.13.95.63/32 list=Whatsapp
add address=50.22.198.204/30 list=Whatsapp
add address=50.22.210.32/30 list=Whatsapp
add address=50.22.210.128/27 list=Whatsapp
add address=50.22.225.64/27 list=Whatsapp
add address=50.22.235.248/30 list=Whatsapp
add address=50.22.240.160/27 list=Whatsapp
add address=50.23.90.128/27 list=Whatsapp
add address=50.97.57.128/27 list=Whatsapp
add address=75.126.39.32/27 list=Whatsapp
add address=108.168.174.0/27 list=Whatsapp
add address=108.168.176.192/26 list=Whatsapp
add address=108.168.177.0/27 list=Whatsapp
add address=108.168.180.96/27 list=Whatsapp
add address=108.168.254.65/32 list=Whatsapp
add address=108.168.255.224/32 list=Whatsapp
add address=108.168.255.227/32 list=Whatsapp
add address=157.240.0.53/32 list=Whatsapp
add address=157.240.1.53/32 list=Whatsapp
add address=157.240.2.53/32 list=Whatsapp
add address=157.240.3.53/32 list=Whatsapp
add address=157.240.6.53/32 list=Whatsapp
add address=157.240.7.54/32 list=Whatsapp
add address=157.240.8.53/32 list=Whatsapp
add address=157.240.9.53/32 list=Whatsapp
add address=157.240.10.53/32 list=Whatsapp
add address=157.240.11.53/32 list=Whatsapp
add address=157.240.12.53/32 list=Whatsapp
add address=157.240.13.54/32 list=Whatsapp
add address=158.85.0.96/27 list=Whatsapp
add address=158.85.5.192/27 list=Whatsapp
add address=158.85.46.128/27 list=Whatsapp
add address=158.85.48.224/27 list=Whatsapp
add address=158.85.58.0/25 list=Whatsapp
add address=158.85.61.192/27 list=Whatsapp
add address=158.85.224.160/27 list=Whatsapp
add address=158.85.233.32/27 list=Whatsapp
add address=158.85.249.128/27 list=Whatsapp
add address=158.85.254.64/27 list=Whatsapp
add address=169.44.23.192/27 list=Whatsapp
add address=169.44.36.0/25 list=Whatsapp
add address=169.44.57.64/27 list=Whatsapp
add address=169.44.58.64/27 list=Whatsapp
add address=169.44.80.0/26 list=Whatsapp
add address=169.44.82.96/27 list=Whatsapp
add address=169.44.82.128/27 list=Whatsapp
add address=169.44.82.192/26 list=Whatsapp
add address=169.44.83.0/26 list=Whatsapp
add address=169.44.83.96/27 list=Whatsapp
add address=169.44.83.128/27 list=Whatsapp
add address=169.44.83.192/26 list=Whatsapp
add address=169.44.84.0/24 list=Whatsapp
add address=169.44.85.64/27 list=Whatsapp
add address=169.44.87.160/27 list=Whatsapp
add address=169.44.167.0/27 list=Whatsapp
add address=169.45.71.32/27 list=Whatsapp
add address=169.45.71.96/27 list=Whatsapp
add address=169.45.87.128/26 list=Whatsapp
add address=169.45.169.192/27 list=Whatsapp
add address=169.45.182.96/27 list=Whatsapp
add address=169.45.210.64/27 list=Whatsapp
add address=169.45.214.224/27 list=Whatsapp
add address=169.45.219.224/27 list=Whatsapp
add address=169.45.237.192/27 list=Whatsapp
add address=169.45.238.32/27 list=Whatsapp
add address=169.45.248.96/27 list=Whatsapp
add address=169.45.248.160/27 list=Whatsapp
add address=169.46.52.224/27 list=Whatsapp
add address=169.46.111.144/28 list=Whatsapp
add address=169.47.5.192/26 list=Whatsapp
add address=169.47.6.64/27 list=Whatsapp
add address=169.47.33.128/27 list=Whatsapp
add address=169.47.35.32/27 list=Whatsapp
add address=169.47.37.128/27 list=Whatsapp
add address=169.47.40.128/27 list=Whatsapp
add address=169.47.42.96/27 list=Whatsapp
add address=169.47.42.160/27 list=Whatsapp
add address=169.47.42.192/26 list=Whatsapp
add address=169.47.47.160/27 list=Whatsapp
add address=169.47.130.96/27 list=Whatsapp
add address=169.47.192.192/27 list=Whatsapp
add address=169.47.194.128/27 list=Whatsapp
add address=169.47.198.128/27 list=Whatsapp
add address=169.47.212.160/27 list=Whatsapp
add address=169.53.29.128/27 list=Whatsapp
add address=169.53.48.32/27 list=Whatsapp
add address=169.53.71.224/27 list=Whatsapp
add address=169.53.81.64/27 list=Whatsapp
add address=169.53.250.128/26 list=Whatsapp
add address=169.53.252.64/27 list=Whatsapp
add address=169.53.255.64/27 list=Whatsapp
add address=169.54.2.160/27 list=Whatsapp
add address=169.54.44.224/27 list=Whatsapp
add address=169.54.51.32/27 list=Whatsapp
add address=169.54.55.192/27 list=Whatsapp
add address=169.54.193.160/27 list=Whatsapp
add address=169.54.210.0/27 list=Whatsapp
add address=169.54.222.128/27 list=Whatsapp
add address=169.55.67.224/27 list=Whatsapp
add address=169.55.69.128/26 list=Whatsapp
add address=169.55.74.32/27 list=Whatsapp
add address=169.55.75.96/27 list=Whatsapp
add address=169.55.100.160/27 list=Whatsapp
add address=169.55.126.64/26 list=Whatsapp
add address=169.55.210.96/27 list=Whatsapp
add address=169.55.235.160/27 list=Whatsapp
add address=173.192.162.32/27 list=Whatsapp
add address=173.192.219.128/27 list=Whatsapp
add address=173.192.222.160/27 list=Whatsapp
add address=173.192.231.32/27 list=Whatsapp
add address=173.193.205.0/27 list=Whatsapp
add address=173.193.230.96/27 list=Whatsapp
add address=173.193.230.128/27 list=Whatsapp
add address=173.193.230.192/27 list=Whatsapp
add address=173.193.239.0/27 list=Whatsapp
add address=174.36.208.128/27 list=Whatsapp
add address=174.36.210.32/27 list=Whatsapp
add address=174.36.251.192/27 list=Whatsapp
add address=174.37.199.192/27 list=Whatsapp
add address=174.37.217.64/27 list=Whatsapp
add address=174.37.243.64/27 list=Whatsapp
add address=174.37.251.0/27 list=Whatsapp
add address=179.60.192.51/32 list=Whatsapp
add address=179.60.195.51/32 list=Whatsapp
add address=184.173.136.64/27 list=Whatsapp
add address=184.173.147.32/27 list=Whatsapp
add address=184.173.161.64/32 list=Whatsapp
add address=184.173.173.116/32 list=Whatsapp
add address=184.173.179.32/27 list=Whatsapp
add address=185.60.216.53/32 list=Whatsapp
add address=185.60.218.53/32 list=Whatsapp
add address=185.60.219.53/32 list=Whatsapp
add address=192.155.212.192/27 list=Whatsapp
add address=198.11.193.182/31 list=Whatsapp
add address=198.11.251.32/27 list=Whatsapp
add address=198.23.80.0/27 list=Whatsapp
add address=208.43.115.192/27 list=Whatsapp
add address=208.43.117.79/32 list=Whatsapp
add address=208.43.122.128/27 list=Whatsapp

Actualizado: 18/05/2017

API MIKROTIK – Eliminar una dirección del firewall address-list

Te interesa saber como agregar una direccion IP a una lista?.

Exactamente hace 1 año atrás, el armamos un ejemplo para agregar una direccion IP una lista determinada del firewall; pero nunca dijimos como eliminarla y por eso aquí esta la solución.

Aquí va el código de como hacerlo:

Requisito: Descargar la librería api_mt_include2.php (podes hacerlo en uno de nuestros primeros ejemplos)

<?php require_once('api_mt_include2.php'); ?>
<?php
/*
/// AUTOR: Tech-Nico.com ///
/// admin@tech-nico.com /////
/// API: Firewall Address-list: Elimino una direccion IP a un address-list
/// Fecha: 10/08/2016 
  
//////// configura tus datos
$ServerList ="192.168.100.1"; //ip_de_tu_API
$Username ="api"; //usuario_API
$Pass ="#pass"; //contraseña_API
$Port ="8727"; //puerto_API
*/
/// VARIABLES DE FORMULARIO
$address= "5.4.3.1";  // direccion que borraremos en el address-list
$list=    "FACEBOOK";  // nombre de la lista  que borraremos 
if( $address !="" && $list!=""  ){
    $API = new routeros_api();
    $API->debug = false;
    if ($API->connect($ServerList, $Username, $Pass, $Port)) {
       $API->write("/ip/firewall/address-list/getall",false);
       $API->write('?address='.$address,false);
       $API->write('?list='.$list,true);       
       $READ = $API->read(false);
       $ARRAY = $API->parse_response($READ); // busco si ya existe
        if(count($ARRAY)>0){ 
            $ID = $ARRAY[0]['.id'];
            $API->write('/ip/firewall/address-list/remove', false);
            $API->write('=.id='.$ID, true);
       		$READ = $API->read(false);
        }else{ // si no existe lo creo
            echo 'La IP "'.$address.'" No existe en el address-list "' . $list .'" del firewall L3, no se hará nada!';
        }
        $API->disconnect();
    }
}
?>              

Primero en tech-nico.com: Por favor, pongan la fuente si van a copiar y pegar en otro sitio.!!.

Script Mikrotik para LIMITAR dispositivos móviles con DHCP con QUEUEs Dinamicas

Bloquear / Limitar

En las 3 versiones anteriores de este script podiamos «bloquear» un dispositivo movil tanto por DHCP como en el firewall del Bridge (capa 2) y en firewall capa 3.

Tal vez te interesen los scripts anteriores:
Version 1: Filtrar en Bridge Filter
Version 2: Filtrar en Firewall Filter
Version 3: Filtrar con DHCP Block

Ahora con una mínima modificación podemos controlarles el ancho de banda a cada uno de ellos. En este caso el script permite setear el RATE-LIMIT en una variable para todos los dispositivos.

########## INICIO DEL SCRIPT
:local DHCPSERVER "dhcp1";
:local LIMITE "256k";
# # www.tech-nico.com 
 
:foreach i in=[/ip dhcp-server lease find active-server=$DHCPSERVER] do={
log warning "Hola";
    :local DhcpDynMAC [/ip dhcp-server lease get $i mac-address];
                :local DhcpDynCLIENTID [/ip dhcp-server lease get $i active-client-id];
    :local DhcpDynHOST [/ip dhcp-server lease get $i host-name];
    :local phoneNAME [:pick $DhcpDynHOST 0 4];
 
    :if ( ($phoneNAME="BLUS") || ($phoneNAME="iPad") || ($phoneNAME="andr") || ($phoneNAME="Andr") || ($phoneNAME="Wind") || ($phoneNAME="iPho") || ($phoneNAME="BLAC") ) do={
        /ip dhcp-server lease set $i block-access=no  rate-limit="$LIMITE" insert-queue-before=first  mac-address="$DhcpDynMAC" use-src-mac=yes comment="$DhcpDynHOST" server="$DHCPSERVER" client-id="$DhcpDynCLIENTID";
    }
}
############## FIN DEL SCRIPT

La forma de limitar del script (sincronizando con queues) es como lo hacen algunos servidores radius.

El script recorre la lista de Leases DHCP y busca los dispositivos que comienzan con Host_name «iPad», «andr», etc. Luego lo edita, agregandole el limite de velocidad. Esto instantaneamente agrega un Queue dinamico en la lista de queues, controlando asi en el acto a cada Lease. Si el lease caduca, el queue se elimina solo, y si el lease por alguna razon renueva con otra direccion IP, tambien lo hace el queue de manera sincronizada. Es tal y como lo manejan los Servidores Radius.

Espero que lo disfruten de estas utilidades tan sencillas pero al mismo tiempo tan brillantes.

A pedido de Leonardo Jung. (excelente idea).

Saludos.

Mikrotik [tip] Ojo con los Backups y las mac-address!

No es nada bueno, pero tiene solución:

Si por alguna razón estas configurando tus equipos routerboard, puede que en algún punto necesites acelerar el proceso de configuración y decidas crear un backup de uno de los equipos para luego restaurarlo en el resto de los los routerboard que vayas utilizando. El problema oculto sobre esto es que «Te clona los MAC-Address del primer equipo al que le hiciste el backup». Y eso para equipos que pertenecen al mismo segmento de red, créeme que no es nada bueno.

Ya me había pasado antes que me aparecía eventualmente un mensaje en los logs que decia algo como: received packet with own address as source address. Y por supuesto, tal y como siempre sucede, «En el momento del problema, nunca aparece la solución».

Hace una semana, arme un PHP para poder serializar la configuración de muchos routerboard. Mi problema puntual: No conectaba el VPLS y ademas, volvió este bendito error en el log.

Leyendo en forum.mikrotik.com encontré que la solución es resetear los mac-address a su dirección original. Asi que recuerda!! cada vez que restaures un Backup, ejecuta este comando.

/interface ethernet reset-mac-address 0,1,2,3,4,5,6,7,8,9,10

En este caso, es un RB2011 el cual trae 11 interfaces, 10 ethernet y 1 sfp. Por eso va del 0 al 10. Por ejemplo en un RB 750 (5 ethernet) el comando seria asi:

/interface ethernet reset-mac-address 0,1,2,3,4

Enjoy!!.

Top 10 de los errores mas comunes en las configuraciones de Mikrotik RouterOS

Esta en ingles. (mas alla de su acento se entiende perfecto). Hay cosas que uno no las tiene en cuenta y son realmente muy importantes. Me gusto y quise compartirlo con mi hermandad.

 

[Actualizado] Script Mikrotik para bloquear dispositivos móviles en bridge – Muy Efectivo!

Bloqueando Celulares desde Mikrotik con Bridge filter (Efectividad 80%)

NOTA: Esta es la version para filtrar por bridge, tambien podes filtrar en firewall o bloquear directamente en dhcp-server.

Me toco en un colegio tener que dejar sin navegación a los celulares. En este caso opte por armar un script que recorra la lista de Leases del DHCP Server y filtre a los hosts llamados «Android» o «Windows Phone», «Blackberry». Con lo cual podríamos estar filtrando la mayoría de los dispositivos. Creo que se van a escapar los teléfonos chinos que suelen venir con sistemas operativos bastante raros. Tambien se estan escapando los celulares con SO  de Apple (no lo pude setear porque no se cual es su Host Name). Pero bueno, no queremos llegar a la perfección.. al menos con esto he quitado de circulación unos 50 dispositivos en el primer dia. No solo me ha bajado el consumo del CPU del RB 2011 si no que ademas ha mejorado mucho el rendimiento del ancho de banda ya que los celulares están todo el tiempo bajando actualizaciones, hasta incluso estando en el bolsillo del pantalón.

¿Como los bloqueamos?

Cuando abrimos la lista de Leases en «IP — DHCP-Server» veremos un listado de todas las IP dinamicas entregadas en la red. Uno de los campos es «HOST-NAME». Ese es el que nos interesa. Vean la imagen:

leases cossettini

Lista de nombres de mobiles a filtrar:  (que yo detecte y filtre) (AMPLIAREMOS)

  • android-8d0a00d6eddf7787
  • Android_356434048181508
  • Windows-Phone
  • BLACKBERRY-8A8D
  •  (nombre en blanco)

Entonces esto es lo que vamos a usar para detectarlos.
El primero y segundo, «android, Android» estan porque con mikrotik scripting no encontré un comando para hacer Upper o Lower Case de los caracteres. BLACKBERRY me aparece 2 veces en mayusculas (en otro router) asi que por ahora lo mantendremos asi. Y buscando en los mac-address vendors pude descubrir que muchos de los dispositivos celulares que vienen con el Host-Name en blanco son Samsung, Nokia, etc. Por lo que opte por dropearlos y cuando mucho, si es una laptop… «que le ponga el nombre de equipo». jeje.

Vamos a lo nuestro:
Para que el script funcione, debemos configurarle el nombre de nuestro DHCP-Server y ademas el nombre del Bridge en el cual vamos a filtrar (Son las primeras 2 variables). Esta parte es interesante porque si tambien es tu caso, puede ser que en el mismo equipo tengas mas de un DHCP Server o mas de 1 bridge, (uno para directivos y otro para alumnos). Por lo tanto, si esto no seria seteable, estaríamos quitándote navegación a TODOS, y no queremos que los directivos se enojen porque no pueden revisar el facebook en su android. :D.

# # SCRIPT: FILTRAR CELULARES EN BRIDGE

:local DHCPSERVER "dhcp_alumnos";
:local BRIDGEFILTER "bridge-alumnos";

# # AUTOR: NICOLAS DAITSCH
# # www.tech-nico.com

:foreach i in=[/ip dhcp-server lease find dynamic=yes active-server=$DHCPSERVER]  do={
   :local DhcpDynIP [/ip dhcp-server lease get $i address];
   :local DhcpDynMAC [/ip dhcp-server lease get $i mac-address];
   :local DhcpDynHOST [/ip dhcp-server lease get $i host-name];
   :local IfMacExist [/interface bridge filter find src-mac-address="$DhcpDynMAC/FF:FF:FF:FF:FF:FF"];
   :local phoneNAME [:pick $DhcpDynHOST 0 4];

:if ( ($phoneNAME="iPad") || ($phoneNAME="S410") || ($phoneNAME="Andr") || ($phoneNAME="LANI") || ($phoneNAME="Ipho") || ($phoneNAME="S220") || ($phoneNAME="S120") || ($phoneNAME="BLUS") || ($phoneNAME="iPod") || ($phoneNAME="andr") || ($phoneNAME="Wind") || ($phoneNAME="iPho") || ($phoneNAME="BLAC") || ([:len $DhcpDynHOST]=0) ) do={
          :if ($IfMacExist != "") do={
#               :log error ("Filtrando telefono... ".$DhcpDynMAC. " Ya existe")
          } else= {
               /interface bridge filter add action=drop chain=input in-bridge=$BRIDGEFILTER src-mac-address="$DhcpDynMAC/FF:FF:FF:FF:FF:FF" comment=$DhcpDynHOST;
                 :log warning ("Se filtro un nuevo dispositivo " . $phoneNAME . " MAC: " .  $DhcpDynMAC);
          }
     }
}

Muy bien el script recoje los mac-adddress de este listado (leases), y si coinciden con alguno de los nombres que dijimos, se filtra automáticamente sin retorno.
Y digo sin retorno porque si ya lo filtro, por mas que cambie el hostname YA ESTA!!!.
Lo bueno de este script es que estamos filtrando por MAC-Address en el Bridge, cosa que resulta MUY Efectiva.

La linea que dice:

($phoneNAME="androi") || ($phoneNAME="Window")

Esta tomando los primeros 6 caracteres del hostname. Entonces podríamos seguir agregando nombres de dispositivos seteados de fabrica con un nombre por default. Ejemplo: «Iphone»   —  justo 6.  Que yo estimo, «rara vez se modifica».

ATENTOS: Si alguien sabe como aparece el hostname del IPhone u algun otro dispositivo que no este contemplado, por favor deje un comentario y vamos actualizando el script.

Frecuencia de ejecucion del script y leases dhcp:
Lo tengo seteado en el Scheduler cada 10 minutos, Cosa que por mas que el «Lease dhcp» quede activo, ese dispositivo ya no navega. Lo que pueden hacer es setear los Leases del DHCP en 10 minutos (menos tiempo), o bien agregarle al script que tambien patee el lease. Pero ya no es necesario… cuando caduca su tiempo, ya no vuelve a aparecer mas.

Saludos! ! ! .

________________________
Este post se escribio primero en Tech-nico.com

Script Mikrotik para hacer parpadear un led del router.

Vos dirás.. y para que lo quiero?. Tal como dice el creador del script (foro Mikrotik) podría servir para señalar remotamente (al tecnico in-situ) cual es el equipo que tiene que supervisar. Lo acabo de probar y me anduvo bien. Es una pabada, pero a mi me encantó. 🙂

Importar por consola

add name=ParpadearLed policy=read,write,policy,test,sensitive source="# CONFIGURAR CANTIDAD DE PARPADEOS\r\
\n:local count 10\r\
\n# SETEAR EL LED QUE QUREMOS MANEJAR a) wlan-led b) led1 c) user-led\r\
\n:local led led1\r\
\n# NO EDITAR DE ACA PARA ABAJO\r\
\n:local numb 0\r\
\n:local test [ /system leds find leds~\"\$led\" ]\r\
\n:if (\$test = \"\") do={ /system leds add leds=\$led type=on }\r\
\n:local test2 [ /system leds find leds~\"\$led\" ]\r\
\n:local state [ /system leds get value-name=type number=\$test2 ]\r\
\n:while (\$numb &lt; \$count) do={\r\
\n :set \$numb (\$numb + 1)\r\
\n /system leds set numbers=\$test2 type=on\r\
\n :delay 0.5\r\
\n /system leds set numbers=\$test2 type=off\r\
\n :delay 0.5\r\
\n}\r\
\n/system leds set type=\$state numbers=\$test2"

Script Mikrotik para bloquear dispositivos moviles en Firewall

Bloqueando Celulares desde Mikrotik con Firewall (Efectividad 80%)

NOTA: Esta es la version para filtrar por firewall, tambien podes filtrar en bridge filter o bloquear directamente en dhcp-server.

Me toco en un colegio tener que dejar sin navegación a los celulares. En este caso opte por armar un script que recorra la lista de Leases del DHCP Server y filtre a los hosts llamados «Android» o «Windows Phone», «Blackberry». Con lo cual podríamos estar filtrando la mayoría de los dispositivos. Creo que se van a escapar los teléfonos chinos que suelen venir con sistemas operativos bastante raros. Con esto he quitado de circulación unos 50 dispositivos en el primer dia. No solo me ha bajado el consumo del CPU del RB 2011 si no que ademas ha mejorado mucho el rendimiento del ancho de banda ya que los celulares están todo el tiempo bajando actualizaciones, hasta incluso estando en el bolsillo del pantalón. Quizas te interese saber como bloquear las actualizaciones de android.

¿Como los bloqueamos?

Cuando abrimos la lista de Leases en «IP — DHCP-Server» veremos un listado de todas las IP dinamicas entregadas en la red. Uno de los campos es «HOST-NAME». Ese es el que nos interesa. Vean la imagen:

leases cossettini

Lista de nombres de mobiles a filtrar:  (que yo detecte y filtre) (AMPLIAREMOS)

  • android-8d0a00d6eddf7787
  • Android_356434048181508
  • Windows-Phone
  • BLACKBERRY-8A8D
  •  (nombre en blanco)

Entonces esto es lo que vamos a usar para detectarlos.
El primero y segundo, «android, Android» estan porque con mikrotik scripting no encontré un comando para hacer Upper o Lower Case de los caracteres. BLACKBERRY me aparece 2 veces en mayusculas (en otro router) asi que por ahora lo mantendremos asi. Y buscando en los mac-address vendors pude descubrir que muchos de los dispositivos celulares que vienen con el Host-Name en blanco son Samsung, Nokia, etc. Por lo que opte por dropearlos y cuando mucho, si es una laptop… «que le ponga el nombre de equipo». jeje.

Vamos a lo nuestro:
Para que el script funcione, debemos configurarle el nombre de nuestro DHCP-Server y ademas el nombre de la interfaz de tu LAN en el cual vamos a filtrar (Son las primeras 2 variables). Esta parte es interesante porque si tambien es tu caso, puede ser que en el mismo equipo tengas mas de un DHCP Server o mas de 1 LAN, (una red para directivos y otro para alumnos). Por lo tanto, si esto no seria seteable, estaríamos quitándote navegación a TODOS, y no queremos que los directivos se enojen porque no pueden revisar el facebook en su android. :D.

Muy bien el script recoje los mac-adddress de este listado (leases), y si coinciden con alguno de los nombres que dijimos, se filtra automáticamente sin retorno.
Y digo sin retorno porque si ya lo filtro, por mas que cambie el hostname YA ESTA!!!.
Lo bueno de este script es que estamos filtrando por MAC-Address en el Bridge, cosa que resulta MUY Efectiva.

La linea que dice:

($phoneNAME="androi") || ($phoneNAME="Window")

Esta tomando los primeros 6 caracteres del hostname. Entonces podríamos seguir agregando nombres de dispositivos seteados de fabrica con un nombre por default. Ejemplo: «Iphone»   —  justo 6.  Que yo estimo, «rara vez se modifica»..

Frecuencia de ejecucion del script y leases dhcp:
Lo tengo seteado en el Scheduler cada 10 minutos, Cosa que por mas que el «Lease dhcp» quede activo, ese dispositivo ya no navega. Lo que pueden hacer es setear los Leases del DHCP en 10 minutos (menos tiempo), o bien agregarle al script que tambien patee el lease. Pero ya no es necesario… cuando caduca su tiempo, ya no vuelve a aparecer mas.

# # SCRIPT: FILTRAR CELULARES EN FIREWALL (SIN BRIDGE)

:local DHCPSERVER "dhcp_alumnos";
:local INTERFACEFILTER "bridge-alumnos";

# # AUTOR: NICOLAS DAITSCH
# # www.tech-nico.com

:foreach i in=[/ip dhcp-server lease find dynamic=yes active-server=$DHCPSERVER]  do={
   :local DhcpDynIP [/ip dhcp-server lease get $i address];
   :local DhcpDynMAC [/ip dhcp-server lease get $i mac-address];
   :local DhcpDynHOST [/ip dhcp-server lease get $i host-name];
   :local IfMacExist [/ip firewall filter find src-mac-address="$DhcpDynMAC"];
   :local phoneNAME [:pick $DhcpDynHOST 0 6];

    :if ( ($phoneNAME="androi") || ($phoneNAME="Window") || ($phoneNAME="Androi")  || ($phoneNAME="BLACKB") || ([:len $DhcpDynHOST]=0) ) do={
          :if ($IfMacExist != "") do={
#               :log error ("Filtrando telefono... ".$DhcpDynMAC. " Ya existe")
          } else= {
               /ip firewall filter add action=drop chain=input in-interface=$INTERFACEFILTER src-mac-address="$DhcpDynMAC" comment=$DhcpDynHOST;
                 :log warning ("Se filtro un nuevo dispositivo " . $phoneNAME . " MAC: " .  $DhcpDynMAC);
          }
     }
}

Saludos! ! ! .

________________________
Este post se escribio primero en Tech-nico.com

Script Mikrotik para bloquear dispositivos móviles con DHCP

El script nacio por un comentario de nuestro colaborador «Felix Serrato» que NO vio la necesidad de bloquear los dispositivos celulares usando firewall o bridge filter. Es decir, bloquearlos directamente en los «leases» del dhcp-server y ademas que el board Mikrotik utilice menos recursos (si es que hay muchos dispositivos para bloquear en tu red).

Efectividad: 

Si bien el script es muy efectivo, probando me encontré con la particularidad de que no bloquea al instante. Te bloquea el lease (para que, A tu mac-address ya no le pueda entregar nunca mas una direccion IP), pero al filtrar por DHCP, no te quita la navegacion hasta que tu dispositivo vuelva a pedir una nueva solicitud DHCP. Una vez que apago y enciendo el Wifi de mi celular queda en «Obteniendo una direccion IP». Sin embargo los 2 scripts mencionados al principio (por bridge y por firewall), filtran en el acto.

Funcionamiento:

El script busca en la lista de dhcp-server leases todos los clientes conectados con el flag «dynamic=yes» y donde el dhcp server sea el que definimos en la variable DHCPSERVER. Esto es por si tenemos mas de 1 servidor dhcp para no filtrar en todos. Busca el host-name coincida con «Android», «iPad», etc, entonces agrega un nuevo lease con el flag «block-access=yes» para ese mac. Finalmente libera a todos los leases con ese nombre para no ocupar una direccion IP.

Solo hay que definirle el nombre del DHCP-server.

########## INICIO DEL SCRIPT
:local DHCPSERVER "dhcp1";
# # www.tech-nico.com 

:foreach i in=[/ip dhcp-server lease find dynamic=yes active-server=$DHCPSERVER] do={
	:local DhcpDynMAC [/ip dhcp-server lease get $i mac-address];
                :local DhcpDynCLIENTID [/ip dhcp-server lease get $i active-client-id];
	:local DhcpDynHOST [/ip dhcp-server lease get $i host-name];
	:local phoneNAME [:pick $DhcpDynHOST 0 4];

	:if ( ($phoneNAME="BLUS") || ($phoneNAME="iPad") || ($phoneNAME="andr") || ($phoneNAME="Andr") || ($phoneNAME="Wind") || ($phoneNAME="iPho") || ($phoneNAME="BLAC") ) do={
		/ip dhcp-server lease add block-access=yes mac-address="$DhcpDynMAC" use-src-mac=yes comment="$DhcpDynHOST" server="$DHCPSERVER" client-id="$DhcpDynCLIENTID";
	}
}
/ip dhcp-server lease remove [find host-name~"BLUS*"]
/ip dhcp-server lease remove [find host-name~"android*"]
/ip dhcp-server lease remove [find host-name~"Android*"]
/ip dhcp-server lease remove [find host-name~"Windows*"]
/ip dhcp-server lease remove [find host-name~"iPad*"]
/ip dhcp-server lease remove [find host-name~"iPhone*"]
/ip dhcp-server lease remove [find host-name~"BLACKBERRY*"]
############## FIN DEL SCRIPT

API MIKROTIK – Graficar trafico de interfaces en tiempo real con Highcharts y PHP

Te voy a enseñar como graficar en vivo una interfaz en particular de tu RouterOS. El ejemplo que arme en esta ocasión con las fabulosas, increíbles gráficas highcharts.com. (tal como lo pidio Cesar Maffini).

Si te interesa podes continuar leyendo una actualizacion de este post con bastantes mejoras: Graficar Interfaces y Queues con Highcharts version mejorada

Actualización: un fiel lector de nombre Alejandro Mogollon nos armo un video tutorial para demostrar que es muy muy facil la puesta en marcha.

El codigo tiene 3 archivos:

1) api_mt_include2.php: API RouterOS.
2) data.php: Conecta a RouterOS, trae TX, RX y los imprime en formato JSON.
3) index.html: Utiliza Ajax para llamar data.php cada 1 segundo y graficar puntos en tiempo real usando highcharts.
highchart_tech-nico.com_API_MIKROTIK

El codigo esta muy muy facil. Vamos a resumirlo:

index.html

           chart = new Highcharts.Chart({
			   chart: {
				renderTo: 'container',
				animation: Highcharts.svg,
				type: 'spline',
				events: {
					load: function () {
						setInterval(function () {
							requestDatta(document.getElementById("interface").value);
						}, 1000);
					}
			}
		 },

Sin duda esta es la parte mas importante del codigo En la linea donde comienza el setInterval lo que hace es llamar a la funcion requestDatta() y pasarle como parametro el nombre de la interfaz de red de nuestro Mikrotik que queremos graficar en tiempo real, cada 1 segundo. Esto funciona con cualquier interfaz. Bridge, Vlan, pppoe, Wlan, etc. En este caso, el parametro con el nombre de la interfaz que le vamos a pasar a la funcion requestDatta lo asigne a un campo de texto editable para hacerlo un poco mas interesante.

	function requestDatta(interface) {
		$.ajax({
			url: 'data.php?interface='+interface,
			datatype: "json",
			success: function(data) {
				var midata = JSON.parse(data);
				if( midata.length > 0 ) {
					var TX=parseInt(midata[0].data);
					var RX=parseInt(midata[1].data);
					var x = (new Date()).getTime();
					shift=chart.series[0].data.length > 19;
					chart.series[0].addPoint([x, TX], true, shift);
					chart.series[1].addPoint([x, RX], true, shift);
					document.getElementById("trafico").innerHTML=TX + " / " + RX;
				}else{
					document.getElementById("trafico").innerHTML="- / -";
				}
			}

Aqui, como explicábamos mas arriba, tenemos la función que se conecta al RouterOS y nos trae el dato de TX / RX de la interfaz que nosotros le pidamos.
Los datos que traemos de data.php estan en formato JSON, por lo tanto los tenemos que parsear para poner cada dato en una variable y luego graficar el punto en el Highchart. Si se fijan, es muy importante convertir el valor que viene en JSON a numero «parseINT».

La linea, shift=chart.series[0].data.length > 19; la usamos para que, cada vez que agregamos un punto nuevo, guardemos un indice con la cantidad de puntos, que le va a decir al chart cuando comenzar a pisar los valores antiguos de la serie.

Aqui pego las lineas con comentario:

	var TX=parseInt(midata[0].data);   // UPLOAD
	var RX=parseInt(midata[1].data);   // DOWNLOAD
	var x = (new Date()).getTime();    // tooltip cuando hacemos hover en el punto
	shift=chart.series[0].data.length > 19;  // indice de cantidad de puntos
	chart.series[0].addPoint([x, TX], true, shift);  // agrego TX en SERIE 0
	chart.series[1].addPoint([x, RX], true, shift);  // agrego RX en SERIE 1

Podemos agregar la cantidad de series que queramos; solo que mas abajo tenemos que definirlas asi:

            series: [{
                name: 'TX',
                data: []
            }, {
                name: 'RX',
                data: []
            }]

Con esto de arriba, tendriamos serie0 y serie1 (siempre contamos de arriba hacia abajo).
Presten atencion que «data» esta vacio, ya que nosotros le agregamos los puntos en tiempo de ejecución.
Si se nos ocurre graficar un tercer valor a la par de TX y RX lo haríamos definiendo otra serie, de esta manera:

series: [{
name: ‘TX’,
data: []
}, {
name: ‘RX’,
data: []
}, {
name: ‘RX’,
data: []
}]

Aca tendriamos, serie0, serie1 y serie2.
Espero que se entienda.

data.php
Este archivo como dijimos mas arriba es el que se conecta al routerOS y hace su trabajito. Editen las primeras lineas con los datos de su servidor Mikrotik.

Usaremos el comando /interfaces/monitor-traffic
Este nos pide el nombre de la interfaz, que ya la traemos desde el otro archivo.

		   $API->write("/interface/monitor-traffic",false);
		   $API->write("=interface=".$interface,false);
		   $API->write("=once=",true);

Esto ya lo hemos explicado en los posts anteriores, así que solo quiero detallar que la ultima linea dice =once= para que el trafic monitor, ejecute el comando 1 vez y pare. Si no ponemos este comando, se queda trabado, trayendo y trayendo el trafico en tiempo real, pero de manera infinita, con esto nos aseguramos que lo haga 1 vez.

Espero que les guste tanto como a mi. Investiguen un poco las graficas lindas que tiene higcharts porque son fantasticas y por supuesto si tienen modificaciones, mejoras, etc no duden en pasar un mail que las posteamos!!

Estoy pensando en usar github para control de versiones 😀

Descargar el codigo fuente completo

Se escribió primero en Tech-nico.com por Nicolas Daistch

Mikrotik Script: Marcar y controlar trafico de whatsapp por DNS

whatsappSi queremos controlar el ancho de banda de whatsapp por QoS o dropear o simplemente dejar pasar este trafico, podemos ejecutar este maravilloso script desde nuestro RouterOS, que recolecta las IP que usa esta aplicación de mensajería.

Las IP que recolecta realmente son MUCHAS!.

whatsapp_ips

 
Entonces, pegamos este codigo en la consola de comandos de routerOS y luego lo configuramos en el scheduler para que se ejecute cada 2 minutos. (o menos, dependiendo del procesador de tu equipo).
 

/system script add name=whatsapp policy=read,write,policy source="# chequear las entradas al \
    DNS\r\
    \n:foreach i in=[/ip dns cache find] do={\r\
    \n:local bNew \"true\";\r\
    \n:local cacheName [/ip dns cache all get \$i name] ;\r\
    \n# Revisar el DNS si contiene cadenas whatsapp\r\
    \n:if ([:find [/ip dns cache get \$i name] \"whatsapp\"] > 0) do={\r\
    \n:local tmpAddress [/ip dns cache get \$i address] ;\r\
    \n#---- Si address list esta vacio, no lo chequeo ( add address directly )\
    \r\
    \n:if ( [/ip firewall address-list find ] = \"\") do={\r\
    \n/ip firewall address-list add address=\$tmpAddress list=whatsapp_dns_ips\
    \_disabled=no comment=\$cacheName; \r\
    \n} else={\r\
    \n#------- chequeo cada entrada del address-list para no repetir las ips\r\
    \n:foreach j in=[/ip firewall address-list find ] do={\r\
    \n#---------- set bNew variable to false if address exists in address list\
    \r\
    \n:if ( [/ip firewall address-list get \$j address] = \$tmpAddress ) do={\
    \r\
    \n:set bNew \"false\";\r\
    \n}\r\
    \n}\r\
    \n#------- Si la direccion (IP) es nueva, la agrego al ADDRESS-LIST\r\
    \n:if ( \$bNew = \"true\" ) do={\r\
    \n/ip firewall address-list add address=\$tmpAddress list=whatsapp_dns_ips\
    \_disabled=no comment=\$cacheName; \r\
    \n}\r\
    \n}\r\
    \n}\r\
    \n}"

Script Mikrotik, mandar backup por FTP

Un usuario del foro oficial de mikrotik publico un pequeño script para enviar un backup de nuestro RouterOS por FTP. Muy bueno para automatizar nuestros routers y enviar todos los backups a una caja NAS.

/system backup save name="filename"

/tool fetch address="ftpaddress" src-path="filename.backup" \
user="ftpuser" mode=ftp password="ftppassword" \
dst-path="Path of your ftp(/Mt-Backup/filename.backup)<--example" upload=yes

delay 10;
/file remove filename.backup

_________
publicado en tech-nico.com

API MIKROTIK – Crear queues simples con PHP (con validacion)

Hola señores, el codigo para agregar un Queue Simple validando que no se duplique ningún cliente seria asi:

ACTUALIZADO: agrega un queue si no existe el nombre, y si existe, lo edita.

<?php require_once('api_mt_include2.php'); ?>
<?php

/// AUTOR: Tech-Nico.com ///
/// admin@tech-nico.com /////
///  API: agrega un queue simple y si este existe lo edita.
/// Editado: 03/05/2015 

//////// configura tus datos
$ServerList ="192.168.100.1"; //ip_de_tu_API
$Username ="api"; //usuario_API
$Pass ="#pass"; //contraseña_API
$Port ="8727"; //puerto_API
/// VARIABLES DE FORMULARIO
$target= "192.168.0.5";  // IP Cliente
$name=    "nicolas222";
$maxlimit=    "5M/5M";
$comment= "Este es un ejemplo.";
if( $target !="" ){
    $API = new routeros_api();
    $API->debug = false;
    if ($API->connect($ServerList, $Username, $Pass, $Port)) {
       $API->write("/queue/simple/getall",false);
       $API->write('?name='.$name,true);
       $READ = $API->read(false);
       $ARRAY = $API->parse_response($READ);
        if(count($ARRAY)>0){ // si el nombre de usuario "ya existe" lo edito
			$API->write("/queue/simple/set",false);
			$API->write("=.id=".$ARRAY[0]['.id'],false);
            $API->write('=max-limit='.$maxlimit,true);   //   2M/2M   [TX/RX]
			$READ = $API->read(false);
			$ARRAY = $API->parse_response($READ);
            echo "Error: El nombre no puede estar duplicado, el queue fue editado.";
            echo '<img src="../images/icon_error.png" />';
        }else{
            $API->write("/queue/simple/add",false);
            $API->write('=target='.$target,false);   // IP
            $API->write('=name='.$name,false);       // nombre
            $API->write('=max-limit='.$maxlimit,false);   //   2M/2M   [TX/RX]
            $API->write('=comment='.$comment,true);         // comentario
            $READ = $API->read(false);
            $ARRAY = $API->parse_response($READ);
            echo "El Usuario $name, ha sido creado con exito!.";
            echo '<img src="../images/okicon.png" />';
        }
        $API->disconnect();
    }
}
?>

Descargar el Descargar_ejemplo_actualizado_03-05-2015

No hay mucho que explicar porque esta comentado el codigo y explicado en los post anteriores.

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Segunda parte – Usando el API con PHP

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

_________________
Nicolas
Primero en Tech-nico.com

Mikrotik bloquear actualizaciones de Android en firewall

Estoy implementando algunas reglas para mejorar el ancho de banda de un colegio. Esta me parece una muy buena practica. Aquí la dejamos anotada por si acaso.

Ir a la consola y ejecutar esto.

/ip firewall filter add action=drop chain=forward port=5228 protocol=tcp
/ip firewall filter add action=drop chain=forward port=5228 protocol=udp

Luego, si sos tan amable, arrastra las reglas para arriba de tu firewall y tener la seguridad de que se ejecuten.
_______________________
Este post se publico primero en Tech-nico.com

Script Mikrotik para patear un cliente registrado con mala señal

Hola amigos, bueno, este script no es muy nuevo que digamos. Pero lo voy a postear porque le hice un agregado para mi gusto bastante importante.
En este caso, se trata de un routerboard 2011 con Wifi, y va a instalarse en un colegio. Como hay muchos celulares y netbooks, la clave del funcionamiento esta en patear cada 1 minuto los clientes que tienen muy mala señal. Y ademas, dentro del mismo script, tambien eliminaremos el «lease» del DHCP-Server.

Esto sirve para darle mucho mas rendimiento al AP, ya que si hay muchos dispositivos (celulares, tablets, netebooks de «conectar igualdad») con baja señal, el radio tiene que manejar demasiadas peticiones con re-transmicion de paquetes y llegado a un punto hasta se puede plantar.

Veran que donde dice «-86» es el tope de señal que yo configure para cuando el cliente este conectado con -87 o mas… lo saque de circulación. Ustedes pueden setear el que mas les guste.

/system script
add name=station-check-signal policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive source="/interfac\
    e wireless registration-table;\r\
    \n:foreach i in=[ /interface wireless registration-table find ap=no] do={\r\
    \n   :local SIGNAL ([:pick ([get \$i signal-strength]) 0 3]);\r\
    \n   :if (\$SIGNAL < \"-86\") do={\r\
    \n           :local MAC [get \$i mac-address];\r\
    \n           :log warning (\$MAC . \" fue desconectado por baja se\F1al:  \"\
    \_.\$SIGNAL );\r\
    \n           /interface wireless registration-table remove \$i;\r\
    \n# PATEO EL DHCP DEL CLIENTE CON MALA SE\D1AL\r\
    \n          /ip dhcp-server lease;\r\
    \n           :foreach s in=[find] do={\r\
    \n                  /ip dhcp-server lease;\r\
    \n                   :if ([get \$s active-mac-address] = \$MAC) do={\r\
    \n                           :log warning (\"DHCP pateado por script de mala\
    \_se\F1al:  \" .\$MAC );\r\
    \n                           /ip dhcp-server lease remove \$s;\r\
    \n                   }\r\
    \n           }\r\
    \n           :delay 5s;\r\
    \n     }\r\
    \n}"

Solución al script de DuckDNS en Mikrotik RouterOS

Cuando quisiste usar DuckDNS.org en tu RouterOS tuviste problemas con la instalación?. Bueno a mi me paso que el script «corría»  pero no me devolvía nunca el resultado deseado (mas claro: NO ANDABA). Depurando linea por linea me di cuenta que el problema no era el script si no la vesion de mi RouterOS.

¿para que uso DuckDNS?
Para el que no lo conoce, se usa para cuando tenes un sitio remoto con IP publica Dinamica y queres accederlo desde afuera. Tambien podes usarlo para una camara IP.
En este caso, el script del routerOS se encarga de que cuando la IP cambie… el sistema de duckDNS guarde la nueva IP. Entonces cada vez que accedas a tudominio.duckdns.org vas a entrar a tu routerOS sin problemas.

Para el que no lo usa, la instalación es super sencilla:
La instalacion del script es muy sencilla solo basta con copiar y pegar y tan solo modificar «domains» por tu dominio y el «token» por el que te de al hacer login y «agregar un dominio».

domains=exampledomain&token=a7c4d0ad-114e-40ef-ba1d-d217904a50f2

Aqui abajo el script completo:

:global currentIP;
:local newIP [/ip cloud get public-address];
:if ($newIP != $currentIP) do={
    :log info "IP address $currentIP changed to $newIP";
    :set currentIP $newIP;
    /tool fetch mode=https url="https://www.duckdns.org/update?domains=exampledomain&token=a7c4d0ad-114e-40ef-ba1d-d217904a50f2&ip=$newIP" dst-path=duckdns.txt;
    :local result [/file get duckdns.txt contents];
    :log info "Duck DNS update result: $result";
}

Conclusión y forma de resolverlo:
RouterOS agrego el «https»del comando fetch en la version 6.0, es por eso que el script no corre. Lo unico que hay que hacer es actualizar el RouterOS a la version 6.X.

Escribir Scripts para Mikrotik con el editor Sublime Text

Ahora es mucho mas fácil poder escribir código usando el famoso editor gratuito «Sublime Text» que permite entre otras cosas el highlight de los comandos, funciones, variables, comentarios, etc., para que todo sea mas legible y eficaz.
Un ayudante del foro de Mikrotik nos hizo este gran aporte que realmente es de gran ayuda para nosotros los fanáticos.

El paquete esta disponible para instalarlo desde el administrador de paquetes de Sublime o bien descargarlo desde Github.

mikrotik sublime text

API MIKROTIK – Manipular Wireless-Registration y Access-List con PHP y MYSQL

En esta ocasión, te traigo un pequeño sistema desarrollado en php y mysql para que puedas controlar cada cliente de un nodos AP de distintas o una misma localidad. Esto te permitirá habilitar/deshabilitar un MacAddress del access-list de muchísimos AP desde un solo lugar, tambien ver el nivel de señal y patearlo para que re-conecte cuando sea necesario.

Editamos el archivo config.php con los datos del mysql y con el usuario y contraseña del API. Este es el usuario y contraseña que va a utilizar el sistema para acceder a todos los equipos routerboard que cargues.

//////// Base de datos //////////////
$hostname_myCnx = "localhost";
$database_myCnx = "manage_isp";
$username_myCnx = "root";
$password_myCnx = "";

/// API ///  Se usa el mismo para todos los routerboards.
$Username ="tusuario";
$Pass ="tucontraseña";

Base de datos MYSQL
Las tablas son 4, por supuesto que aqui faltan muchas cosas, como la tabla de Login, de Logs, de bajas. etc, pero para mostrar un ejemplo totalmente funcional nos alcanza con estas 4.
Tabla Categorías: Contiene si el cliente es 2,4 ghz o 5,8 por ejemplo.
Tabla Localidades: Como su nombre lo dice aquí cargaremos las localidades.
Tabla Internet: Aquí cargaremos nuestros clientes a los que les brindamos internet. Esta tabla tiene 2 campos importantes. «ip_equipo_inalambrico» es el campo que nos identifica el equipo por el comentario que le demos en el «access-list» del RouterOS. Podemos escribirle su direccion IP o bien un string que lo identifique. Luego el campo «activo» es para identificar que hemos cortado el servicio por falta de pago. Simplemente lo identifica con 0 o 1 si esta activo y por supuesto lo activa/desactiva del access-list, identificándolo con el campo anterior «ip_equipo_inalambrico».
Tabla Puntos_de_acceso: Aquí cargaremos en cada localidad (ejemplo: Liniers) y categoría (ejemplo: 2,4 Ghz), el o los puntos de acceso que necesitemos. Entonces si en Liniers tenemos 2 o 3 puntos de acceso, el cliente lo va a buscar en los 3 puntos de acceso hasta que lo encuentre. Por supuesto que si tenemos muchos puntos de acceso para 1 localidad quizás se pueda hacer mas lenta la busqueda. De todos modos podemos crear «Barrios o Zonas» (en vez de localidades) para que el sistema haga mas rapida la busqueda. Se entiende?. Aqui hay 2 cosas a recalcar, Cuando busca un cliente, lo busca «conectado» en el wireless-registration-table, esto es asi, para poder usar el sistema no solo para desactivar un cliente sino que ademas para poder tomar un reclamo. Y claro que cuando activa o desactiva lo hace en el access-list 🙂 .

CREATE DATABASE IF NOT EXISTS `manage_isp` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `manage_isp`;

CREATE TABLE `categorias` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `descripcion` char(100) DEFAULT '0',
  `default` int(1) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE `internet` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `numloca` int(2) NOT NULL DEFAULT '1',
  `apellido` char(100) DEFAULT NULL,
  `descripcion` char(100) DEFAULT NULL,
  `categoria` int(1) DEFAULT '0',
  `ip_equipo_inalambrico` char(40) DEFAULT NULL,
  `activo` int(1) DEFAULT NULL,
  `fecha_alta` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE `localidades` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` char(80) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE `puntos_de_acceso` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` char(50) DEFAULT NULL,
  `localidad` int(6) DEFAULT NULL,
  `categoria` int(6) DEFAULT NULL,
  `modo_neighbords` int(1) DEFAULT NULL,
  `ip` char(15) DEFAULT NULL,
  `puerto` int(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

Estructura de la base de datos: Pueden importar el achivo «.sql» que esta junto a los archivos a descargar, y luego lo borran por seguridad.

Pantalla principal:
main

1) Primer paso, recomiendo cargar las localidades, para ello vamos a {Nueva Localidad}.
nueva_localida

2) Luego volvemos a la pantalla principal cargamos los Nodos AP o puntos de acceso en el link {Nuevo Punto de Acceso}
nuevo_nodo
Aqui necesitaremos elegir la localidad ( o zona), por eso es importante que primero carguemos las localidades del paso 1.
Para que el API pueda ver la señal de los equipos en el Wireless registration table de cada RB, tenemos que elegir la categoría «INALAMB 2,4» y el modo «Mikrotik Wireless»
Y finalmente, lo mas importante, tenemos que cargar la IP y puerto de nuestro Routerboard para esa localidad o zona que estemos generando. Si el RB tiene una IP privada, hacemos un port-forwarding en el router donde este la IP publica.
El modo «Mikrotik Neighbords» No esta probado pero debería estar funcionando, se usa para la categoría «INALAMB 5,8» y poder ver si el equipo cliente esta conectado. Como se trata de un AP «Ubiquiti Rocket» del cual no tenemos acceso mediante el API, lo que hacemos es acceder al API del router principal donde se encuentra conectado el Rocket y acceder al IP-Neighbords. Este nos va a mostrar todos los clientes (si el equipo esta encendido) para poder atender un reclamo y ademas ver cual es su firmware.

3) Volvemos a la pantalla principal y hacemos click sobre algun cliente.
Como ejemplo hay 2 para clickear. Editamos la localidad y categoría, presionamos en el boton [Guardar] y volvemos a entrar. Finalmente, donde dice «Ip Equipo», le ingresamos la IP o algun identificador que hayamos puesto en el comentario del access-list. Si presionan [Enter] hara una busqueda para, si el cliente esta conectado en este momento, trae sus datos.
modificar_cliente

En IP Equipo podemos poner lo que haya en el comentario, me ha pasado que no toma la primer palabra, siempre las ultimas. Tiene que ser un identificador «Unico» ya que con esto controlaremos si se activa o desactiva.
Al darle [enter], deberiamos ver datos de señal, CCQ, TimeUp. Etc. Como ejemplo les pongo una imagen de otro sistema que había hecho para uso propio.
Vean que, usando su imaginacion pueden integrar todo lo que deseen.
ejemplo_sistema

4) Volvemos a la pantalla principal y veremos que en el link {Nuevo Cliente} aparece la pantalla:
nuevo_cliente

Revisen como esta hecho y veran que es muy facil editarlo. Cualquier duda, sugerencia o error, seran contestados aqui en los comentarios.

Les dejo el link para descargar los archivos.

Saludos amigos!!
___________________________
Publicado primero en tech-nico.com

Marcar IP de Google Youtube Video para dar Calidad de Servicio

La manera mas efectiva de marcar el trafico de video youtube en tu red (en este caso mikrotik) es utilizando listas de direcciones. Las recolecte por DNS y Whois.
Si queres hacer QoS, vas a necesitar esta lista.
.
.
.
.

/ip fire addr
add address=173.194.0.0/16 disabled=no list=Youtube
add address=208.65.152.0/22 disabled=no list=Youtube
add address=64.15.112.0/20 disabled=no list=Youtube
add address=74.125.96.0/19 disabled=no list=Youtube
add address=72.14.221.0/24 disabled=no list=Youtube
add address=84.53.128.0/18 disabled=no list=Youtube
add address=87.248.192.0/19 disabled=no list=Youtube
add address=216.155.128.0/19 disabled=no list=Youtube
add address=208.73.208.0/21 disabled=no list=Youtube
add address=66.55.140.0/23 disabled=no list=Youtube
add address=74.125.208.0/24 disabled=no list=Youtube
add address=208.117.224.0/19 disabled=no list=Youtube

Buena suerte!!

Nicolas tech-nico.com

API MIKROTIK – Patear un cliente PPPoE activo

En esta ocasión voy a publicar un código sencillo pero que varios lectores me han consultado como se hace. El codigo se utiliza con el include para manejar el API, que pueden encontrar en cualquiera de las publicaciones anteriores.

<?php require_once('api_mt_include2.php'); ?>
<?php
////////////////////////////////////////////////////////////////////
// ESTE EJEMPLO SE DESCARGO DE www.tech-nico.com ///////////////////
// Creado por: Nicolas Daitsch. Guatrache. La Pampa ////////////////
// Contacto: administracion {@} tech-nico.com //////////////////////
// RouterOS API: Busco cliente pppoe activo y lo pateo  ////////////
////////////////////////////////////////////////////////////////////

$ipRouteros="200.20.30.40";  // tu RouterOS. 
$Username="blog.tech-nico.com"; 
$Pass="tupassword"; 
$api_puerto=8728; 
$name = "dolores";  // ---- nombre del usuario pppoe

    $API = new routeros_api();
    $API->debug = false;
    if ($API->connect($ServerList , $Username , $Pass, $Port)) {
       $API->write("/ppp/active/getall",false);
       $API->write('?name='.$name,true);      
       $READ = $API->read(false);
       $ARRAY = $API->parse_response($READ);
        if(count($ARRAY)>0){ // si el usuario esta activo lo pateo.
             $API->write("/ppp/active/remove",false);	
             $API->write("=.id=".$ARRAY[0]['.id'],true);
             $READ = $API->read(false);
             $ARRAY = $API->parse_response($READ);
        }
       $API->disconnect();
    }
?>

__________________
primero en www.tech-nico.com

API MIKROTIK – (con php) – Indice general

Hola a Todos! Los post me han quedado un poco desconectados, asi que arme un indice que voy a ir actualizando a medida que agregue info.

1) Introduccion: que puedo hacer con este API?

2) Primer Script: Crear nuestro primer ejemplo para acceder a tu RouterOS y testear el acceso.

3) Administrar Hotspot > IP-Bindings desde tu celular. (habilitar, deshabilitar y eliminar)

4) Crear Queues Simples con Validacion

5) Hacemos un buscador de clientes activos. Vemos la grafica o el log. Muy interesante!.

6) Graficamos en tiempo real, el trafico de alguna interfaz con highcharts. 

7) Activar o Desactivar algun puerto ethernet de tu Mikrotik

8) Patear un cliente PPPoE activo

9) Manipular Wireless Registration y Access-List (usando Mysql)

Espero que te guste.
Nicolas. Publicado primero en www.tech-nico.com

Mikrotik Script: ejecutar un script si aparece cierta palabra o frase en el Log.

En el foro de Mikrotik un participante ha posteado algo interesante!!

Creo que el titulo esta bastante claro, es un script que detecta cierto contenido en el log, y luego ejecuta «otro script».

Script:

:global lastTime;

:local currentBuf [ :toarray [ /log find message~"wrong peer state" || message~"master flag=false" ] ] ;
:local currentLineCount [ :len $currentBuf ] ;

if ($currentLineCount > 0) do={
   :local currentTime "$[ /log get [ :pick $currentBuf ($currentLineCount -1) ] time ]";

   :if ([:len $currentTime] = 15 ) do={
      :set currentTime [ :pick $currentTime 7 15 ];
   }

   :local output "$currentTime $[/log get [ :pick $currentBuf ($currentLineCount-1) ] message ]";

   :if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
      :set lastTime $currentTime ;
      /system script run myScript
   }
}

ver el post completo en el foro de Mikrotik

Primero en tech-nico.com

API MIKROTIK – Activar o desactivar un puerto ethernet

A pedido del lector Vitor Monteiro, vamos a presentar un pequeño y facil ejemplo para habilitar o deshabilitar un puerto ethernet con cierto nombre.

¿Como funciona?
Lo que vamos a hacer es definir una variable llamada $name que va a contener el nombre de la interfaz que queremos activar o desactivar. El script verifica primero si ese nombre existe, luego, (si existe), almacenamos «el ID» y si «esta activa o no» en distintas variables. Si esta activa, entonces tomamos el ID y la desactivamos, de lo contrario, la habilitamos.

El codigo es el siguiente:

<?php require_once('api_mt_include2.php'); ?>
<?php 

////////////////////////////////////////////////////////////////////
// ESTE EJEMPLO SE DESCARGO DE www.tech-nico.com ///////////////////
// Creado por: Nicolas Daitsch. Guatrache. La Pampa ////////////////
// Contacto: administracion@tech-nico.com //////////////////////////
// RouterOS API: Busco interfaz ethernet y la activo o desactivo  //
////////////////////////////////////////////////////////////////////

$ipRouteros="200.20.30.40";  // tu RouterOS. 
$Username="blog.tech-nico.com"; 
$Pass="tupassword"; 
$api_puerto=8728; 
$name="ether1";    // -------> aqui el nombre de tu interfaz!!

$API = new routeros_api();
$API->debug = false;
if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
	   $API->write("/int/ether/getall",false);
	   $API->write('?name='.$name,true);
	   $READ = $API->read(false);
	   $ARRAY = $API->parse_response($READ);
	   if(count($ARRAY)>0){ // SI LA INTERFAZ EXISTE!!
	   		$id_interfaz = $ARRAY[0][".id"];
	   		$disabled = $ARRAY[0]["disabled"];
			if ($disabled=="true"){ // SI ESTA DESACTIVADA!!
				$API->write("/int/ether/enable",false);
				$API->write("=.id=".$id_interfaz,true);
           		echo '<strong>'.$name.'</strong> esta ahora activada <img alt="" src="icon_led_green.png" /> ';
			}else{ // SI ESTA ACTIVADA!!
				$API->write("/int/ether/disable",false);
				$API->write("=.id=".$id_interfaz,true);
				echo '<strong>'.$name.'</strong> esta ahora desactivada <img alt="" src="icon_led_grey.png" /> ';
			}
			$READ = $API->read(false);
    }else{  //el servidor API esta of line
           echo 'Ocurrio un error: '.$ARRAY['!trap'][0]['message'];
    }

}else{
    echo "<span style="color: #ff0000;">La conexion ha fallado. Verifique si el Api esta activo.</span>";
}
$API->disconnect();
?>

El resultado es este:

API-Activar_Ethernet

Para descargar el codigo fuente haz click aqui!

Saludos!.
____________________
Publicado Primero en www.tech-nico.com

API MIKROTIK – Graficar el trafico de nuestros clientes y mostrar el log

Hola viejos amigos!. Algo que me han preguntado bastante es como hacer que el cliente o nosotros mismos veamos las graficas de consumo con el API de Mikrotik. Y para su sorpresa les cuento que esta parte se hace sin el API.

Estudiemos la ruta que nos da mikortik para ver el graph de un cliente:

Nota: Comprobar que en /tools/graphing  este graficando todos los queues.

http://200.20.30.40:8080/graphs/queue/%3Cpppoe-fduckardt52104%3E/

OK como veran.. aqui pueden haber 3 datos variables:

  1. La direccion IP del RouterOS.
  2. El puerto de www (/ip/services).
  3. El nombre del pppoe: fduckardt52104

Si Inspeccionamos el código de esta imagen con en el navegador veremos que solo se agrega /daily.gif al final de la URL quedando así:

http://200.20.30.40:8080/graphs/queue/%3Cpppoe-fduckardt52104%3E/daily.gif

consumo_cliente

Hagamoslo mas interesante:
Ahora que ya sabemos la ruta exacta de cada gráfica (no tuvimos que usar el api), es cuestión de armar esto con PHP, pero para que sea un poco mas interesante vamos dale uso del API para hacer que si el usuario pppoe esta activo, mostramos el Graph usando la ruta anterior, pero si no esta conectado, mostramos el log del usuario. Para ello vamos a armar un buscador de usuarios activos.

Si el usuario esta desconectado.

Si el usuario esta desconectado.

Si el usuario esta activo

Si el usuario esta activo

Archivos importantes:

  • log.php: Este es el archivo raiz principal, aquí esta el formulario y los contenedores desde donde se carga el JS, estilos, etc. Ademas, en este archivo debemos modificar las variables de Session.
<!--
////////////////////////////////////////////////////////////////////
// ESTE EJEMPLO SE DESCARGO DE www.tech-nico.com ///////////////////
// Creado por: Nicolas Daitsch. Guatrache. La Pampa ////////////////
// Contacto: administracion@tech-nico.com //////////////////////////
// RouterOS API: Busco Usuario PPPoE activo y muestro Graph o Log //
////////////////////////////////////////////////////////////////////
-->
<?php
session_start();
$_SESSION['api_ip'] ="192.168.0.1"; // Tu RouterOS
$_SESSION['api_user'] ="tu_usuario";
$_SESSION['api_pass'] ="tu_password";
$_SESSION['api_port'] =8728;
$_SESSION['www_port'] =80;
?>

Desde este archivo se configura todo!!. Solo tienes que modificar las variables que están justo aquí arriba en el archivo log.php.
Si sigues mirando un poco mas abajo de los seteos veras que en esta ocasión estoy usando el framework de Mootools, aunque por el poquito código que estamos usando tranquilamente podríamos hacerlo todo con javascript (ajax).  Lo dejo a tu criterio.

  •  api/isonline_soporte.php: Este archivo se ocupa de conectarse mediante el API, a tu servidor Mikrotik. Chequea si el usuario esta activo y muestra la grafica en una etiqueta IMG. Miren el código porque esta muy fácil de entender.
  • api/log.php: Este codigo trae todo el log y filtra por nombre de secret para mostrarte solo por usuario.

Importante: para buscar tienes que escribir el nombre exacto del secret. Y luego presionar la tecla Enter.

Buscar Secret con el API de Mikrotik.

Buscar Secret con el API de Mikrotik.

Espero que te haya gustado, puedes probar, investigar mi código y ademas modificarlo, pero asegúrate de no quitar las lineas del autor.

Descarga aqui el codigo de este ejemplo

Este post fue escrito por Nicolas. Primero en tech-nico.com/blog

Theme HTML y PSD usado en proyecto API Mikrotik

Hola colegas, a pedido del publico, comparto mi Theme usado en el proyecto.
No tiene nada de otro mundo, solo es HTML y CSS. Pero por si a alguno le sirve, programe sobre el usando Dreamweaver. Ahora estoy probando Sublime Text 2 con el package Emmet; y realmente es «magia» se programa mucho mas rapido y facil.

Ahora ponganse a codificar sus API’s.

Descargar theme
___________________________________
Este post estuvo primero en tech-nico.com

 

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

Hola amigos.

Tal como lo habíamos anunciado en la Segunda parte, vamos a dar un caso de uso real,
en esta ocasión dedicado para el señor Nemox de Micromax Computación R.L. (Barinas – Venezuela) El nos pidio hacer algo especifico: Poder controlar la lista de «Hotspot > IP-Bindings» desde su celular; y  para comprobar que con el API se puede hacer prácticamente todo, tome su caso como un desafió.

Y aqui el resultado:
API-hotspot_ipbindingsapi_desde_iphone

A la izquierda esta visto desde el Iphone de Nemox. Y a la derecha desde el google chrome.

Muestra la lista de Hotspot – Ip Bindings y permite eliminar, habilitar y deshabilitar un cliente. El boton «agregar» no esta programado, pero dejo el código abierto para que cualquiera pueda editarlo y agregar o quitar funcionaliedades.

Esta armado el esqueleto del sitio en HTML5 y CSS3, los eventos y funcionalidades estan hechos con JQuery y el manejo del API con PHP5.

Vamos por partes:

El codigo de los 4 botones, Agregar, Eliminar, Habilitar, Deshabilitar, esta en el archivo index.html; si lo abrimos y vamos hacia el final, mas precisamente en la linea 110 veremos el codigo de cada boton. Pueden notar que cada boton tiene un codigo muy parecido. Lo que hace es, si esta seleccionado algun cliente (binding), toma su ID de un campo oculto (hidden field) para luego enviarlo como parametro al PHP que ejecuta la accion dentro del routerOS.
En la linea 119 vemos como ejemplo la ruta api/hotspot_general.php?ac=enable&id=numero  que tiene 2 parametros: «ac» (accion) que en nuestro caso son  las de los botones e «id» que es el codigo que identifica al IP Binding seleccionado con 1 click.

index.html
APIcodigobotones

APIcodigoPHP

 

api/hotspot_general.php
Este es el archivo que se comunica con tu RouterOS por medio del API, tienes que editar las primeras lineas con los datos de tu servidor: Revisen los otros archivos de la carpeta «api».

$ipRouteros=»192.168.33.200″;
$Username=»usuario»;
$Pass=»contraseña»;
$api_puerto=8727;

A partir de la linea 30 comenzamos a ver los casos para el parametro «ac» y depende el parametro que le pasemos es lo que ira a ejecutar. Creo que esta muy facil de entender. Para el boton «Agregar» debemos añadir un nuevo «case» con el parametro correspondiente.

El codigo que ejecuta la accion en el Mikrotik es este:

case «enable»:
$API->write(«/ip/hotspot/ip-binding/enable«,false);
$API->write(«=.id=».$id,true);
$READ = $API->read(false);
$API->parse_response($READ);
break;

Es muy facil de entender:

Hay comandos que nos solicitan datos. Antes de ejecutar el codigo con PHP lo probamos en la consola. Escribimos /ip hotspot ip-binding print  y vamos a saber quien esta desabilitado y su codigo ID.
Tomemos cualquier nro para testear y probemos:  /ip hotspot ip-binding enable.(enter) y nos va a pedir el ID, en nuestro ejemplo de prueba ponemos el 7 que esta deshabilitado.

API-consola

Bien, aqui tenemos estas 2 lineas:

$API->write(«/ip/hotspot/ip-binding/enable»,false);
$API->write(«=.id=».$id,true);

El flag false o true se refiere a que si este comando requiere de un dato, id, etc todavia no ejecuta el comando hasta no tener todo lo que necesita. Como vemos en la segunda linea el flag es true ya que el comando esta completo y lo manda a ejecutar.

Las siguientes 2 lineas…

$READ = $API->read(false);
$API->parse_response($READ);

son la respuesta de lo que ejecutamos, que en nuestro codigo no la estamos mostrando. Si el numero de ID no existiera, nos devolvería un error de «no such item». O si el comando ejecutado nos traeria una lista deberiamos recorrer el array $READ con un for para mostrar lo que se nos antoje.

Hay cosas que no las estoy explicando porque estan muy bien comentadas. Si no se entiende algo por favor pregunten.

Acá va el código abierto del ejemplo: mikrotik-test

Enjoy the saturday!

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_______________________________________
Primero en tech-nico.com Autor Nicolas Daitsch

API MIKROTIK Segunda parte – Usando el API con PHP

En la primera parte, explicamos cual podría ser su uso y para que sirve.
Ahora vamos a explicar como se configura el API en pocos pasos, con un poco de PHP y usando las clases creadas por Denis Basta. (version 1.3 o 1.4), con apenas un minimo cambio hecho para que la clase «connect» permita pasar ademas el numero de puerto del RouterOS como parametro.

Yo estoy familiarizado con programar en PHP pero para el que no, pueden hacerlo con el lenguaje que desee. En la Wiki de Mikrotik podran encontrar ejemplos para:

Paso 1: Configura tu RouterOS

a) Habilitar el servicio API.
desde IP > Services. Seleccionas la fila que dice «api» y la habilitas, luego doble click sobre ella para editar. Puedes asignarle el puerto que quieras, pero por defecto usa el 8728 tcp. Si te gusta tener todo ecualizado podrías agregarlo en los mangles para darle QoS. Finalmente donde dice «Avaliable From» es la direccion IP desde donde estara el API corriendo. En nuestro caso, como usaremos PHP puede ser el servidor Apache.  (sigue los pasos de la imagen).
ip-services-api

 

b) Crear un grupo
Para darle seguridad necesitamos crear un usuario y un grupo nuevo dentro del RouterOS donde queremos ordenar nuestras tareas diarias. Para ello vamos a «System > Users > Groups» y presionamos en el icono «+». En esta ventana simplemente escribimos el nombre del grupo, (para este ejemplo yo le puse «tugrupoapi») y elegi las politicas «read, write, api». Damos click en OK
user_api_group

c) Crear un usuario
Luego de crear el Grupo, nos movemos a la pestaña Users como esta en la imagen a continuacion. Presionamos el icono «+» para crear un usuario nuevo.
Name: aqui escribiremos nuestro nuevo nombre de usuario: Ejemplo blog.tech-nico.com, (puedes crear el tuyo).
Group: elegimos el grupo «tugrupoapi» (ver el punto «b»),
Address allowed:  Es la IP que tiene permitido acceder a nuestro RouterOS a través del API. «El apache server en nuestro caso»,
Password: tipeamos nuestro password, asegurate que sea fuerte.
Finalmente click en el boton «OK».

user_api_user_add

Paso 2: Crear un script para testear el acceso: conectar_test_api.php

<?php require_once(‘api_mt_include2.php’); ?>
<?php
$ipRouteros=»200.20.30.40″; // tu RouterOS.
$Username=»blog.tech-nico.com»;
$Pass=»tupassword»;
$api_puerto=8728;

$API = new routeros_api();
$API->debug = false;
if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
$API->write(«/system/ident/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$name = $ARRAY[0][«name»];
if(count($ARRAY)>0){ // si esta conectado
$API->write(«/system/licen/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$nlevel = $ARRAY[0][«nlevel»];
$API->write(«/system/reso/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$cpu = $ARRAY[0][«cpu»];
$cpu_frequency = $ARRAY[0][«cpu-frequency»];
$arquitectura = $ARRAY[0][«board-name»];
$API->write(«/system/pack/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$version = $ARRAY[0][«version»];

echo ‘<img src=»icon_led_green.png» />&nbsp;’;
echo «<strong>».$name.»(» .$arquitectura. «)</strong>&nbsp;&nbsp;»;
echo «v:» . $version. «&nbsp;&nbsp;»;
echo «level:» . $nlevel . «&nbsp;&nbsp;»;
echo $cpu.»(«.$cpu_frequency.» Mhz.)»;
}else{ //el usuario esta of line
echo ‘<img src=»icon_led_grey.png» />&nbsp;’.$ARRAY[‘!trap’][0][‘message’];
}

}else{
echo «<font color=’#ff0000′>La conexion ha fallado. Verifique si el Api esta activo.</font>»;
}
$API->disconnect();
?>

Paso 3: Editamos las lineas que dicen:

$ipRouteros=»200.20.30.40″; // tu RouterOS.
$Username=»blog.tech-nico.com»;
$Pass=»tupassword»
$api_puerto=8728;

Paso 4: Finalmente subimos por FTP los archivos a nuestro servidor Web y ejecutamos en el navegador el archivo conectar_test_api.php;
test_php_navegador
Si todo salio bien, vamos a ver una pantalla parecida a la de arriba. Lo que hicimos fue loguearnos mediante el API a nuestro servidor, y luego traer el nombre «Identity», la plataforma, la version del ROS, que licencia tiene instalada, etc.

Descarga aqui todos los archivos de este ejemplo.

Como veran, este seria el primer paso para comenzar a programar tus scripts. Ya teniendo esto funcionando vamos a poder realizar varios ejemplos que voy ir posteando en mi tiempo libre.

Cualquier cosa comenten que les respondo enseguida.

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_______________
Nicolas tech-nico.com/blog

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

 

Vengo aprovechando a pleno esta GRAN posibilidad que nos dio Mikrotik de poder programar nuestros propios scripts, y de mostrar la informacion de manera que nos quede comodo administrar varios servidores y en lo posible en una sola pantalla.

.

Este era mi escenario de antes de usar el API:
Aqui tengo la administracion de distintos routers PPPoE Servers, y a su ves cada router esta conectado a distintos Access Points, ya sean Mikrotik (2,4Ghz) o Ubiquiti(5,8Ghz).
Siempre fue engorroso tener que entrar a cada AP para agregar o quitar un MAC Address de un equipo cliente. Lo mismo con los usuarios y contraseñas de los clientes PPPoE. Bueno, ni hablar de tomar un reclamo telefónico  por mas que sepamos la localidad de donde nos llama el cliente, hay que pensar en:

  • a «Que equipo AP» esta asociado,
  • si esta con Wireless 2,4Ghz o 5,8 o cable,
  • Cual es la direccion IP del equipo wireless, etc

Por desgracia todas las topologias y redes son distintas, entonces es extremadamente dificil encontrar un sistema que tenga lo que nosotros necesitamos. Ademas cada sysadmin tiene su manera de configurarle al cliente: esta el que routea, el que bridgea, ip fija o dinamica.. y miles de posibilidades mas.
Hay otros que tienen redes bastante híbridas, con un poco de hotspot otro de IP Fija y PPPoE; Yo digo que, en esos casos seria aun mas practico administrarlos en una sola pantalla sin tener que recorrer el Winbox de una punta a la otra o mejor aun, sin tener que darle un usuario del Winbox a ningún técnico.
Veo constantemente en el foro gente que busca programas de facturación y o soporte, o prueban algo y no les gusta. A no ser que sea un software realmente grande y robusto (que seguro lo debe haber). Pero de todos modos, volvemos a lo mismo de siempre, es bastante difícil encontrar un software adecuado a nuestra medida porque si es grande y robusto seguro es complejo.

Todo cambia con un poco de imaginación cuando llega el famoso API.
Veamos algunos ejemplos de lo que se podría hacer:

Tareas comunes:
Altas, Bajas, Modificaciones de velocidad, cambio de titular, etc.

Este donde este ubicado el cliente, asociamos el nro de IP del router y AP con la localidad. Entonces al hacer click sobre el cliente, sin pensar donde esta, te trae sus datos. Desde datos de Wireless (sin importar si usa mikrotik o ubiquiti), hasta datos de autenticacion,  log si esta desconectado y grafica si esta loggeado.
Es muy bueno saber si el cliente le esta errando la contraseña o esta filtrado por mac en el PPP, y para eso mikrotik es malisimo, porque te tira un log de miles de lineas que pasa rapidisimo y no podes encontrar nada. Para este caso lo que hice fue filtrarlo por cliente. entonces podemos ver en detalle que le esta pasando.
Aqui les dejo un pantallazo; y en mis proximos posts les voy a detallar un poco mas de como funciona.

systema_soporte

API MIKROTIK Segunda parte – Usando el API con PHP

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_____________________

Nicolas tech-nico.com

Nueva version Mikrotik v6.0 rc08

Mikrotik ha lanzado su nueva version beta con muchas correcciones y novedades.
Hice la migracion de la version 5.x a la v6.0 y realmente es muy notable lo bien que funciona.

Entre los cambios mas importantes:

*) ppp,pppoe,pptp,l2tp,sstp – solo 2 mangles «mss change» para todas los tuneles ppp; antes se creaba automáticamente 2 por cada tunel conectado y por ejemplo en mi caso, con 500 tuneles conectados tenia 1000 mangles dinámicos, algo que seguro consumía recursos.

*) Wireless: se arreglaron problemas de velocidad en encriptacion AES.

*) Webfig: Se comprimieron todos los archivos y recursos html para acelerar la carga al abrir la pagina de webfig. (de hecho, si se fijan en las graficas, el RouterOS ocupa menos que en las versiones anteriores)

*) snmp – provide POE info;

*) Las interfaces son eliminadas mucho mas rápido  (cuando había muchos tuneles ppp se ponía muy lento eliminar una interface).

*) fix queue simple en el matcheo de interface, cuando tiene la encapsulacion de algún tunel, podía tener doble conteo de paquetes.

*) ip/ipv6 firewall tiene ahora todas como matcheo de interfaces, todas las ether, todas las wireless, todas las vlan, y todos los tuneles ppp.

*) Queue Limits podía ser inexacto para grandes limites (100M o mas);

*) Se agrego soporte inicial de OpenFlow;

Realmente son todas cosas muy buenas. Anoche hice la migracion de la version 5.2 a las 5.23, (como version final de la serie 5). Y luego salte a la version rc8 de la serie 6. Lo unico que tuve que modificar fue: en queue tree el global-total por global. El resto levanto perfecto!!! Es muy notable ver en las graficas que consume mucho menos recursos.

Hoy por sorpresa, veo que en el sitio de www.mikrotik.com.ar/download no esta mas la version rc8. Tengo que decir que me asuste!!!.. pero luego lei a Normis (del foro oficial) decir que la sacaron de linea por un problema de certificados, pero para los que no usamos certificados no corremos ningun tipo de peligro.

Normis: RC8 has a critical issue with Certificates. We temporarily pulled it off the website. If you don’t use certificates, you can keep using RC8

Mientras tanto para los que quieran corregir este inconveniente pueden utilizar un pre-release rc9 con la corrección de los certificados, o bien esperar a que salga el fix oficial.

Saludos.
___________
Nicolas tech-nico.com

Mikrotik script para recorrer lista de secrets pppoe y reemplazar IP’s

PPPoE Secrets: Migrar de IP privada «fija» a IP publica «fija»
Algo muy puntual que tuve que hacer cuando migre de IP Privadas a IP Publicas fue mantener la terminación de las IP de los clientes PPPoE de mi Red. Se preguntarán.. para que?. Bueno en mi caso tengo un sistema de gestión que maneja el servidor usando el API mediante PHP y Mysql. Entonces me tiene que quedar sincronizadas las IP del Mysql con las del Mikrotik. Por otro lado, siempre fui de la idea de que todos los secrets tengan una IP fija asignada, ya que cuando me reportan un problema, de virus, ataque o violación de derechos de autor, puedo identificar con velocidad de quien se trata.

Ejemplo 192.168.100.8     por 201.250.45.8

Para ello, elabore un script que me recorra la lista y reemplace lo que quiero.

El Script es el siguiente:

       :local BUSCA "192.168.100";
       :local REMPL "201.250.45";
       # recorro todos los secrets
       :foreach i in=[/ppp secret find] do={
       # guardo remote IP
          :local tmpIP [/ppp secret get $i remote-address];
       # guardo la primera parte
          :local ipfirst [pick $tmpIP 0 11];
       #guardo la ultima parte
          :local iplast [pick $tmpIP 12 15];
       #busco los secrets que tienen el rango de Ip a reemplazar
            :if ($ipfirst=$BUSCA) do={
                  :log info ($REMPL .".".  $iplast);
                 /ppp secret set $i remote-address="$REMPL.$iplast"
            }
       }

Solo tienes que editar las primeras 2 variables «BUSCA» por la IP actual que vas a buscar, y «REMPL» por la IP nueva que quieres asignar a cada secret. Si tienes 4 clases C tendras que ejecutar el script 4 veces.

Para importarlo hay que copiar y pegar lo siguiente en la consola:

sys scr add name=recorro_ppp_remoteAddress policy=\
    ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api source=":local\
    \_BUSCA \"192.168.100\";\r\
    \n:local REMPL \"201.250.45\";\r\
    \n# recorro todos los secrets\r\
    \n:foreach i in=[/ppp secret find] do={\r\
    \n# guardo remote IP\r\
    \n   :local tmpIP [/ppp secret get \$i remote-address]; \r\
    \n# guardo la primera parte\r\
    \n   :local ipfirst [pick \$tmpIP 0 11];\r\
    \n#guardo la ultima parte\r\
    \n   :local iplast [pick \$tmpIP 12 15];\r\
    \n#busco los secrets que tienen el rango de Ip a reemplazar\r\
    \n     :if (\$ipfirst=\$BUSCA) do={ \r\
    \n           :log info (\$REMPL .\".\".  \$iplast);\r\
    \n          /ppp secret set \$i remote-address=\"\$REMPL.\$iplast\"\r\
    \n     }\r\
    \n}"

Salutes

_________
Nicolas Daitsch
tech-nico.com

Graficando la cantidad de túneles PPPoE (conectados simultáneamente) con DUDE 4

Lo que queremos obtener es el numero de tuneles PPP simultanes en nuestro concentrador PPPoE Server Mikrotik. Que quedaria como la imagen que se muestra a continuacion:

En primer lugar necesitamos crear una función:

Para ello vamos al menu Tree, y hacemos doble click en «Functions».

Presionamos entonces el Boton «+» como muestra la siguiente imagen.

En nombre de funcion ponemos: cant_pppoe_clients
En descripción: cantidad simultanea de clientes PPPoE .
Y en codigo:

array_size(oid_column(«iso.org.dod.internet.private.enterprises.mikrotik.mikrotikExperimentalModule.mtXRouterOs.mtxrQueues.mtxrQueueSimpleTable.mtxrQueueSimpleEntry.mtxrQueueSimpleName»))-8

Nota: Este Codigo cuenta la cantidad  de queues simples. En mi caso tengo justo 8 queues simples que agregue manualmente. Entonces como solo me interesa contar los Queues dinamicos, simplemente al final le resto 8. Es por eso el «-8» al final del codigo. Si no tienes queues manuales reemplaza por cero.

Ahora que tenemos la Función creada, vamos de nuevo al menu Tree, y hacemos doble click en «Probes», como muestra a continuacion.

Luego presionar el boton «+» que se marca en rojo.

Completamos con estos datos:
Nombre: pppoe_probe
Tips: Function
Agente: por defecto
Disponible: cant_pppoe_clients()
Error: if(cant_pppoe_clients(),»»,»»)
Valor: cant_pppoe_clients()
Unidad: Clientes

En el menu Tree, doble click en «Local» para ir al diagrama de Red.

Click derecho en el dispositivo PPPoE, y en el menu contextual click en «Configuraciones».

Click en la pestaña «Servicios» y luego en el boton «+» remarcado en rojo.

Donde dice Prueba: elegir «pppoe_probe». Y presionar OK

Deberia quedar asi. Presionamos de nuevo en OK.

Click con boton derecho sobre el Dispositivo PPPoE, y click en apariencia.

Finalmente editamos la «Etiqueta», y agregamos

[cant_pppoe_clients()] clientes conectados

Finalizamos presionando OK.
Eso es todo!!. 🙂 despues de 2 segundos aparece el contador.
Recuerda que tienes que tener el SNMP habilitado en tu Mikrotik para poder leer el OID. Saludos
_____________________
Nicolas Tech-nico.com

Duplicar ancho de banda en horario nocturno con Mikrotik

Todos los que estamos trabajando como WISP sabemos que si hay algo que es sumamente valioso «es nuestro ancho de banda». El Mb para empresas pequeñas termina siendo muy caro y se pone dificil remar contra las telco.

La idea de este post: crear un script para aprovechar al maximo todo nuestro ancho de banda; ya que durante la noche queda casi sin uso, y nosotros lo estamos pagando!!!.

Escenario: PPPoE con Queues Dinamicas asignando a los clientes 128k y 256k respectivamente (de acuerdo al plan que tenga contratado) los cuales pasan a ser 256k y 512k entre las 00:45 y las 7:00 am.

El Script recorre las queue simples y cambia el max-limit. Se acpetan sugerencias y comentarios.


#subo128a256
:foreach i in=[/queue simple find] do={
:if ([:find [/queue simple get $i max-limit] "128000/128000"] = 0) do={
/queue simple set $i max-limit= "257000/257000";
}
}


#bajo256a128
:foreach i in=[/queue simple find] do={
:if ([:find [/queue simple get $i max-limit] "257000/257000"] = 0) do={
/queue simple set $i max-limit= "128000/128000";
}
}

Finalmente se cargan en el Scheduler y lo pueden configurar para que corra luego de la medianoche cada 1 hora hasta las 7 de la mañana. Digo cada 1 hora porque el script recorre los queues simple de los usuarios que estan conectados en ese momento (en que corrio el script), entonces si algun cliente conecta despues de que paso nuestro script, ese queda sin «doble velocidad», por eso es recomendable ejecutarlo cada 1 hora.

Este es nuestro resultado. (En este caso el Script duplica en un plan de 256k).

Algo muy facil de hacer; y los clientes no solo quedan conformes, si no que aumentan las ventas. 😉