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

RouterOS Script para limpiar amarre de Mac en Secrets PPP

Tenemos desarrollado un sistema que hace el amarre de MacAddress automaticamente al aplicar un cambio de velocidad. Es decir, si en el momento de aplicar la velocidad, el cliente esta conectado, capturamos ese mac y lo aplicamos al Secret junto con su nueva velocidad; de lo contrario aplica velocidad sin amarre.

Hay casos en que esto puede ser molesto, y para evitar llamadas innecesarias arme este mini script para limpiar los mac una vez al dia. (la frecuencia dependera de cada caso).

Script:

/system scheduler
add interval=1d name=limpiar_mac_secret on-event=\
    "/ppp secret set [/ppp secret find caller-id!=\"\"] caller-id=\"\"" policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=jun/13/2023 \
    start-time=05:00:57

Desde: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

IPV6 en RouterOS v7.5

Desde que actualice mi router de casa a IPV6 nunca pude tener V6. Para volver a la version 6 hay que poner el equipo en estado recovery e instalar los paquetes con NetInstall. Lo cual no tenia ganas de hacer. Asi que cada Update que salia en las versiones Beta los fui instalando. Recien hoy (paso mas de un año). En la version 7.5 RC1 veo que al fin comenzo nuevamente a funcionar. Note la resolucion de nombres V6 muy lenta, pero vamos a seguir probando.

Hace mucho que no posteo nada, alguien me lee?. Suban la manito o comenten. ¿Alguno usando V6?.

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"
}

Como chequear si un Raspberry Pi tiene bajo voltaje

Aca estoy!, (despues de tanto tiempo sin escribir), en este caso tengo montado un servidor web en un Raspberry PI. Esta online desde hace 2 años, y desde hace unos dias quedaba freezado a un par de horas de reiniciarlo.

El «Micro Server» esta corriendo un webserver con Nginx y Php y esta sirviendo un sitio web muy sencillo. Sorpresivamente el raspberry viene con ethernet de 1 Giga, asi que aprovechamos para montar un speedtest local para medir internamente.
Como el servidor quedo configurado con conectividad Ipv4 e Ipv6 hicimos un speedtest acorde para poder medir velocidades en V6 ya que los existentes estan en paises muy alejados y no dan resultados muy certeros.

Utilizamos un speedest opensource y lo modificamos para adaptarlo a nuestras necesidades


La razon principal de mudar este sitio a un Raspberry fue principalmente la reduccion del consumo energetico para que el UPS del rack sea mas eficiente.

Las fuentes de alimentacion de este tipo de equipos se van degradando progresivamente (son micro USB de 5 Volt 5,2 Amp, como las de celular). Con lo cual no hay ningun parametro visual o error evidente.

Diagnostico:

El equipo encendia y funcionaba un par de horas aleatoreamente.
La fuente no mostraba signos de mal-funcionamiento.

Solucion

Es evidente que lo primero que hariamos es cambiar la fuente. Pero en mi caso no estaba completamente seguro si era o no el origen del problema. Entonces para asegurarme encontre los siguientes comandos para diagnosticar voltaje.

sudo apt-get install libraspberrypi-bin
vcgencmd get_throttled

Si la respuesta es 0x0 es porque esta todo bien! 🙂
Si la respuesta es 0x50000 tenes o tuviste problemas de voltaje desde el ultimo encendido
Si la respuesta es 0x80000 tenes problemas de temperatura.

Logs

Logre encontra un error en los logs buscando de la siguiente manera:

sudo cat /var/log/syslog | grep "voltage"

Deberia arrojar resultados similares a esto:

kern  :crit  : [ 1701.464833 <    2.116656>] Under-voltage detected! (0x00050005)

Espero que les sirva tanto como a mi.

Saludos

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:

Clonar MAC en equipos Ubiquiti Airmax

Hace muchos años había intentado clonar el MAC Address de un equipo sin tener éxito. Y de hecho ya había dejado de intentarlo porque en los foros dice que no es posible, o que se puede en las versiones XM volviendo el Firmware a una version obsoleta (5.3 a 5.5) y que incluso logrando clonarlo era de manera temporal. (lo cual tambien me servia para salir del paso). Tambien rumores de que si esta como Bridge y no como Router no se puede clonar. (estimo se deben referir solamente al MAC del puerto Ethernet).

