RouterOS – Controlar / Filtrar contenido por DNS 2023

En muchas ocasiones he tenido que controlar mediante QoS algunas cuestiones como las actualizaciones de windows, o las redes sociales, y en otros casos filtra Whatsapp.
OpenDNS de Cisco permite mediante un dashboard poder ir tildando y destildando contenidos a filtrar.
Anda bien pero no te deja discriminar. Por ejemplo filtra «Redes Sociales» pero el termino es muy grande y termina cometiendo errores. Si tildas por ejemplo «File Sharing» los audios de Whatsapp no se envian.
Entonces para evitar este tipo de problemas lo que hacemos es armar nuestro script que marque por nombre de dominio.

Te deja utilizar los filtros de manera gratuita para 1 direccion IP por cuenta. Es decir que para 1 red nateada andaria bien. Tiene para tildar por defecto redes bogon, sitios que propagan malware, pornografia, etc.

OpenDNS

El script

Para que funcione correctamente tenemos que habilitar el cache de DNS de nuestro router y hacer resolver a nuestos clientes con los DNS del router. Luego siempre dropear el DNS input en el firewall para que no nos ataquen los DNS desde afuera.

Lo que hace el script es buscar una palabra que coincida en el nombre del dominio.

# Use DNS Entrys and add Address to the Firewall Address-list #
:foreach i in=[/ip dns cache all find where ( (name~"instagram") || (name~"facebook") || (name~"twitter") || (name~"twitch") ) && (type="A") && (data!=0.0.0.0) ] do={
:local tmpAddress [/ip dns cache get $i data];
delay delay-time=10ms;
# prevent script from using all cpu time #
:if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={ 
:local cacheName [/ip dns cache get $i name] ;
#:log info ("added entry: $cacheName $tmpAddress");
/ip firewall address-list add address=$tmpAddress list=RedesSociales comment=$cacheName timeout=6d;
}
}

Si se fijan donde dice:

(name~»instagram«) || (name~»facebook«) || (name~»twitter«) || (name~»twitch«)

Modificamos a nuestro antojo.

Y mas abajo le damos el nombre al Address-List:

/ip firewall address-list add address=$tmpAddress list=RedesSociales comment=$cacheName timeout=6d;

Tambien pueden modificar el timeout: Todas las direcciones nuevas que resuelva las va agregando al AddressList (en este caso las mantiene por 6 dias), esto hace que tengamos un segundo cache que se vaya limpiando cada 6 dias y las direcciones IP viejas se vayan eliminando automaticamente.

Luego solo nos queda hacer algo con ese address list. Podemso dropearlo en el firewall.
O bien crear un mangle que marque la conexion con destino a esas IP y luego usarlo en Queues.

Por ejemplo:

/ip firewall filter
add action=drop chain=forward dst-address-list=RedesSociales in-interface=bridge_alumnos
add action=drop chain=output dst-address-list=RedesSociales out-interface=bridge_alumnos

Ojo que en mi caso ademas le digo en que interfaz eliminar las redes sociales. Elijan la interfaz para su caso.

origen: tech-nico.com

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

RouterOS DHCP Server Automático con Queues Dinámicas

Esto esta pensado para lugares de mucha «mucha» concurrencia, para no derrochar recursos. Direcciones IP y Ancho de Banda. Por supuesto que esto tiene que estar acompañado de un buen CPU (para mi caso con un equipo 2011, me fue suficiente), y también debería estar acompañado de un caudal de ancho de banda suficiente dependiendo de cada caso y el factor simultaneidad.

Funcionamiento

Se crea un DHCP server como siempre, pero en la solapa Script se le dice que a cada Lease dinamico lo convierta en estatico, y que ademas le otorgue un RATE-LIMIT de Upload y Download. (En nuestro caso configure 1 mega de subida y 3 de bajada). Esto es lo que hace toda la magia.

#tech-nico.com  CONTACTO: administracion@tech-nico.com  01-01-2022
/ip dhcp-server lease make-static [/ip dhcp-server lease find dynamic && active-server="dhcp-invitados"];
/ip dhcp-server lease set [find where active-mac-address=$leaseActMAC] rate-limit="2M/3M" insert-queue-before="bottom";

Luego deben agregar un script que limpie los Leases que queden en estado «waiting». (son clientes que no pudieron obtener direccion IP por mala señal, o bien al renovar el Lease ya no estaba ese dispositivo en el sitio).

