Code: Select all
:local version [/system resource get version];
:local versionp1 nil;
:local versionp2 nil;
:local versionp3 nil;
:local posesp nil;
:local pospun1 nil;
:local pospun2 nil;
:set posesp [:find $version " " -1];
:if ([:typeof $posesp] != "nil") do={
:set version [ :pick $version 0 $posesp ];
};
:set pospun1 [:find $version "." -1];
:set pospun2 [:find $version "." $pospun1];
:if ([:typeof $pospun1] != "nil") do={
:set versionp1 [:pick $version 0 $pospun1];
} else={
:set versionp1 $version;
};
:if ([:typeof $pospun1] != "nil" && [:typeof $pospun2] != "nil") do={
:set versionp2 [:pick $version ($pospun1+1) $pospun2];
} else={
:if ([:typeof $pospun1] != "nil" && [:typeof $pospun2] = "nil") do={
:set versionp2 [:pick $version ($pospun1+1) [:len $version]];
}
};
:if ([:typeof $pospun2] != "nil") do={
:set versionp3 [:pick $version ($pospun2+1) [:len $version]];
};
:if ( $versionp1 < 7 ) do={
:put ( "La version de Router OS debe ser mayor o igual a la 7.0 " );
:put ( "Tu router tiene la version ".$version." de Router OS." );
:put ( "La version de Router OS no es valida para hacer instalacion.");
:exit
} else={
:put ( "Version de Router OS ". $version. " valida para hacer instalacion.");
};
/interface/ethernet/set [ find name="ether1" ] \
name="WAN1"
/interface/ethernet/set [ find name="ether2" ] \
name="WAN2"
/interface/bridge/add fast-forward=no name="bridgeLAN"
/interface/list
add name=LAN
add name=WAN
/interface/list/member
add interface="bridgeLAN" list=LAN
add interface="WAN1" list=WAN
add interface="WAN2" list=WAN
/ip/dns/set allow-remote-requests=yes servers=8.8.4.4
/ip/address/add address=192.168.88.0/24 interface="bridgeLAN" network=192.168.88.0
/routing/table/add name="to_ISP1" fib;
/routing/table/add name="to_ISP2" fib;
/ip/firewall/mangle
add action=accept chain=prerouting \
dst-address=192.168.250.250 \
in-interface-list=LAN comment="fo_ip_gw1"
add action=accept chain=prerouting \
dst-address=192.168.250.250 \
in-interface-list=LAN comment="fo_ip_gw2"
add action=mark-connection chain=prerouting connection-mark=no-mark \
in-interface="WAN1" new-connection-mark=ISP1_conn
add action=mark-connection chain=prerouting connection-mark=no-mark \
in-interface="WAN2" new-connection-mark=ISP2_conn
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local \
in-interface-list=LAN new-connection-mark=ISP1_conn \
per-connection-classifier=both-addresses:2/0
add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local \
in-interface-list=LAN new-connection-mark=ISP2_conn \
per-connection-classifier=both-addresses:2/1
add action=log chain=prerouting log=no comment=fo_bandera_pcc disabled=yes
add action=mark-routing chain=prerouting connection-mark=ISP1_conn \
in-interface-list=LAN new-routing-mark=to_ISP1 passthrough=no
add action=mark-routing chain=prerouting connection-mark=ISP2_conn \
in-interface-list=LAN new-routing-mark=to_ISP2 passthrough=no
add action=mark-routing chain=output connection-mark=ISP1_conn \
new-routing-mark=to_ISP1 passthrough=no
add action=mark-routing chain=output connection-mark=ISP2_conn \
new-routing-mark=to_ISP2 passthrough=no
/ip/firewall/nat
add action=masquerade chain=srcnat out-interface-list=WAN comment="NAT para los paquetes que salgan por las interfaces WAN"
[:parse "/ip/route/add distance=1 gateway=\"192.168.251.251%WAN1\" \
routing-table=\"to_ISP1\"; "]
/ip/route/add dst-address=0.0.0.0/0 routing-table=main pref-src=0.0.0.0 gateway=8.8.8.8 \
check-gateway=ping distance=1 scope=30 target-scope=11 suppress-hw-offload=no \
comment="fo_isp1mon"
/ip/route/add dst-address=8.8.8.8 routing-table=main gateway=192.168.1.1 \
distance=1 scope=10 target-scope=10 suppress-hw-offload=no \
comment="fo_isp1gtw"
[:parse "/ip/route/add distance=1 gateway=\"192.168.251.251%WAN2\" \
routing-table=\"to_ISP2\"; "]
/ip/route/add dst-address=0.0.0.0/0 routing-table=main pref-src=0.0.0.0 gateway=8.8.8.8 \
check-gateway=ping distance=1 scope=30 target-scope=11 suppress-hw-offload=no \
comment="fo_isp2mon"
/ip/route/add dst-address=8.8.8.8 routing-table=main gateway=192.168.2.1 \
distance=1 scope=10 target-scope=10 suppress-hw-offload=no \
comment="fo_isp2gtw"
/ip/dhcp-client
add add-default-route=no dhcp-options=hostname,clientid disabled=no interface="WAN1" script=\
("\r\
\n:local gateway [/ip/dhcp-client get [find interface=\"WAN1\"] gateway];\r\
\n/ip/route \r\
\nset [ find routing-table=\"to_ISP1\" ] gateway=\"\$gateway%WAN1\"; \r\
\nset [ find comment=\"fo_isp1gtw\" ] gateway=\"\$gateway\"; \r\
\n/ip/firewall/mangle \r\
\nset [ find comment=\"fo_ip_gw1\" ] dst-address=\$gateway;")
/ip/dhcp-client
add add-default-route=no dhcp-options=hostname,clientid disabled=no interface="WAN2" script=\
("\r\
\n:local gateway [/ip/dhcp-client get [find interface=\"WAN2\"] gateway];\r\
\n/ip/route \r\
\nset [ find routing-table=\"to_ISP2\" ] gateway=\"\$gateway%WAN2\"; \r\
\nset [ find comment=\"fo_isp2gtw\" ] gateway=\"\$gateway\"; \r\
\n/ip/firewall/mangle \r\
\nset [ find comment=\"fo_ip_gw2\" ] dst-address=\$gateway;")
/system/identity/set name="Balanceador PCC"
/system/script
add name=failoverConfig owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
\_Correo electr\F3nico del administrador al que llegaran las notificacione\
s de ISPs caidos\r\
\n:global foCorreoAdministrador \"pe.17110377@gmail.com\";\r\
\n\r\
\n# Bandera que indica si se van a enviar correos de notificacion \"si\"/\
\"no\"\r\
\n:global foEnvioEmailsNotificacion \"si\";\r\
\n\r\
\n# Definici\F3n de ISPs y capacidades proporcionales\r\
\n:global foIsps {{1;1};{2;1}; };\r\
\n\r\
\n# Relacion de ISPs con Interfaces\r\
\n:global foRelIspInterfaz {{1;\"WAN1\"};{2;\"WAN2\"};};\r\
\n\r\
\n\r\
"
add name=failover owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=("#######################################\
####\r\
\n# Script Failover para router con N ISPs\r\
\n###########################################\r\
\n\r\
\n# Carga de la configuracion\r\
\n/system/script/run failoverConfig;\r\
\n\r\
\n\r\
\n# Declaraci\F3n de variables principales\r\
\n:global foIspsCaidos {nil};\r\
\n:global foIspsCaidosAnt;\r\
\n:global foIspsAnt;\r\
\n:global foIpDNS;\r\
\n:global foIsps;\r\
\n:global foRelIspInterfaz;\r\
\n\r\
\n:local nIsps [:len \$foIsps];\r\
\n:local pasos 0;\r\
\n:local id;\r\
\n:local interfaz;\r\
\n:local inactive;\r\
\n\r\
\n\r\
\n\r\
\n# Inicializaci\F3n de los ISP antiguos\r\
\n:if ([:typeof \$foIspsAnt]=\"nothing\") do={ :set foIspsAnt \$foIsps; }\r\
\n\r\
\n# Inicializaci\F3n de los ISP caidos anteriormente\r\
\n:if ([:typeof \$foIspsCaidosAnt]=\"nothing\") do={ :set foIspsCaidosAnt {nil}; }\r\
\n\r\
\n\r\
\n\r\
\n# Actualizacion de las capacidades de los ISPs\r\
\n:if (\$foIsps != \$foIspsAnt) do={ /system/script/run failoverActualizadorCapacidadesISPs; }\r\
\n\r\
\n\r\
\n\r\
\n# Proceso de pruebas de conexi\F3n a internet por los distintos ISPs\r\
\n:foreach rel in=[\$foRelIspInterfaz] do={\r\
\n :set id (\$rel->0);\r\
\n :set interfaz (\$rel->1);\r\
\n :set inactive [/ip/route/get [/ip/route/find comment=\"fo_isp\$id\".\"mon\"] inactive];\r\
\n\r\
\n # Si el monitor está inactivo, entonces el ISP está caido y se agrega a la lista de foIspsCaidos
\n :if (\$inactive) do={ :set (\$foIspsCaidos->\"\$id\") \$id; } \r\
\n}\r\
\n\r\
\n\r\
\n# Compara los ISPs caidos actualmente contra los ISPs caidos previamente\r\
\n# Si son iguales evita ejecutar por completo el script\r\
\n:if ( \$foIspsCaidos = \$foIspsCaidosAnt) do={ :exit; }\r\
\n\r\
\n\r\
\n# Si hubo cambios entre los ISPs activos actualmente y los anteriores\r\
\n# se procede a hacer acutalizaci\F3n en las reglas mangle,\r\
\n# liberar y reiniciar los clientes dhcp de las interfaces wan,\r\
\n# en la ruta por defecto y se env\EDa notificaci\F3n de los ISPs caidos\r\
\n\r\
\n# Liberacion y reinicio de los clientes dhcp de interfaces wan\r\
\n/system/script/run failoverDhcpClientRelease;\r\
\n\r\
\n# Actualizador de reglas Mangle\r\
\n/system/script/run failoverActualizadorReglasMangle;\r\
\n\r\
\n\r\
\n######################################################################\r\
\n# Si se llega a este punto es por que hubo cambios en los ISPs caidos\r\
\n######################################################################\r\
\n/system/script/run failoverNotificadorIspsCaidos;\r\
\n\r\
\n\r\
\n# Actualizaci\F3n de los ISPs caidos anteriormente\r\
\n:set foIspsCaidosAnt (\$foIspsCaidos);\r\
\n\r\
\n#:log info \"Fin failover-script\";\r\
\n\r\
\n")
add name=failoverActualizadorCapacidadesISPs owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
\_Actualizador de capacidades de ISPs\r\
\n\r\
\n:global foIsps;\r\
\n:global foIspsAnt;\r\
\n:global foIspsCaidosAnt;\r\
\n\r\
\n:local idpcc [/ip/firewall/mangle/find comment=\"fo_bandera_pcc\"];\r\
\n:local pasos;\r\
\n\r\
\n# Eliminaci\F3n de las reglas pcc inservibles, a excepci\F3n de la fo_ba\
ndera_pcc\r\
\n:local idsReglasPcc [/ip/firewall/mangle/find per-connection-classifier~\
\"both-addresses\" and comment!=\"fo_bandera_pcc\"];\r\
\n\r\
\n:foreach id in=[\$idsReglasPcc] do={\r\
\n /ip/firewall/mangle/remove [find .id=\$id];\r\
\n}\r\
\n\r\
\n# Calculo de los pasos totales\r\
\n:set pasos 0;\r\
\n:foreach isp in=[\$foIsps] do={\r\
\n :set pasos (\$pasos + (\$isp->1));\r\
\n}\r\
\n\r\
\n# Registro de las nuevas reglas pcc en funci\F3n de los ISPs\r\
\n:local indiceMaestro 0;\r\
\nforeach isp in=[\$foIsps] do={\r\
\n :for i from=1 to=(\$isp->1) step=1 do={\r\
\n :local idIsp (\$isp->0);\r\
\n /ip/firewall/mangle/add action=mark-connection chain=prerouting \
connection-mark=no-mark dst-address-type=!local in-interface-list=LAN \
new-connection-mark=(\"ISP\".\$idIsp.\"_conn\") \
per-connection-classifier=(\"both-addresses:\".\$pasos.\"/\".\$indiceMaestro) \
\r\
\n :set indiceMaestro (\$indiceMaestro+1);\r\
\n }\r\
\n}\r\
\n\r\
\n# Movimiento de las reglas pcc a su nueva posici\F3n para mantener la pr\
ioridad\r\
\n:set idsReglasPcc [/ip/firewall/mangle/find per-connection-classifier~\"\
both-addresses\"];\r\
\n:foreach idRegla in=[\$idsReglasPcc] do={\r\
\n if (\$idRegla != \$idpcc ) do={\r\
\n /ip/firewall/mangle/move [find .id=\$idRegla] destination=\$idpc\
c\r\
\n }\r\
\n}\r\
\n\r\
\n\r\
\n# Actualizaci\F3n de los ISP anteriores\r\
\n:set foIspsAnt \$foIsps;\r\
\n:log info \"Se actualizaron las capacidades de los ISPs\";\r\
\n\r\
\n"
add name=failoverActualizadorReglasMangle owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
\_Actualiador de reglas Mangle\r\
\n\r\
\n:global foIsps;\r\
\n:global foIspsCaidos;\r\
\n\r\
\n:local pasos;\r\
\n:local pasosTmp;\r\
\n:local estaCaido;\r\
\n:local idIsp;\r\
\n:local idsReglas;\r\
\n:local disabledtmp;\r\
\n:local idsTmp;\r\
\n\r\
\n\r\
\n# Calculo de los pasos totales\r\
\n:set pasos 0;\r\
\n:foreach isp in=[\$foIsps] do={\r\
\n :set estaCaido false;\r\
\n\r\
\n :foreach ispCaido in=[\$foIspsCaidos] do={\r\
\n :if (\$isp->0=\$ispCaido) do={\r\
\n :set estaCaido true;\r\
\n }\r\
\n }\r\
\n\r\
\n :if (\$estaCaido=false) do={\r\
\n :set pasos (\$pasos + (\$isp->1));\r\
\n }\r\
\n}\r\
\n#:log info \$pasos;\r\
\n\r\
\n\r\
\n:set pasosTmp 0;\r\
\n:foreach isp in=[\$foIsps] do={\r\
\n :set estaCaido false;\r\
\n :set idIsp (\$isp->0);\r\
\n\r\
\n :foreach ispCaido in=[\$foIspsCaidos] do={\r\
\n :if ((\$isp->0)=\$ispCaido) do={\r\
\n :set estaCaido true;\r\
\n }\r\
\n }\r\
\n\r\
\n # Si el ISP est\E1 ACTIVO se procede a actualizar las reglas con los \
\"pasos\" correctos\r\
\n :if (\$estaCaido=false) do={\r\
\n # Obtenci\F3n de los IDs de las reglas del ISP con new-connection-ma\
rk\r\
\n :set idsReglas [/ip/firewall/mangle/find new-connection-mark=\"ISP\$\
idIsp_conn\" and per-connection-classifier~\"both-addresses\" and comment!\
=\"fo_bandera_pcc\"];\r\
\n\r\
\n # Por cada ID de la regla se procede a asignar el total de pasos y e\
l n\FAmero de paso correspondiente\r\
\n :foreach idRegla in=[\$idsReglas] do={\r\
\n /ip/firewall/mangle/set [find .id=\$idRegla] per-connection-classi\
fier=\"both-addresses:\$pasos/\$pasosTmp\"\r\
\n\r\
\n #Incremento del contador de pasosTmp\r\
\n :set pasosTmp (\$pasosTmp + 1);\r\
\n }\r\
\n\r\
\n # Activaci\F3n de las reglas del ISP activo\r\
\n :set idsTmp [/ip/firewall/mangle/find new-connection-mark=\"ISP\$idI\
sp_conn\" and per-connection-classifier~\"both-addresses\" and comment!=\"\
fo_bandera_pcc\"];\r\
\n :foreach idtmp in [\$idsTmp] do={\r\
\n :set disabledtmp [/ip/firewall/mangle/get \$idtmp disabled];\r\
\n :if ( \$disabledtmp = true ) do={\r\
\n /ip/firewall/mangle/enable \$idtmp;\r\
\n }\r\
\n }\r\
\n }\r\
\n\r\
\n # Si el ISP est\E1 CAIDO se procede a desactivar las reglas\r\
\n :if (\$estaCaido=true) do={\r\
\n :set idsTmp [/ip/firewall/mangle/find new-connection-mark=\"ISP\$idI\
sp_conn\" and per-connection-classifier~\"both-addresses\" and comment!=\"\
fo_bandera_pcc\"];\r\
\n :foreach idtmp in [\$idsTmp] do={\r\
\n :set disabledtmp [/ip/firewall/mangle/get \$idtmp disabled];\r\
\n :if ( \$disabledtmp = false ) do={\r\
\n /ip/firewall/mangle/disable \$idtmp;\r\
\n }\r\
\n }\r\
\n }\r\
\n}\r\
\n\r\
\n"
add name=failoverDhcpClientRelease owner=admin \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
source="# Script que se encarga de liberar y reiniciar el cliente DHCP\r\
\n# para las interfaces WAN que han vuelto a tener servicio de internet\r\
\n:global foIsps;\r\
\n:global foIspsCaidos;\r\
\n:global foIspsCaidosAnt;\r\
\n:global foRelIspInterfaz;\r\
\n\r\
\n# Se obtienen los ISPs que estan activos actualmente\r\
\n:foreach k,isp in=[\$foIsps] do={\r\
\n :local idIsp (\$isp->0);\r\
\n # Si el ISP no est\E1 caido y estuvo caido anteriormente\r\
\n :if ( [:len (\$foIspsCaidos->\$idIsp)] = 0 && [:len (\$foIspsCaidosAnt\
->\$idIsp)] != 0) do={\r\
\n /ip/dhcp-client/release [find interface=((\$foRelIspInterfaz->\$k)->\
1)];\r\
\n };\r\
\n};\r\
\n"
add name=failoverNotificadorIspsCaidos owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=("#\
\_Notificador de ISPs caidos\r\
\n\r\
\n# Variables globales\r\
\n:global foIspsCaidos;\r\
\n:global foIspsCaidosAnt;\r\
\n:global foCorreoAdministrador;\r\
\n:global foEnvioEmailsNotificacion;\r\
\n\r\
\n:local cadIspsCaidos \"\";\r\
\n:local tiempo;\r\
\n:local fecha;\r\
\n:local bndEnvioNotificacion false;\r\
\n:local identidad [/system identity get name];\r\
\n\r\
\n# Impresi\F3n de los ISPs caidos en el Log\r\
\n:if ( \$foIspsCaidos = {nil} ) do={\r\
\n :log warning \"Todos los ISPs se encuentran activos\";\r\
\n}\r\
\n\r\
\n:if ( \$foIspsCaidos != {nil} ) do={\r\
\n # Impresi\F3n de los ISPs caidos\r\
\n :foreach idIsp in=[\$foIspsCaidos] do={\r\
\n :if ( [:typeof \$idIsp] = \"num\" ) do={\r\
\n :log warning \"ISP\$idIsp est\E1 caido\";\r\
\n :set cadIspsCaidos (\$cadIspsCaidos.\",\".\$idIsp);\r\
\n }\r\
\n }\r\
\n}\r\
\n\r\
\n\r\
\n\r\
\n# Si la bandera de env\EDo de emails de notifaci\F3n est\E1 activa, ento\
nces\r\
\n# se env\EDa el e-mail de notificaci\F3n de ISPs caidos\r\
\n:if ( \$foEnvioEmailsNotificacion = \"si\" ) do={\r\
\n\r\
\n # Envio de correo de notificacion de ISP Caido\r\
\n :if ( \$foCorreoAdministrador != \"\" ) do={\r\
\n :set tiempo [/system/clock/get time];\r\
\n :set fecha [/system/clock/get date];\r\
\n\r\
\n # Env\EDo de correo\r\
\n :if ( \$cadIspsCaidos = \"\" ) do={\r\
\n /tool/e-mail/send to=\$foCorreoAdministrador subject=\"Route\
r Balanceador \$identidad\" body=\"El \$fecha a las \$tiempo todos los ISP\
\_estan activos\" tls=starttls;\r\
\n }\r\
\n\r\
\n :if ( \$cadIspsCaidos != \"\" ) do={\r\
\n /tool/e-mail/send to=\$foCorreoAdministrador subject=\"Route\
r Balanceador \$identidad\" body=\"El \$fecha a las \$tiempo los ISP \$cad\
IspsCaidos se encuentran caidos\" tls=starttls;\r\
\n }\r\
\n\r\
\n :log info \"Se envi\F3 la notificaci\F3n\";\r\
\n :delay 1;\r\
\n }\r\
\n\r\
\n :if ( \$foCorreoAdministrador = \"\" ) do={\r\
\n :log info \"No se envi\F3 la notificaci\F3n porque la variable f\
oCorreoAdministrador esta en blanco\";\r\
\n }\r\
\n}\r\
\n\r\
\n\r\
\n")
add name=lanzadorFailover owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\
\_Script que se encarga de verificar que el failover\r\
\n# no se est\E9 ejecutando previamente para evitar duplicidad de trabajos\
\r\
\n\r\
\n# Obtenci\F3n del ID del failover\r\
\n:local idJobEjecucion [/system/script/job/find script=failover];\r\
\n\r\
\n# Si el script est\E1 en ejecuci\F3n evita lanzar por segunda vez el scr\
ipt\r\
\n:if (\$idJobEjecucion!=\"\" ) do={ :end; }\r\
\n\r\
\n# Si no se est\E1 ejecutando previamente se lanza el script\r\
\n/system/script/run failover\r\
\n"
/system/scheduler
add interval=10s name=foSchedule1 on-event=lanzadorFailover policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-date=jan/01/1970 start-time=00:00:00