Cuando se rompe un AP que tiene clientes asociados con el MAC del AP «fijado» te encontras en el problema de que tendras que recorrer cliente por cliente para limpiar ese MAC o bien asociarlo a un nuevo AP (con nuevo MAC).

Por suerte la necesidad desesperada de encontrar una solución me hizo probar profundamente distintas alternativas (quien tiene tiempo y ganas de recorrer 40 domicilios entre urbanos y rurales?).

Cual es a solución?

La solución implica loguearse por SSH al equipo. En este caso lo hice remotamente en mi AP ya en funcionamiento. Una vez adentro de la consola del equipo, lo que hacemos es escribir los siguientes comandos para crear un script personalizado en el area de inicio del dispositivo: (reemplazar el MAC address por el que quieras)

echo "ifconfig ath0 down" >> /etc/persistent/rc.poststart
echo "ifconfig br0 down" >> /etc/persistent/rc.poststart
echo "ifconfig wifi0 down" >> /etc/persistent/rc.poststart
echo "ifconfig ath0 hw ether DC:9F:DB:0C:E9:50" >> /etc/persistent/rc.poststart
echo "ifconfig br0 hw ether DC:9F:DB:0C:E9:50" >> /etc/persistent/rc.poststart
echo "ifconfig wifi0 hw ether DC:9F:DB:0C:E9:50" >> /etc/persistent/rc.poststart
echo "ifconfig wifi0 up" >> /etc/persistent/rc.poststart
echo "ifconfig ath0 up" >> /etc/persistent/rc.poststart
echo "ifconfig br0 up" >> /etc/persistent/rc.poststart
chmod +x /etc/persistent/rc.poststart
cfgmtd -w -p /etc/
touch /etc/persistent/ct
reboot

Nuestro equipo tiene version XW 6.1. Por lo que no hizo falta hacer downgrade.

Una vez que el equipo se termina de reiniciar, ingresar nuevamente por SSH y editar el archivo /tmp/system.cfg. Buscar las siguientes lineas y editar o agregar las que haga falta.

netconf.2.devname=ath0
netconf.2.status=enabled
netconf.2.hwaddr.mac=DC:9F:DB:0C:E9:50  
netconf.2.hwaddr.status=enable

El nro 2, es el indice de la interface. Ese numero viene definido por defecto en cada equipo, te conviene buscar si existe esta linea primero netconf.2.devname=ath0 para luego identificar el nro correspondiente en tu caso. Estimo depende si tenes el equipo seteado como Bridge/Router, o si tenes definidas algunas VLAN.

Una vez editado, vuelves a la consola y escribes:

save
reboot

Listo!! tu equipo debería volver con el MAC modificado. En mi caso, para que los clientes disquen el tunel PPPoE tuve que desactivar el Airmax. Al menos ya tenes administración de los equipos cliente para quitarles el MAC viejo.

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

Navegar con DNS por HTTPs en Mikrotik

A partir de las ultimas versiones de RouterOS, ya viene la posibilidad de habilitar los DNS seguros o mejor dicho DoH (DNS over HTTPS). De esta manera se terminan los ataques de envenenamiento tu tabla cache de DNS o de algun tipo de manipulacion como se suelen hacer con ataques de paquetes interceptados o «Man in the middle».

Para usarlos, tu proveedor de DNS tiene que tener la posiblidad de utilizar DNS de este tipo. Les dejo los comandos para los DNS de Cloudflare.

Si estas usando DNS para hacer filtros por DNS en tu red, (como los de OpenDNS) en ese caso tene en cuenta que los filtros te van a dejar de funcionar. A no ser que OpenDNS adopte DoH (por el momento lo desconozco).

Estos son los comandos para el setup:

/ip dns set servers=1.1.1.1,1.0.0.1
/system ntp client set enabled=yes server-dns-names=time.cloudflare.com
/tool fetch url=https://curl.haxx.se/ca/cacert.pem
/certificate import file-name=cacert.pem passphrase=""
/ip dns set use-doh-server=https://1.1.1.1/dns-query verify-doh-cert=yes
/ip dns set servers=""

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.

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

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

Probar Droplets de Digital Ocean por 2 meses gratis

Testeando Maquinas virtuales en Digital Ocean

Para todos los que se registren con este link, tendran U$S 10 de credito.

https://m.do.co/c/565eb7f74a91