/ip dhcp-server lease remove [/ip dhcp-server lease find status="waiting" && server="dhcp-invitados"];

Nicolas Daitsch
Tech-nico.com

RouterOS Script – Agregar rango de direcciones estaticas en IP Address.

Hoy me cruce con alguien que necesitaba ayuda y arme este Script como para volver con algo de actividad al blog (que de hecho lo tengo muy abandonado).

Se le da un rango de Red, luego la direccion de Inicio y la de Fin. Ademas por supuesto, la mascara de subred. Y eso es todo!.

# Por Tech-nico.com 28/01/2022
:local RED "192.168.3"
:local IPINICIO "70"
:local IPFIN  "80"
:local MASK "/32"
:local INTERFAC  "bridge_ether"
:for i from=$IPINICIO to=$IPFIN step=1 do={
     :local TEMPDIR "$RED.$i$MASK"
     /log warning "$TEMPDIR"
     /ip address add address="$TEMPDIR"  interface="$INTERFAC"
}

Automatizacion de Backups con Mikrotik y Google Drive Parte 2

En la primera parte, te enseñe como automatizar mediante un script el envio de tus backups. Ahora viene la parte divertida, «donde el google drive cobra vida». Esta segunda parte no tiene nada de Mikrotik, para ello leer la primera parte.

Esta «segunda» parte consiste en recibir el correo con un archivo adjunto (El backup), y dependiendo del asunto del email organizarlo en distintas carpetas y documentar todo en una planilla de calculo.

Como logramos esto?

Con Scripts de Google App Scripts que son muy muy poderosos y te permitirian mejorar funcionalidades en todo esto:

Nosotros lo que haremos es darle funcionalidades especiales dentro de una planilla de calculo «Sheet» que tendra funciones para:

  1. Leer el Gmail,
  2. Manipular el G.Drive
  3. y finalmente escribir el resultado en una planilla de calculo.

Pasos a seguir para implementarlo:

  1. Nos logueamos en la misma cuenta de gmail que utilizamos en la primera parte (donde estarian llegando los backups). Yo les recomiendo que lo hagan en una ventana de incognito.
  2. Luego como se muestra en la imagen, click en aplicaciones, y finalmente en Hojas de calculo. O bien, luego de loguearnos vamos a esta direccion: https://docs.google.com/spreadsheets/

3. Creamos una hoja de calculo nueva. Le damos el nombre que mas nos guste:

4. Usar la primer fila para crear los encabezados para cada columna

IDFECHA SUBIDACARPETAARCHIVOURLTIPOHORA ESCRITURA

5. Ahora iremos al menu «Herramientas» > Editor de secuencias de comandos tal como muestro en la siguiente imagen:

Es lo mismo que acceder a script.google.com, con la diferencia de que aqui queda el codigo ligado a esta planilla

6. Aqui pegaremos el siguiente codigo:


/*
 * Script por Nicolas Daitsch www.tech-nico.com/blog
   30 de septiembre de 2020
 */

// GLOBALS
//Filtro de extenciones de los archivos adjuntos
var fileTypesToExtract = ['backup', 'rsc', 'gz'];
//Carpeta de google drive donde los archivos seran movidos
var folderName = 'MIS-BACKUPS';
//Etiqueta que le pondremos a los correos ya procesados
var labelName = 'read_label';
// ID de la carpeta definida en la variable "folderName"
var DocsfolderID='1kLOIsv1Co_4SA6oE838kskfPXvZUuXcZg4fH';

