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;
}
}
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.
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.
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.
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.
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).
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!.
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:
Interactuar con otros servicios de google como AdSense, Analytics, Calendar, Drive, Gmail, y Maps.
Construir Add-Ons para extender Google Docs, Sheets, Slides, y Forms, y publicarlos en el Add-on store
Crear chatbots
etc
Nosotros lo que haremos es darle funcionalidades especiales dentro de una planilla de calculo «Sheet» que tendra funciones para:
Leer el Gmail,
Manipular el G.Drive
y finalmente escribir el resultado en una planilla de calculo.
Pasos a seguir para implementarlo:
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.
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
ID
FECHA SUBIDA
CARPETA
ARCHIVO
URL
TIPO
HORA 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:
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.
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)
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).
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)
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:
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:
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:
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.
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.
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)
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.
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.
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.
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:
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;
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.
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ámicay 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.
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)
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)