Cuando se registren, les va a pedir que ingresen los datos de su tarjeta de crédito. (Don’t worry, hay que ingresarlos y no te cobran hasta que no gastes tus U$S 10).

Digital Ocean es un Cloud Hosting que ha tenido crecimiento exponencial este ultimo tiempo. Los productos que tienen en la nube son muy fáciles de usar, muy flexibles y lo que marca la diferencia es que dan almacenamiento SSD.

Ellos tienen maquinas estándar pre-configuradas, que llaman «Droplets». Esos droplet varían el precio en base a su configuración de procesadores, memoria, disco, etc.

Con tus U$S 10 Dolares tienen para probar 1 de estos 2 Droplets:

MEMORY CPU SSD DISK TRANSFER PRICE
1 GB 1 vCPU 25 GB 1 TB $5/mo
$0.007/hr
2 GB 1 vCPU 50 GB 2 TB $10/mo
$0.015/hr

Asombroso es el hecho de que también te cobran por hora de uso. Es decir que si estas haciendo pruebas o deseas ir conociendo de a poco podes apagar la maquina virtual para que te cobren por hora de uso. Con lo cual veras que U$S 0.007 dolares por hora (en el Droplet mas económico) es MUY MUY BAJO!!.

Ellos te dan acceso SSH a la consola, Podes elegir distros pre-configuradas, por ejemplo (PHP MySQL PhpMyAdmin), O alguna con WordPress ya corriendo.

Espero que se entusiasmen y hagan durar sus U$S 10 de crédito por lo menos 1 año 🙂

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.

 

Tip MySQL: DUMP – Volcando por tablas

TIP MYSQL

Como exportar tablas de mysql por consola:

Hay veces en que si la base de datos se hace muy grande podemos tener la necesidad de exportarla por partes. Este ejemplo lo use para exportar una base de datos mysql de WordPress, con lo cual la tabla «Posts» era la mas pesada de todas,

# exportar solo la tabla posts
mysqldump -uUSUARIO -pCLAVE BaseDeDatos prefix_posts > dump0.sql

# exportar el resto de las tablas ignorando la tabla posts
mysqldump -uUSUARIO -pCLAVE BaseDeDatos –ignore-table=BaseDeDatos.prefix_posts > dump1.sql

Netonix POE Switch Firmware 1.4.9 y UNMS (ubiquiti)

Resumen de Netonix y UNMS de ubiquiti

NETONIX:

Estoy haciendo una muy rara combinación, pero asi se dieron las cosas, estos dos productos se tenían que conocer. Hace 2 años que estoy usando los switches de Netonix. Son nuevos en el mercado por lo que han ido corrigiendo errores a medida que los reporta la comunidad.

Son switches muy versátiles, y funcionan de maravilla, ademas de ser Gigabit y tener puerto SFP permite hacer bonding de 2 puertos SFP para conectarlos al Router de border y tener failover o doble capacidad de negociacion.

Ubiquiti  Network management system (UNMS)

Estoy realmente encantado con el software de gestion que estan desarrollando, todavia falta un monton pero en el Roadmap se ven cosas muy prometedoras. Ademas me encanta que se pueda dar soporte a cualquier tipo de equipo de ubiquiti, desde camaras hasta routers, Airmax, linea AC o las nueva linea de equipos GPON llamda UFiber.

El software te permite ver estadísticas de latencia / señal,  y hacer actualizaciones masivas de firmware sin importar que modelo sea el equipo. Tiene su propia base de datos de Binarios, con lo cual el upload del binario lo hace dentro de la red local y es super rápido.

Ademas permite hacer descargas masivas de backups. Te hace un ZIP con las configuraciones de toda tu red en unos minutos.

Otra cosa genial es que este desarrollado con NodeJS, y pueda notificarte los push de las tareas que va iniciando o terminando. También tiene un programador de tareas pero no te deja configurar tareas y horarios específicos. (todavía esta en pleno desarrollo).  Tiene una versión Mobile muy buena que facilita la tarea de los instaladores, y le falta pero la veo muy prometedora.

Por otro lado vi que cuando ingresas a un equipo Airmax, tiene muchas opciones del menu que estan «en progreso…», solo podes ver datos y estadisticas y hacer backups.  En el Roadmap del 2018 prometen  tener la parte de Networking y Wireless para el segundo cuatrimestre. 🙂