function GmailToDrive(){
    var query = '';
    for(var i in fileTypesToExtract){
      query += (query === '' ?('filename:'+fileTypesToExtract[i]) : (' OR filename:'+fileTypesToExtract[i]));
    }
    query = 'in:inbox has:nouserlabels ' + query;
    var threads = GmailApp.search(query);
    var label = getGmailLabel_(labelName); // Get Label ID
    var parentFolder,parentMyFolder,parentMySubFolder; 
    if(threads.length > 0){
      parentFolder = createFolder(folderName,DocsfolderID); // Si la carpeta existe, traer el ID
    }
    var root = DriveApp.getRootFolder();
    for(var i in threads){
        var mesgs = threads[i].getMessages();
        for(var j in mesgs){
              var subject = mesgs[j].getSubject();
              var subject_array = subject.split("//");
              if(subject_array.length<2) { 
                 threads[i].addLabel(label); 
              }else{ 
                  var subject_folder = subject_array[0];
                  var subject_subfolder = subject_array[1];
                
                  var attachments = mesgs[j].getAttachments();
                  for(var k in attachments){
                      var attachment = attachments[k];
                      var isDefinedType = checkIfDefinedType_(attachment);
                      if(!isDefinedType) continue;
                      var attachmentBlob = attachment.copyBlob();
                      var file = DriveApp.createFile(attachmentBlob);
                      var nom_archivo="";
                      nom_archivo = attachment.getName();

                      parentMyFolder = createFolder(subject_folder,parentFolder.getId());
                      parentMySubFolder = createFolder(subject_subfolder,parentMyFolder.getId());

                      parentMySubFolder.addFile(file);
                      var files = [];
                      files.push({ id:file.getId(), fecha:file.getDateCreated(), carpeta: subject, archivo: file.getName(), url:file.getUrl(), tipo:file.getMimeType()});
                      printInSheet2(files[0])

                      root.removeFile(file);
                  }
              }
            
        }
        threads[i].addLabel(label); // set as just read
    }
}

function getGmailLabel_(name){
  var label = GmailApp.getUserLabelByName(name);
  if(!label){
	label = GmailApp.createLabel(name);
  }
  return label;
}

function checkIfDefinedType_(attachment){
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length-1].toLowerCase();
  if(fileTypesToExtract.indexOf(fileExtension) !== -1) return true;
  else return false;
}


function createFolder(Name,folderID){
  
  var PF = DriveApp.getFolderById(folderID);
  if(Name==folderName){ return PF; }
  
  var subFolders = PF.getFolders();
  var doesntExists = true;
  var newFolder = '';
  
  while(subFolders.hasNext()){
    var folder = subFolders.next();
    if(folder.getName() === Name){
      doesntExists = false;
      newFolder = folder;
      return newFolder;
    };
  };
  
  if(doesntExists = true){
    newFolder = PF.createFolder(Name);
    return newFolder;
  };
};



function printInSheet2(objeto) {
  var today = (Utilities.formatDate(new Date(), "GMT-3", "dd-MM-yyyy")).toString();
  var today_hora = (Utilities.formatDate(new Date(), "GMT-3", "HH:mm")).toString();
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var sheet = ss.getSheetByName(today);
  if (!sheet){
    SpreadsheetApp.setActiveSheet(ss.getSheets()[0]); 
  
    ss.duplicateActiveSheet(); 
    ss.renameActiveSheet(today); 
    ss.moveActiveSheet(1); 
    // Prepares tab (clears old content)
    var sheet = ss.getSheetByName(today); 
    sheet.getRange('A2:G200').clearContent(); // clean
    sheet.getRange('A2:G200').setBackground(null);
  }

  var found = sheet.getRange(1,1,sheet.getLastRow()).createTextFinder(objeto["id"]).matchCase(false).findNext(); 
  if ( found==null ){ // only write if any cell content not match with de file ID
      var data, sheet = SpreadsheetApp.getActiveSheet();
      data = [
        objeto["id"],
        objeto["fecha"],
        objeto["carpeta"],
        objeto["archivo"],
        objeto["url"],
        objeto["tipo"],
        today_hora
      ];
      sheet.appendRow(data);
   }
};

La Magia:

Nos quedaria algo asi:

7. Solo tendremos que editar primeras 4 variables, y son obligatorias la creacion de la carpeta MIS-BACKUPS o como quieras llamarla. Al crearla, obtenemos el ID de la carpeta que necesitamos definir en la ultima variable (tambien obligatoria), como muestro a continuacion:

En una nueva solapa vamos a https://drive.google.com/

Presionamos NUEVO:

Elegimos Carpeta:

Finalmente le damos click derecho «Obtener Enlace»

Copiamos el ID, Asegurense de que este completo porque es mas largo de lo que se ve en la captura:

8. Ahora ya podemos ejecutar el codigo y probar si funciona: Volver a la ventana de script.google.com y ejecuta el codigo eliguendo la funcion GmailToDrive y seguidamente presionar el boton Play

Finalmente les va a pedir que le den permisos de lectura para acceder al gmail, drive, etc.

