Vous êtes sur la page 1sur 3

#:log info "Script failover para router con 4 ISPs";

#Script modificado de Livaur


:global ispsCaidosAnt;
# ESTE SCRIPT HACE PING A 3 SERVIDORES DIFERENTES
#
# {{ID:nPasos}; {ID:nPasos}};
#
#En la siguiente variable, favor de MODIFICAR la interfaz que corresponde a cada
uno de sus ISP
#notese que yo tengo mis ISPs de ether2 a ether5, si ustedes los tienen diferente
ponerlo aqui
:local isps {{1;1;"ether2"}; {2;1;"ether3"}; {3;1;"ether4"};{4;1;"ether5"};
:local pasos 0;
:local ispsCaidos;

# Cantidad de pruebas ping que se lanzaran a la IP externa para determinar si


# el ISP está caido
:local nPruebasPing 3;

# IP de DNS a donde se lanzan las pruebas de ping


# En este caso se usa una IP de OpenDNS
:local ipExterna "1.0.0.1";
:local ipExterna2 "8.8.4.4";
:local ipExterna3 "208.67.222.222";

# Inicialización de los ISP caidos anteriormente


:if ([:typeof $ispsCaidosAnt]="nothing") do={ :set ispsCaidosAnt {nil}; }

# Inicialización de los ISPs caidos


:if ([:typeof $ispsCaidos]="nothing") do={ :set ispsCaidos {nil}; }

# Proceso de pruebas de conexión a internet por los distintos ISPs


:foreach isp in=[$isps] do={
#:log info ($isp->1);
:local indiceIsp ($isp->0);
:local interfc ($isp->2);
# Primero monitorea el trafico de la interface, si es mayor a 500 kb evita hacer
los pings;

:local monitor [/interface monitor-traffic $interfc as-value once];


:local KBSpeedRX (($monitor->"rx-bits-per-second")/1000);

:if ($KBSpeedRX < 500) do={


:log info "Se está haciendo ping en $interfc porque su tráfico es menor a 500kb";
:local rping [/ping $ipExterna routing-table="to_ISP$indiceIsp"
count=$nPruebasPing];
:delay 100ms;
:local rping2 [/ping $ipExterna2 routing-table="to_ISP$indiceIsp"
count=$nPruebasPing];
:delay 100ms;
:local rping3 [/ping $ipExterna3 routing-table="to_ISP$indiceIsp"
count=$nPruebasPing];

# Si la respuesta de ping fue 0, entonces el ISP está caido y se agrega a la


lista de ispsCaidos
:if ($rping+$rping2+$rping3=0) do={
:set ($ispsCaidos->"$indiceIsp") $indiceIsp;
:log info "ISP$indiceIsp caido";
}
} else={ :log info "No se hizo ping en $interfc porque muestra trafico regular";}
}

# Compara los ISPs caidos actualmente contra los ISPs caidos previamente
# Si son iguales evita ejecutar por completo el script
:if ( $ispsCaidos = $ispsCaidosAnt) do={
:exit;
}
# Si son diferentes, se actualizan los ispsCaidosAnt
:if ( $ispsCaidos != $ispsCaidosAnt ) do={
:set ispsCaidosAnt ($ispsCaidos);
#Enviar un correo para avisar que la lista de Isp caidos ha cambiado
/tool e-mail send start-tls=yes to="rogerdzul88@gmail.com" subject="Actualizacion
de ISPs Caidos" body="Lista de nuevos ISPs Caidos: \n $ispsCaidosAnt";

# Cálculo de los pasos totales


:foreach isp in=[$isps] do={
:local estaCaido false;

:foreach ispCaido in=[$ispsCaidos] do={


:if ($isp->0=$ispCaido) do={
:set estaCaido true;
}
}

:if ($estaCaido=false) do={


:set pasos ($pasos + ($isp->1));
}
}
#:log info $pasos;

# Desactivacion de las mark_connection de ISPs caidos


:foreach isp in=[$ispsCaidos] do={
/ip firewall mangle disable [find new-connection-mark="ISP$isp_conn" and per-
connection-classifier~"both-addresses"];
}

# Actualización de los pasos en función de los ISPs activos


:local pasosTmp 0;
:foreach isp in=[$isps] do={
:local estaCaido false;
:local idIsp ($isp->0);

:foreach ispCaido in=[$ispsCaidos] do={


:if (($isp->0)=$ispCaido) do={
:set estaCaido true;
}
}

# Si el ISP no está caido se procede a actualizar las reglas con los "pasos"
correctos
:if ($estaCaido=false) do={
# Desactivar las reglas del ISP activo para hacer la actualizacion
/ip firewall mangle disable [find new-connection-mark="ISP$idIsp_conn" and per-
connection-classifier~"both-addresses"];

# Obtención de los IDs de las reglas del ISP con new-connection-mark


:local idsReglas [/ip firewall mangle find new-connection-mark="ISP$idIsp_conn"
and per-connection-classifier~"both-addresses"];

# Por cada ID de la regla se procede a asignar el total de pasos y el número de


paso correspondiente
:foreach idRegla in=[$idsReglas] do={
/ip firewall mangle set [find .id=$idRegla] per-connection-classifier="both-
addresses:$pasos/$pasosTmp"

#Incremento del contador de pasosTmp


:set pasosTmp ($pasosTmp + 1);
}

# Activación de las reglas del ISP activo


/ip firewall mangle enable [find new-connection-mark="ISP$idIsp_conn" and per-
connection-classifier~"both-addresses"];
}
}

:log info "Fin failover-script";

Vous aimerez peut-être aussi