En mi humilde opinión con el desarrollo de AirControl se quedaban cortos para administrar y daba muchísimos problemas en todo sentido, (nunca pude hacer un discovery)  incluso desde que lo conozco que esta en Beta. Esta es una herramienta que permite como opcional la gestion en Cloud de casi toda su linea de productos de ubiquiti.

Pueden probar el demo desde aqui!.

Problemas entre Discovery Manager Tool(UBNT) y Netonix

El Firmware nuevo 1.4.9 resuelve un problema que tuve probando un servidor UNMS (Ubiquiti network management system) . Al querer realizar un Discovery de dispositivos (iniciar un escaneo en todos mis bloques de IP) el switch se congelaba haciendo que se caigan todas las sesiones pppoe.

Consultando el foro de soporte de Netonix me dijeron que actualizara a la ultima version del firmware, cosa que hice y tampoco me resolvió el problema.

Pero por suerte otros colegas se sumaron a mi reclamo y finalmente confirmaron que era un bug por resolver. En cuestion de dias lanzaron otro binario que resuelve el inconveniente.

We have discovered an issue with our Discovery TAB with UBNT newer firmware.
Eric has fixed the Discovery TAB and will release v1.4.9 later this week

Por lo que estimo el Discovery terminaba haciendo un spoofing que llenaria la tabla ARP del switch haciendo que muera. Con que poco se puede caer toda una red verdad?.

Saludos a todos.
________________
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 &gt;= $ms) do={
#Send mail
/tool e-mail send server=&lt;Server IP&gt; port=25 user=&lt;user&gt; password=&lt;pass&gt; 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"

solucionar DNS_PROBE_FINISHED_NO_INTERNET

Para resolver este «fucking problem» tenemos que ejecutar unos comandos en la consola con privilegios de administradores;

ALTERNATIVA (A): escribir los comandos manualmente.

Paso 1 ) suponiendo que tenemos windows 7 u 8 vamos a inicio, y en el cuadro de busqueda escribimos «cmd». Luego en los resultados hacemos click derecho y elegimos «ejecutar como administrador«.

 

Paso 2) escribimos: ipconfig /flushdns (y presionamos enter)

Paso 3) escribimos: netsh winsock reset (y presionamos enter)

Paso 4) reiniciamos la PC y cruzamos los dedos.

PASOS ADICIONALES (OPCIONAL por si no funciona lo anterior)

Paso a) escribimos: ipconfig /release (y presionamos enter)

Paso b) escribimos: ipconfig /renew (y presionamos enter)

EDITADO (09/09/2015):
Agrego este video que alguien ha hecho siguiendo mi tutorial. OJO: en el video hay menos pasos y falta el paso 1 «ejecutar como administrador».

ALTERNATIVA (B): Crear y ejecutar un script:

En escritorio, creamos un nuevo Documento de texto en Notepad. Y luego pegamos esto en su interior:

@echo off
cls

echo "limpiando la tabla de dns local..."
ipconfig /flushdns
ping -n 4 localhost > null 

echo "reseteando winsock..."
netsh winsock reset
echo "Reinicie sistema AHORA!!!!......."
pause

Guardamos el archivo, luego cerramos el Notepad y le cambiamos la extencion «.txt» por «.bat». Finalmente, click derecho ejecutar como administrador.

Espero que les sirva tanto como a mi, que perdi 4 valiosas horas de mi vida hasta que logre que funcione.
____________________
Publicado por Nicolas
Primero en www.tech-nico.com

API MIKROTIK – Agregar una dirección al firewall address-list

En esta ocasión, les traigo algo muy usado por todos los mikroteros. Los address-list que siempre nos han facilitado las cosas. He visto ejemplos en otros sitios webs intentando manejarlas, y hasta incluso códigos copiados/editados de este blog (sin poner la fuente), pero claro, sin funcionar :p. Bueno, aca lo tienen!.