Por supuesto que si no hay correos en tu casilla no va a procesar nada. Y ademas que si el asunto no respeta la doble barra para separar el nombre de la carpeta con la fecha, el mail no va a ser procesado. Si el correo es procesado lo marca con la etiqueta de leido «read_label»:

Finalemente revisamos en nuestro drive la creacion de las carpetas y en la planilla que deberia aparecer el resumen del archivo en solapas por fecha, para que si buscamos entre muchos backusp de una fecha especifica, lo podamos encontrar super rapido!.

9. Para agregar el script a un calendario de ejecucion y que corra el proceso de manera automatica, lo que tenemos que hacer es crear un nuevo Trigger o Activador:

Añadir Activador:

Yo lo configure asi: (Ustedes pueden setearlo a su gusto)

No hace falta que les diga que pueden utilizar este mismo script para recibir backups de Linux, Mikrotik, Windows, o cualquier dispositivo que sea capaz de enviar un mail con un archivo adjunto.

Espero que les haya gustado tanto como a mi, y cualquier cosa que no se entienda puedo armar un video-tutorial.

Saludos
_______________
Por Nicolas en tech-nico.com/blog

Mikrotik: Como direccionar trafico PPPoE por interfaz (sin balancear): 3 WAN / 3 LAN

No quiero extenderme explicando por que tuve que elegir esta configuracion, pero si quiero decir que fue una solucion muy buena en su momento. Por supuesto que tienen que darse condiciones muy similiares para que te sirva hacer lo mismo. Pero somos tantos en el mundo que seguro mi aporte puede ayudar a otros. 🙂

Escenario

3 LAN (OLT), cada una en una VLAN distinta, los usuarios conectan por PPPoE a cada VLAN y se routean a un WAN especificio.
Son 3 WAN de 100 Mb c/u. Los clientes hacen NAT en cada interfaz LAN. La clave de todo es generar dinamicamente listas de direcciones IP de los abonados en el momento que conectan y se desconectan.

A continuación paso a detallar cada bloque de comandos

A cada una de mis salidas las voy a nombrar Fortinet 1,2 y 3. (Asi se llaman los firewall que suele instalar telefonica en uno de sus servicios)

/ip firewall mangle
add action=mark-connection chain=input comment=UPLOAD in-interface=vlan_fortinet1 new-connection-mark=input1_connection passthrough=yes
add action=mark-routing chain=output connection-mark=input1_connection new-routing-mark=route_fortinet1 passthrough=no
add action=mark-connection chain=input in-interface=vlan_fortinet2 new-connection-mark=input2_connection passthrough=yes
add action=mark-routing chain=output connection-mark=input2_connection new-routing-mark=route_fortinet2 passthrough=no
add action=mark-connection chain=input in-interface=vlan_fortinet3 new-connection-mark=input3_connection passthrough=yes
add action=mark-routing chain=output connection-mark=input3_connection new-routing-mark=route_fortinet3 passthrough=no
add action=mark-routing chain=prerouting comment="ROUTING OLT 3 por FOTINET 3" new-routing-mark=route_fortinet3 passthrough=no src-address-list=\
OLT_service3
add action=mark-routing chain=prerouting comment="ROUTING OLT 2 por FOTINET 2" new-routing-mark=route_fortinet2 passthrough=no src-address-list=\
OLT_service2
add action=mark-routing chain=prerouting comment="ROUTING OLT 1 por FOTINET 1" new-routing-mark=route_fortinet1 passthrough=no src-address-list=\
OLT_service1

Estas son las rutas de cada salida. Deberas reeemplazar el gateway por los tuyos. Cada salida tiene su propia tabla de routeo.
Esto hace que puedas hacer traceroute desde afuera o desde adentro y no se confunda de ruta.

Hay una ruta que no tiene marca. Es la que yo elijo por defecto. (Es decir que nuestro router va a preferir esa ruta).

/ip route
add comment="gw fortinet 2" distance=3 gateway=200.2.2.105 routing-mark=route_fortinet2
add comment="gw fortinet 1" distance=2 gateway=200.1.1.137 routing-mark=route_fortinet1
add comment="gw fortinet 3" distance=4 gateway=200.3.3.97 routing-mark=route_fortinet3
add comment="default gw fortinet 2" distance=10 gateway=200.2.2.105
/ip route rule
add action=lookup-only-in-table routing-mark=route_fortinet1 table=route_fortinet1
add action=lookup-only-in-table routing-mark=route_fortinet3 table=route_fortinet3
add action=lookup-only-in-table routing-mark=route_fortinet2 table=route_fortinet2

Esta es la parte de de NAT, no hay mucho para ver. Cada interfaz LAN hace mascarade con las direcciones que se almacenan con el Script -PPP-On_up On_down. Veras mas abajo como se crean.

/ip firewall nat
add action=masquerade chain=srcnat comment="mascarading RED LOCAL" out-interface=vlan_fortinet1 src-address-list=OLT_service1 src-address-type=""
add action=masquerade chain=srcnat comment="mascarading RED LOCAL" out-interface=vlan_fortinet2 src-address-list=OLT_service2 src-address-type=""
add action=masquerade chain=srcnat comment="mascarading RED LOCAL" out-interface=vlan_fortinet3 src-address-list=OLT_service3 src-address-type=""

Cada PPPoE server tiene un nombre de servicio especifico: mas abajo se van a dar cuenta por que. En este caso son: «service1», «service2», y «service3». (Recordar esos nombres)

/interface pppoe-server server
add authentication=pap disabled=no interface=sfp-sfpplus1_olt1 keepalive-timeout=5 one-session-per-host=yes service-name=service1
add authentication=pap disabled=no interface=sfp-sfpplus2_olt2 keepalive-timeout=5 one-session-per-host=yes service-name=service2
add authentication=pap disabled=no interface=sfp-sfpplus3_olt3 keepalive-timeout=5 one-session-per-host=yes service-name=service3

Para poder routear los clientes correctamente necesitamos separar las direcciones IP de los tuneles PPP que se conecten, en 3 listas (address-lists) distintas. (una por cada LAN o en este caso OLT).
En PPP Profile (solapa) Scripts On-UP / On-DOWN. Esto hace que cuando conecta el PPPoE ponga su direccion remota en una lista con el nombre de la interfaz por donde esta conectando. En este caso OLT1, 2 o 3.
A continuacion, estos 2 pequeños comandos, se fijan de que pppoe server esta pidiendo este usuario conectar o desconectar. Entonces con la variable «caller-id» traemos el nombre del servicio desde donde se conecta. Como mencionamos anteriormente, «service1», «service2», y «service3».

La parte donde ocurre la magia

En cada perfil de ancho de banda tienes que ingresar a editar en las solapas donde dice On_up y On_Down y pegar los siguientes 2 scripts: (Tiene partes con comillas dobles, dejarlas tal cual).

ON UP
/ip firewall address-list add list="OLT_$"called-id"" address=$"remote-address"

ON DOWN
/ip firewall address-list remove [find list="OLT_$"called-id"" address=$"remote-address"]

No se por que algunas veces el On-UP Script faya, entonces la direccion IP de ese cliente no queda dentro de la lista OLT_serviceX y eso hace que ese cliente no tenga navegacion, ya que en Firewall NAT hacemos masqarading por listas. Realmente no tuve tiempo de descubir por que lo hacia. Entonces decidi hacer un script al que denomine PPP-SYNC-FIXER compara las direcciones IP de los tuneles PPP conectados con las listas de IP. Si no encuentra alguna de las direcciones, pateo el usuario para obligarlo a reconectar. El script se ejecuta cada 2 minutos en el calendario de ejecucion. (Bajarle el tiempo en equipos con poco procesador).

Para importar el script pegar esto en la consola y presionar enter.

/system script add dont-require-permissions=no name=PPP_SYNC_FIXER owner=soporte1 policy=\
read,write,policy,test,password,sniff,sensitive source=":log info message=\"*** comienza\
_a buscar usuarios PPP sin routeo \";\r\ \n:local arrnoestan [:toarray \"\"];\r\ \n:local pppactivos value=[/ppp active find];\r\ \n:local indice 1;\r\ \n:foreach usuario in=\$pppactivos do={\r\ \n :local direccionip value=[/ppp active get \$usuario value-name=address];\r\ \n :local busqolt1 value=[/ip firewall address-list print count-only where list=\"O\ LT_service1\" address=\$direccionip];\r\ \n :local busqolt2 value=[/ip firewall address-list print count-only where list=\"O\ LT_service2\" address=\$direccionip];\r\ \n :local busqolt3 value=[/ip firewall address-list print count-only where list=\"O\ LT_service3\" address=\$direccionip];\r\ \n :if ((\$busqolt1=0) && (\$busqolt2=0) && (\$busqolt3=0)) do={\r\ \n# :set arrnoestan ( \$arrnoestan, \$direccionip );\r\ \n :log info message=\"I \$indice IP \$direccionip - no encontrada --- PATEAN\ DO\";\r\ \n /ppp active remove \$usuario;\r\ \n }\r\ \n :set indice (\$indice + 1);\r\ \n}\r\ \n#:log info message=\" fin de script ***\";\r\
\n#:log info message=\"\$arrnoestan\";\r\
\n"