<?php require_once('api_mt_include2.php'); ?>
<?php
/*
/// AUTOR: Tech-Nico.com ///
/// admin@tech-nico.com /////
/// API: Firewall Address-list: agrego una direccion IP a un address-list
/// Fecha: 26/08/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
$address= "5.4.3.1";  // direccion que cargaremos en el address-list
$list=    "FACEBOOK";  // nombre de la lista donde cargaremos la direccion 
$comment= "Este es un ejemplo de tech-nico.com"; // comentario
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){ 
            echo "Error: Ya existe " . $list ." con la direccion: ".$address;
        }else{ // si no existe lo creo
            $API->write("/ip/firewall/address-list/add",false);
            $API->write('=address='.$address,false);   // IP
            $API->write('=list='.$list,false);       // lista
            $API->write('=comment='.$comment,true);  // comentario
            $READ = $API->read(false);
            $ARRAY = $API->parse_response($READ);
            echo "Se agrego la direccion " . $address ." a la lista: ".$list;
        }
        $API->disconnect();
    }
}
?>

Por favor, pongan la fuente si van a copiar y pegar en otro sitio.!!

_________________
Primero en tech-nico.com

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 – Haciendo ping desde tu herramienta de monitoreo con PHP

A pedido de (ahora un colaborador del blog) Alejando Mogollon, voy a postear un código muy sencillo para mostrar el ping desde tu router Mikrotik RouterOS hacia la dirección IP que quieras testear para que agregues a tu App, o simplemente potencies tus herramientas de monitoreo y soporte técnico. Este es el resultado:

api_ping
En este caso, (para testear) desenchufe el cable del port WAN de mi router.

Solo debemos setear como siempre los valores del Router y en este caso las variables $ping_address y $ping_count.

//////// configura tus datos
$ipRouteros ="192.168.100.1"; //ip_de_tu_API
$Username ="api_usuario"; //usuario_API
$Pass ="#pass"; //contraseña_API
$Port = 8727; //puerto_API
$ping_address = "8.8.8.8"; // ip a pingear que puede venir de un formulario
$ping_count = 5; // cantidad de pings que quiero ejecutar.

IMPORTANTE: Agregarle permisos «test» al grupo del usuario que estes usando para conectar. De lo contrario va a tirar un error de permisos.

Descargar ejemplo aqui.
______________________
publicado primero en tech-nico.com

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

Instalar WIFI HP p1102w en Win 7 64bit

En esta impresora laser, una de sus mejores funciones es poder tenerla conectada sin el cable USB, es decir por WiFi. Al parecer, Windows 7 64 bits, te la instala para poder usarla mediante USB, pero no reconoce el Wifi.

Síntoma:
En la instalación se queda esperando que conectes el USB para configurar la parte wireless pero nunca sucede.

Solución:
Instalarla desde otra PC con Windows X86 (32bit). Asi de sencillo.!!
Ejecutas la utilidad que viene en el CD y elegis la opcion instalacion wireless. (configuracion inalambrica).
Si no tenes el CD descargas la utilidad «LJP1100_P1560_P1600_Full_Solution.exe» desde el sitio oficial de HP. http://support.hp.com/ar-es/product/HP-LaserJet-Pro-P1102-Printer-series/4110394/model/4110306

_______________
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

Como bootear tus antiguas aplicaciones para Ms-DOS en CD o USB «Bien Facil»

En este paso a paso, vamos a ver como crear un disco booteable en CD para levantar tu viejo sistema hecho para correr en DOS.

Tendremos el beneficio de que emularemos el floppy disk «driver A» por medio del BIOS (unidad 0). Utilizaremos un software que se llama BCD/BFD con el agregado de algunos driver de CDROOM para que permita ademas bootear en dispositivos SCSCI.

Paso 1, descomprimimos esto (descargar).

Paso 2, pegamos los archivos y/o carpetas de nuestro viejo software en la ruta: tech-nico_boot\cds\cdromsi\files\

Paso 3, vamos a la consola de windows. —- Inicio – Ejecutar – cmd

Paso 4, nos movemos con «cd» a la carpeta «tech-nico_boot»

command

Paso 5, Ejecutamos el comando «bcd cdromsi»

Paso 6, si queremos grabar el ISO en un CD presionamos «Enter» y ponemos un CD en blanco (el mismo software se ocupa de grabarlo), y si no lo queremos quemar en CD y solo nos interesa el ISO, miramos cual es la ruta del ISO y lo buscamos antes de presionar cualquier tecla, ya que al presionar «A-abort» nos elimina el ISO.

iso_path

Ya tenemos nuestro disco listo para bootear. Facil no?.
Con el ISO podriamos crear un USB boot. (No lo probe pero deberia funcionar).

Como tip adicional. Si queremos que se auto ejecute un exe o bat al iniciar el CD tenemos que editar el archivo tech-nico_boot\cds\cdromsi\files\autorun.bat

Fuente: http://www.nu2.nu/

Este post se publico primero en tech-nico.com