Para importar el scheduler pegar esto en la consola:

/system scheduler
add interval=2m name=Corro_fixer_PPP on-event="/sys script run PPP_SYNC_FIXER" policy=read,write,policy,test,password,sniff,sensitive \
start-date=dec/30/2019 start-time=21:38:15

Automatizacion de Backups con Mikrotik y Google Drive Parte 1

1) CONFIGURAR sNTP Client

Para que nuestro backup se ejecute correctamente lo primero es que nuestro RouterOS se mantenga siempre con la hora correcta por mas que se reinicie. Entonces pegamos esto en la consola:

/system ntp client
set enabled=yes primary-ntp=216.239.35.12

Solo aceptaremos en nuestro firewall el servidor NTP de google, ya que estos puertos suelen estar dentro de los mas atacados. Para ellos pegamos nuevamente lo siguiente en la consola:

/ip firewal filter
add action=accept chain=input comment="NTP Admitir solo a time.google.com" dst-port=123 protocol=tcp src-address=\
216.239.35.12
add action=accept chain=input dst-port=123 protocol=udp src-address=216.239.35.12
add action=drop chain=input dst-port=123 protocol=udp

2) CONFIGURAR E-MAIL

Las siguientes lineas corresponden al seteo del servicio de correo. La direccion IP es de smtp.google.com: Lo editas en tu notepad reemplazando tu contraseña y la direccion de correo y lo pegamos en la consola:

/tool e-mail
set address=172.217.192.109 from= password="TU_CONTRASEÑA_FUERTE" port=587 start-tls=yes user=\
TUMAIL@GMAIL.com

NOTA IMPORTANTE: recorda que Gmail bloquea el envio de mails de cualquier aplicacion externa (que se considera poco segura) como por ejemplo Outlook, (y cualquier otros), y por supuesto el envio de mails a traves de RouterOS. Para resolverlo loggearse con la cuenta que usaran para backups y luego hacen click en el siguiente este enlace: https://myaccount.google.com/lesssecureapps

Cambiar de NO a SI

3) PROBAR EL ENVIO DE EMAIL

Para saber si el envio es correcto probamos el envio desde consola con la siguiente linea:

/tool e-mail send to="TUMAIL@GMAIL.com" subject="soy tech-nico backups"

4) IMPORTAR SCRIPTS DE BACKUPS

A continuacion tenemos 2 scripts que debemos pegar en la consola (previo a editar la direccion de e-mail). El primer script envia el binario completo. «.backup» y el segundo script envia un export completo «.rsc». Por ahora no editen el asunto porque es importante mantener el doble slash «//». (en la parte 2 te daras cuenta del por que). Recueden que al pegar en la consola hay que presionar enter.

/system script add name=backup_binary source={/system backup save name=([/system identity get name] . "-" . \
[:pick [/system clock get date] 7 11] . [:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6]); \
/tool e-mail send to="TUMAIL@GMAIL.com" subject=([/system identity get name] . "_BACKUP//" . \
[/system clock get date]) file=([/system identity get name] . "-" . [:pick [/system clock get date] 7 11] . \
[:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".backup"); :delay 10; \
/file rem [/file find name=([/system identity get name] . "-" . [:pick [/system clock get date] 7 11] . \
[:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".backup")]; \
:log info ("System Backup emailed at " . [/sys cl get time] . " " . [/sys cl get date])}

Y este otro:

/system script add name=backup_export source={/export file=([/system identity get name] . "-" . \
[:pick [/system clock get date] 7 11] . [:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6]); :delay 2; \
/tool e-mail send to="TUMAIL@GMAIL.com" subject=([/system identity get name] . "_BACKUP//" . \
[/system clock get date]) file=([/system identity get name] . "-" . [:pick [/system clock get date] 7 11] . \
[:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc"); :delay 10; \
/file rem [/file find name=([/system identity get name] . "-" . [:pick [/system clock get date] 7 11] . \
[:pick [/system clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc")]; \
:log info ("System Backup emailed at " . [/sys cl get time] . " " . [/sys cl get date])}

5) AGREGARLO AL CALENDARIO DE EJECUCION

Y finalmente lo ejecutamos cada 5 dias. O como ustedes prefieran. Esto hara que se envien 2 mails. 1 con el .backup y el otro con el export .rsc.

/system scheduler
add interval=5d name=backup_binary on-event="/sys script run backup_binary" policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=aug/03/2020 start-time=16:35:00
add interval=5d name=backup_export on-event="/sys script run backup_export" policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=aug/03/2020 start-time=16:35:00


En la segunda parte de este post te enseñare como volcar estos mails a un Google Drive.

Port Forwarding VPN L2TP con Mikrotik

La semana pasada instale un rack para fibra al hogar en Rolon – La Pampa, y me encontre con la particularidad de que el carreir entrega una sola direccion IP Publica, para lo cual tuve que hacer Port Forwarding de la VPN.

Hace mucho tiempo que no escribo y no por que no quiera, siempre es por cuestiones de tiempo. Me siento obligado a tener que postearlo porque la proxima vez que lo necesite se que ademas de compartirlo con los demas, me lo estoy compartiendo conmigo mismo.

En este caso se trata de un Router de Border que presta el servicio de acceso a internet los clientes de fibra al hogar. (es decir que actua como router haciendo NAT, entre otras cosas). Y detras de este, otro router haciendo de VPN. Con lo cual tenemos encadenados un router detras de otro.

Escenario actual, de doble NAT (de Izquierda a Derecha)

Este tipo de setup tiene 1 inconveniente:

Antes de seguir con la configuracion, es fundamental que aclaremos que el estar haciendo hairpinin (o forwarding) de una VPN hace que el origen que ve tu VPN Server es siempre el primer equipo, en este caso el de Border (ver imagen superior). Es decir que si hay un usuario con una VPN activa, otra VPN no deberia poder conectarse, o hasta incluso puede suceder que se caiga el tunel existente y entre el nuevo. Para mitigar este problema pueden probar desactivar el tilde «One session per host» en tu configuracion de VPN Server. En mi caso L2TP Server. No es la mejor de las soluciones pero puede funcionar.

Reglas de NAT para el primer NAT: Border.

add action=dst-nat chain=dstnat comment="VPN L2TP Forwarding" dst-address=[TU IP PUBLICA] dst-port=4500 protocol=udp to-addresses=\
192.168.77.2 to-ports=4500
add action=dst-nat chain=dstnat dst-address=[TU IP PUBLICA] dst-port=1701 protocol=udp to-addresses=192.168.77.2 to-ports=1701
add action=dst-nat chain=dstnat dst-address=[TU IP PUBLICA] dst-port=500 protocol=udp to-addresses=192.168.77.2 to-ports=500
add action=dst-nat chain=dstnat dst-address=[TU IP PUBLICA] dst-port=2218 protocol=tcp to-addresses=192.168.77.2 to-ports=2218
add action=dst-nat chain=dstnat dst-address=[TU IP PUBLICA] protocol=ipsec-esp to-addresses=192.168.77.2

Luego reemplacen [TU IP PUBLICA] por la direccion IP publica que usan para navegar a través de NAT. Y reemplazar 192.168.77.2 por el direccionamiento IP interna que le dieron al equipo que haga de VPN. Se supone que la regla de Masqarade del Pool de IP de los abonados deberia estar puesta si tenes este mismo escenario. (no esta entre estas reglas)

Reglas para el segundo NAT, VPN Server

add action=masquerade chain=srcnat comment="default configuration" src-address=192.168.77.1

Misma aclaracion que anteriormente, siempre que el equipo este en modo router aqui se agrega la regla de masqarede para el pool de IP que usemos en el bridge o LAN. (En este caso no esta).

Realmente desearia poder postear mas seguido, tengo algunas cosas en mi lista, como Domotica, Automatizaciones en casa, Algo de programacion con WordPress, algo de monitoreo con ubiquiti, Etc.
Ahora que estamos en cuarentena deberia poder organizarme y lograr subir algun video.

Mis saludos a todos los hispanos!!.

_____
Primero en tech-nico.com

Winbox en MacOS Catalina (con Wine)

Si actualizaste a la version Catalina (como yo), seguramente te quedaste sin Wine (la aplicacion que emula y ejecuta archivos .exe de windows) para ejecutar winbox.exe.

En Catalina ya no se puede ejecutar aplicaciones de 32 bits, pero podes ejecutarlas todavia en 64.

Descargas winbox64 desde la web oficial de Mikrotik: https://mt.lv/winbox64

En mi caso lo que hice fue:

brew cask install xquartz 
brew cask install wine-stable

Luego para poder ejecutarlo cada vez que encendemos la maquina apuntamos las rutas de wine con variables de entorno:

chsh -s /bin/zsh 
sudo vi ~/.zprofile 

Y le pegamos las rutas:

export PATH="/Applications/Wine Stable.app/Contents/Resources/wine/bin:$PATH"

export FREETYPE_PROPERTIES="truetype:interpreter-version=35"

export DYLD_FALLBACK_LIBRARY_PATH="/usr/lib:/opt/X11/lib:$DYLD_FALLBACK_LIBRARY_PATH"

Para abrir ejecutamos:

wine64 /Applications/winbox64.exe

Finalmente si queremos ejecutarlo desde el escritorio con un acceso directo, abrimos Automator, Utilities, Run AppleScript, pegamos lo siguiente y luego lo exportamos a escritorio.

export PATH="/Applications/Wine Stable.app/Contents/Resources/wine/bin:$PATH"
export FREETYPE_PROPERTIES="truetype:interpreter-version=35"
wine64 /Applications/winbox64.exe

Saludos

Mikrotik Nslookup para IPv6

Para poder diagnosticar correctamente, este es el comando para hacer un nslookup con distintos DNS IPv6 desde la ventana de comandos de winbox:

put [:resolve facebook.com server=2001:4860:4860::8844]
put [:resolve facebook.com server=2001:4860:4860::8888]
put [:resolve facebook.com server=2606:4700:4700::1111]

Por supuesto, tenes que tener hecha la configuracion de IPv6 para que responda correctamente.

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!!

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

API MIKROTIK [Updated] Graficar Interfaces o Queues en tiempo real con Highcharts y PHP

Nueva Versión Actualizada

Todos lo que leyeron la primera versión de «Graficar trafico de interfaces en tiempo real con Highcharts y PHP«, aquí les traigo la nueva versión con bastantes fixes que detallo a continuación:

  • Actualización de la librería de que conecta con el API de Denis Basta desde la versión 1.4  a la versión 1.6.
  • Actualizacion de la libreria Highcharts, pasando de v3.0.5 a v6.1.1. (ultima hasta el dia de hoy 30/05/18).
  • Se agrego un parámetro para graficar Interfaces o Queues a elección.
  • Se agrego función para formatear correctamente los bytes y mostrar bien los bytes, megas, etc.
  • Cambio de estilos y colores por unos mas amigables.

La configuración es la misma que en el post anterior.

Espero que les guste!.

Descargar Ejemplo de Graficar interfaces o queues en tiempo real version 2.0

______________

Primero en tech-nico.com

RouterOS Tip con TLS-Host – Identificar clientes accediendo a sitios HTTPS

Identificando quienes de nuestra red accedieron a Netflix

Hola a todos, Esteban menciono en los comentarios del post identificar trafico HTTPS con tls-host, como hacer para crear una lista con las direcciones de los clientes que accedieron a sitios HTTPS bloqueados o no permitidos en la Red. En mi ejemplo, hago una lista con todos los que acceden a Netflix.

En mi ejemplo, veras que la lista es dinámica y la IP del cliente queda registrada con un timeout de 24 horas, que vos podrás modificar a tu elección.

El ejemplo es muy muy básico y solo requiere de conocimiento de RouterOS, pero nunca esta de mas:

Pegar esta linea desde la consola:

 /ip firewall filter add action=add-src-to-address-list address-list=clientes_netflix address-list-timeout=none-static chain=forward comment=\ "Agrego a una lista todos los clientes que acceden a Netflix" protocol=tcp tls-host=*.netflix.com address-list-timeout=24h 

NOTA:
Si estas filtrando tenes que arrastrar esta regla justo arriba de la que hace drop.

 

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)